在嵌套堆栈

时间:2018-01-05 21:41:03

标签: amazon-web-services amazon-s3 amazon-cloudformation

我使用如下结构的嵌套Cloudformation模板:

masterTemplate - > childA - > childB

每个JSON模板文件都存储在S3中,其存储桶名称为" $ {masterStackName} -env-upload"。这可以从父模板中正常工作,我可以这样做:

"TemplateURL":  {
          "Fn::Join": [
            "",
            [
              "https://s3.amazonaws.com/",
              {
                "Ref": "AWS::StackName"
              },
              "-env-upload/device-specific-template-HALO-BUILD-VERSION.json"
            ]
          ]
        },

但是,当childA尝试执行相同的操作来启动childB模板时," AWS :: StackName"成为childA的生成名称 - 意味着它正在尝试访问不存在的存储桶。

我的问题是:如何将主/父堆栈的名称传递给子堆栈?我尝试将此作为参数,但"参考"不允许使用参数值(因此我不能做"参考":" AWS :: StackName"对于值)。

感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

事实上,可以使用参数将父堆栈名称传递给子堆栈:

这是一个例子:

<强> parent.yml

---
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  ChildA:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: ...test/test-child-a.yml
      Parameters:
        ParentStackName: !Ref AWS::StackName

<强>测试儿童a.yml

---
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  ParentStackName:
    Type: String
Resources:
  TestBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref ParentStackName

答案 1 :(得分:0)

一个选项是将堆栈名称与S3存储桶名称解耦,并将S3存储桶指定为masterTemplate堆栈中的参数,然后在Outputs部分中引用它。在

在主人:

"Outputs": {
                "EnvUploadBucketName" : {
                  "Value" : { "Ref" : "paramEnvUploadBucketName" }
                }

}

在孩子身上:

"TemplateURL":  {
          "Fn::Join": [
            "",
            [
              "https://s3.amazonaws.com/",
              { "Fn::GetAtt" : [ "masterTemplate", "Outputs.EnvUploadBucketName" ] }
              "/device-specific-template-HALO-BUILD-VERSION.json"
            ]
          ]
        }

在这种情况下,EnvUploadBucketName将是上传存储桶的名称,作为masterTemplate堆栈的输出传递。