为导入的 Kinesis 流获取 ARN

Getting an ARN for an imported Kinesis stream

我有两个嵌套的 Cloudformation 堆栈 - 第一个模板需要定义 Kinesis 流,第二个模板需要使用对该流的 ARN 的引用,作为进一步嵌套堆栈的参数。

所以我似乎需要 "export" 来自第一个模板的流,然后 "import" 它进入第二个模板(遵循关于 importing/exporting 跨堆栈值的 AWS 文档)-

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

我的导出代码 [截断] 看起来像这样 -

Outputs:
  MyKinesisStreamOutput:
    Value:
      Ref: MyKinesisStream
    Export:
      Name: my-kinesis-stream      
Resources:
  MyKinesisStream:
    Properties:
      Name:
        Ref: AppName
      ShardCount: 1
    Type: AWS::Kinesis::Stream

虽然我的导入代码 [截断] 看起来像这样 -

MyNestedStack:
  Type: AWS::CloudFormation::Stack
  Properties:
    TemplateURL: !Sub "https://s3.${AWS::Region}.amazonaws.com/my-nested-stack.yaml"
    Parameters:
      AppName: my-nested-stack
      KinesisStream:
        Fn::GetAtt:
          - Fn::ImportValue:
              my-kinesis-stream
          - Arn

但随后我收到以下 Cloudformation 错误 -

Template error: every Fn::GetAtt object requires two non-empty parameters, the resource name and the resource attribute

并怀疑我犯规了 -

For the Fn::GetAtt logical resource name, you cannot use functions. You must specify a string that is a resource's logical ID.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html

假设我正确地导出和导入 Kinesis 流,那么我应该如何获得它的 Arn 值?

我可以想到两种可能的方法:

1) Fn::GetAtt:[!ImportValue my-kinesis-stream, Arn]

抱歉阅读不够仔细

或者我更喜欢什么

2)直接导出需要的值作为输出:Value: !GetAtt MyKinesisStream.Arn

希望对您有所帮助!

当您在 Outputs 中导出某些内容时,它只是一个字符串,您不能再在导入模板中对其进行 GetAtt

您需要做的是另外导出ARN:

Outputs:
  MyKinesisStream:
    Value: !Ref MyKinesisStream
    Export:
      Name: my-kinesis-stream
  MyKinesisStreamArn:
    Value: !GetAtt MyKinesisStream.Arn
    Export:
      Name: my-kinesis-stream-arn