gpt4 book ai didi

amazon-web-services - Cloudformation 嵌套堆栈模板子对子参数的 ValidationError

转载 作者:行者123 更新时间:2023-12-03 07:19:24 25 4
gpt4 key购买 nike

我制作了一个嵌套的 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: Passing Values between Nested Stacks

最佳答案

您无法直接从一个模板引用另一个模板中的资源(通过 Ref),即使它们是父子模板或同级模板。资源是特定于堆栈的,除非通过 Output 部分显式导出它们。

所以你有两个选择:

选项 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 个子堆栈在父堆栈中 Hook 在一起:

"ChildStack2": {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters" : {
"MyParam" : { "Fn::GetAtt" : "Outputs.MyValue" }
}
}
}

在这种情况下,在子堆栈 1 准备好并输出其值之前,不会创建子堆栈 2,因此存在隐含的“DependsOn”。但在本例中,子模板 2 不依赖于子模板 1。相反,它依赖于满足其输入参数的任何内容(可以是父堆栈或其他参数)。

关于amazon-web-services - Cloudformation 嵌套堆栈模板子对子参数的 ValidationError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com