访问嵌套堆栈中父 Cloudformation 堆栈的名称
Accessing name of parent Cloudformation stack in nested stack
我正在使用结构如下的嵌套 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 的生成名称 - 这意味着它正在尝试访问一个不存在的存储桶。
我的问题是:如何将 master/parent 堆栈的名称传递给子堆栈?我试图将此作为参数执行,但参数值不允许使用 "Ref"(因此我无法对值执行 "Ref" : "AWS::StackName")。
感谢任何帮助!
一种选择是将堆栈名称与S3存储桶名称解耦,并将S3存储桶指定为masterTemplate堆栈中的参数,然后在Outputs
部分引用它。
在大师中:
"Outputs": {
"EnvUploadBucketName" : {
"Value" : { "Ref" : "paramEnvUploadBucketName" }
}
}
在child中:
"TemplateURL": {
"Fn::Join": [
"",
[
"https://s3.amazonaws.com/",
{ "Fn::GetAtt" : [ "masterTemplate", "Outputs.EnvUploadBucketName" ] }
"/device-specific-template-HALO-BUILD-VERSION.json"
]
]
}
在这种情况下,EnvUploadBucketName
将是上传存储桶的名称,作为 masterTemplate
堆栈的输出传递。
实际上可以使用参数将父堆栈名称传递给子堆栈:
举个例子:
parent.yml
---
AWSTemplateFormatVersion: '2010-09-09'
Resources:
ChildA:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: ...test/test-child-a.yml
Parameters:
ParentStackName: !Ref AWS::StackName
test-child-a.yml
---
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
ParentStackName:
Type: String
Resources:
TestBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref ParentStackName
我正在使用结构如下的嵌套 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 的生成名称 - 这意味着它正在尝试访问一个不存在的存储桶。
我的问题是:如何将 master/parent 堆栈的名称传递给子堆栈?我试图将此作为参数执行,但参数值不允许使用 "Ref"(因此我无法对值执行 "Ref" : "AWS::StackName")。
感谢任何帮助!
一种选择是将堆栈名称与S3存储桶名称解耦,并将S3存储桶指定为masterTemplate堆栈中的参数,然后在Outputs
部分引用它。
在大师中:
"Outputs": {
"EnvUploadBucketName" : {
"Value" : { "Ref" : "paramEnvUploadBucketName" }
}
}
在child中:
"TemplateURL": {
"Fn::Join": [
"",
[
"https://s3.amazonaws.com/",
{ "Fn::GetAtt" : [ "masterTemplate", "Outputs.EnvUploadBucketName" ] }
"/device-specific-template-HALO-BUILD-VERSION.json"
]
]
}
在这种情况下,EnvUploadBucketName
将是上传存储桶的名称,作为 masterTemplate
堆栈的输出传递。
实际上可以使用参数将父堆栈名称传递给子堆栈:
举个例子:
parent.yml
---
AWSTemplateFormatVersion: '2010-09-09'
Resources:
ChildA:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: ...test/test-child-a.yml
Parameters:
ParentStackName: !Ref AWS::StackName
test-child-a.yml
---
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
ParentStackName:
Type: String
Resources:
TestBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref ParentStackName