【问题标题】:Why do I get a "No Export Named" error when using nested stacks in CloudFormation?为什么在 CloudFormation 中使用嵌套堆栈时会出现“未命名导出”错误?
【发布时间】:2021-10-15 00:07:50
【问题描述】:

我在 CloudFormation 模板中定义一个导出,以便在另一个模板中使用。

我可以看到正在 AWS 控制台中创建导出,但是第二个堆栈找不到它。

错误:

UPDATE_ROLLBACK_IN_PROGRESS with reason: No export named sandbox06-ODM-KinesisStreamArn found

template.yml

Resources:
  KinesisStream:
    Type: AWS::Kinesis::Stream
    Properties:
      ShardCount: 1
      RetentionPeriodHours: 24
      Name: !Sub ${Environment}-${Application}
Outputs:
  Topic:
    Value: !Ref Topic
  KinesisStreamArn:
    Value: !GetAtt KinesisStream.Arn
    Export:
      Name: !Sub ${Environment}-${Domain}-KinesisStreamArn

firehose.yml

KinesisFirehoseRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: firehose.amazonaws.com
            Action: sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: KinesisFirehosePolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - kinesis:*
                  - s3:*
                  - s3-object-lambda:*
                Resource:
                  - !Sub "${Bucket.Arn}/*"
                  - Fn::ImportValue: !Sub "${Environment}-${Domain}-KinesisStreamArn"

nested_template.yml

  OperationalData:
    Type: AWS::Serverless::Application
    Properties:
      Parameters:
        Environment: !Ref Environment
        Domain: OperationalData
        Application: odm
        BucketPrefix: pie
        WhiteListCidr: !Ref WhiteListCidr
        VpcId:
          Fn::ImportValue: !Sub vpc-${Environment}-VPCID
        VpcCidr:
          Fn::ImportValue: !Sub vpc-${Environment}-VPCCIDR
        Subnets:
          Fn::ImportValue: !Sub vpc-${Environment}-PrivateSubnets
      Location: ./data/odm/template.yml
      Tags:
        Environment: !Ref Environment
        Domain: odm
        Application: !Ref Application
        Developer: !Ref Developer
        DevOpsAdmin: !Ref DevOpsAdmin
        Repository: !Ref Repository
        Team: !Ref Team

  DataEngineeringData:
    Type: AWS::Serverless::Application
    Properties:
      Parameters:
        Environment: !Ref Environment
        Domain: DataEngineeringData
        Application: data-engineering
      Location: ./data/data-engineering/template.yml
      Tags:
        Environment: !Ref Environment
        Domain: DataEngineeringData
        Application: data-engineering
        Developer: !Ref Developer
        DevOpsAdmin: !Ref DevOpsAdmin
        Repository: !Ref Repository
        Team: !Ref Team

有什么问题?

【问题讨论】:

  • 这就是全部吗?这是一个嵌套堆栈是否有可能是 Antarr?
  • @ErmiyaEskandary 它们是嵌套的
  • 啊哈——这是关键,介意分享嵌套配置吗?然后我可以让你知道解决方案:)
  • 我在上面加了

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

第二个堆栈找不到它

这是因为嵌套的 CloudFormation 堆栈默认是在并行中创建的。

这意味着如果您的一个孩子堆叠 - 例如包含KinesisFirehoseRole 的堆栈 - 正在从另一个子堆栈导入输出 - 例如包含KinesisStream 的堆栈 - 那么堆栈创建将失败。

这是因为它们是并行创建的,CloudFormation 如何确保导出值在另一个创建的子堆栈正在导入时已被导出?

要解决此问题,请在包含KinesisFirehoseRole 的堆栈上使用DependsOn 属性。

这应该指向包含KinesisStream 的堆栈,因为KinesisFirehoseRole 对它有依赖关系。

DependsOn 明确此依赖关系并将确保正确的堆栈创建顺序。

这样的事情应该可以工作:

Stack-Containing-Kinesis-Firehose-Role:
   Type: AWS::CloudFormation::Stack
   DependsOn: Stack-Containing-Kinesis-Stream-Resource-Which-Outputs-KinesisStreamArn
   ...

【讨论】:

    猜你喜欢
    • 2019-10-28
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2017-11-25
    • 2020-09-17
    • 2017-05-16
    相关资源
    最近更新 更多