[英]Cloudformation nested stack template ValidationError for child-to-child parameter
我制作了一个嵌套的cloudformation父模板,然后引用了4个子模板。 当我尝试通过CLI命令aws cloudformation create-stack...
启动堆栈时,出现错误:
An error occurred (ValidationError) when calling the CreateStack
operation: Template error: instance of Fn::GetAtt references undefined
resource BatchScatterGatherSubmissionActivity
这是因为我有一个名为StepFunctionResourcesStack的子模板,其中包含BatchScatterGatherSubmissionActivity
,然后是另一个引用它的子模板EC2InstanceResourcesStack 。 我确保为后一个子模板添加一个DependsOn
子句,但是仍然出现错误。
这是StepFunctionResourcesStack :
AWSTemplateFormatVersion: '2010-09-09'
Description: step functions resources stack.
Parameters:
StackUID:
Type: String
Resources:
StatesExecutionRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service:
- !Sub states.${AWS::Region}.amazonaws.com
Action: "sts:AssumeRole"
Path: "/"
Policies:
- PolicyName: StatesExecutionPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "lambda:InvokeFunction"
Resource: "*"
MyStateMachine:
Type: "AWS::StepFunctions::StateMachine"
Properties:
#
# The StateMachine definition is substituted in with Jinja2
#
DefinitionString: !Sub
- |
{{ machine_json | indent(10) }}
- {% for item in machine_args -%}
{{ item }}
{% endfor %}
RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
# several of these:
BatchScatterGatherSubmissionActivity:
Type: "AWS::StepFunctions::Activity"
Properties:
Name:
Fn::Join: [ "-", [ "BatchScatterGatherSubmissionActivity", Ref: StackUID] ]
BatchScatterGatherPollingActivity:
Type: "AWS::StepFunctions::Activity"
Properties:
Name:
Fn::Join: [ "-", [ "BatchScatterGatherPollingActivity", Ref: StackUID] ]
BatchGatherActivity:
Type: "AWS::StepFunctions::Activity"
Properties:
Name:
Fn::Join: [ "-", [ "BatchGatherActivity", Ref: StackUID] ]
BatchTriodenovoActivity:
Type: "AWS::StepFunctions::Activity"
Properties:
Name:
Fn::Join: [ "-", [ "BatchTriodenovoActivity", Ref: StackUID] ]
BatchHandoffActivity:
Type: "AWS::StepFunctions::Activity"
Properties:
Name:
Fn::Join: [ "-", [ "BatchHandoffActivity", Ref: StackUID] ]
Outputs:
# These get used in the instance_resources child stack.
BatchScatterGatherSubmissionActivity:
Value: !Ref BatchScatterGatherSubmissionActivity
BatchScatterGatherPollingActivity:
Value: !Ref BatchScatterGatherPollingActivity
BatchGatherActivity:
Value: !Ref BatchGatherActivity
BatchTriodenovoActivity:
Value: !Ref BatchTriodenovoActivity
BatchHandoffActivity:
Value: !Ref BatchHandoffActivity
这是父(嵌套)模板的相关部分,上面的输出将传递到EC2InstanceResourcesStack中:
StepFunctionResourcesStack:
Type: AWS::CloudFormation::Stack
Properties:
Parameters:
StackUID:
Ref: StackUID
TemplateURL: https://s3.amazonaws.com/CFNTemplate/step_functions_resources.stack.yaml
Timeout: "100"
EC2InstanceResourcesStack:
Type: AWS::CloudFormation::Stack
Properties:
Parameters:
BatchScatterGatherSubmissionActivity:
Fn::GetAtt: [ "BatchScatterGatherSubmissionActivity", "Outputs.StepFunctionResourcesStack" ]
BatchScatterGatherPollingActivity:
Fn::GetAtt: [ "BatchScatterGatherPollingActivity", "Outputs.StepFunctionResourcesStack" ]
BatchGatherActivity:
Fn::GetAtt: [ "BatchGatherActivity", "Outputs.StepFunctionResourcesStack" ]
BatchTriodenovoActivity:
Fn::GetAtt: [ "BatchTriodenovoActivity", "Outputs.StepFunctionResourcesStack" ]
BatchHandoffActivity:
Fn::GetAtt: [ "BatchHandoffActivity", "Outputs.StepFunctionResourcesStack" ]
Subnet: !Ref Subnet
GPCESSHKeyPair: !Ref GPCESSHKeyPair
GPCESubnetAZ1: !Ref GPCESubnetAZ1
ActivityAndHandoffAnsibleBucketName: !Ref ActivityAndHandoffAnsibleBucketName
ActivityAndHandoffAnsibleKeyName: !Ref ActivityAndHandoffAnsibleKeyName
ActivityAndHandoffDaemonBucketName: !Ref ActivityAndHandoffDaemonBucketName
ActivityAndHandoffDaemonKeyName: !Ref ActivityAndHandoffDaemonKeyName
ActivityAndHandoffDaemonRequirementsBucketName: !Ref ActivityAndHandoffDaemonRequirementsBucketName
ActivityAndHandoffDaemonRequirementsKeyName: !Ref ActivityAndHandoffDaemonRequirementsKeyName
Rkstr8PkgBucketName: !Ref Rkstr8PkgBucketName
Rkstr8PkgKeyName: !Ref Rkstr8PkgKeyName
TemplateURL: https://s3.amazonaws.com/CFNTemplate/instance_resources.stack.yaml
Timeout: "100"
DependsOn: StepFunctionResourcesStack
对于从子级导出参数并将其通过父模板传递给另一个参数的方法,我遵循此处答案中提供的方法: AWS CloudFormation:在嵌套堆栈之间传递值
您不能直接从另一个模板中的一个模板(通过Ref
)引用资源,即使它们是父子模板或同级模板。 资源是特定于堆栈的,除非它们通过“ Output
部分显式导出。
因此,您有2个选择:
选项1:通过“ Output
部分从子模板1导出您关心的BatchScatterGatherSubmissionActivity
值,然后将这些值导入子模板2。
例如:
在“源”模板中:
"Outputs" : {
"MyValue" : {
"Value" : {
"Ref" : "BatchScatterGatherSubmissionActivity"
},
"Export" : {
"Name" : "MyExportedValue"
}
}
}
然后将值导入“消费”模板中:
{ "Fn::ImportValue" : "MyExportedValue" }
更多信息: https : //docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html
缺点之一是您不能“ DependsOn”。 而且,从字面上看,子模板2取决于子模板1。
选项2:从子模板输出您关心BatchScatterGatherSubmissionActivity
的值(即,向上传递给父级),然后将这些值从父级传递到另一个子级。
因此,在子模板1中,您将从子堆栈中输出值:
"Outputs" : {
"MyValue" : {
"Value" : {
"Ref" : "BatchScatterGatherSubmissionActivity"
}
}
}
在子模板2中,您可以通过“参数”部分向模板添加一个参数,然后引用该参数。
"Parameters" : {
"MyParam" : {
"Type" : "String",
"Description" : "The value from elsewhere"
}
}
然后
{ "Ref" : "MyParam" }
最后,通过将子模板1的输出传递到子模板2的参数中,将2个子堆栈在父级中挂钩:
"ChildStack2": {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"MyParam" : { "Fn::GetAtt" : "Outputs.MyValue" }
}
}
}
在这种情况下,直到子堆栈1准备好并输出其值时才创建子堆栈2,因此隐含了“ DependsOn”。 但是在这种情况下,子模板2不依赖于子模板1。相反,它取决于满足其输入参数的任何内容(可以是父堆栈,也可以是其他内容)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.