如何在CloudFormation嵌套栈中引用根栈资源(无需导出)
解决方案
不需要使用Export功能,直接通过嵌套栈参数传递角色ARN即可实现需求,具体操作步骤如下:
1. 修正根栈(template.yaml)的参数传递逻辑
根栈向嵌套栈传递角色时,需要传递角色的ARN(而非角色名称,因为Batch任务定义要求填入ARN),将原!Ref替换为!GetAtt来获取ARN:
Resources: ECSJobDefinitionsStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: 'nested-stack-templates/ecs_job_definitions.yaml' Parameters: SesToAddress: !Ref SesToAddress DockerImageURIForDashboard: !Ref DockerImageURIForDashboard JobDefinitionVcpuReservation: !Ref JobDefinitionVcpuReservation JobDefinitionMemoryReservation: !Ref JobDefinitionMemoryReservation SesIdentityArn: !Ref SesIdentityArn SesFromAddress: !Ref SesFromAddress BaseURLForUat: !Ref BaseURLForUat EnvName: !Ref EnvName # 修正:传递角色ARN而非角色名称 MyECSTaskExecutionRoleArn: !GetAtt MyECSTaskExecutionRole.Arn MyECSTaskRoleArn: !GetAtt MyECSTaskRole.Arn AppNameForResources: !Ref AppNameForResources Outputs: MyECSTaskExecutionRole: Value: !GetAtt ECSTaskExecutionRole.Arn MyECSTaskRole: Value: !GetAtt ECSTaskRole.Arn MySecrets: Value: !Ref MyLittleSecretA MyECSLogGroup: Value: !Ref ECSLogGroup
2. 给嵌套栈(ecs_job_definitions.yaml)添加参数定义并修正引用
在嵌套栈顶部定义需要接收的参数,然后在JobDefinition中引用这些传递过来的ARN参数:
# 新增:定义嵌套栈需要接收的参数 Parameters: SesToAddress: Type: String DockerImageURIForDashboard: Type: String JobDefinitionVcpuReservation: Type: String JobDefinitionMemoryReservation: Type: String SesIdentityArn: Type: String SesFromAddress: Type: String BaseURLForUat: Type: String EnvName: Type: String MyECSTaskExecutionRoleArn: Type: String MyECSTaskRoleArn: Type: String AppNameForResources: Type: String Resources: AWSBatchJobDefinitionForDashboardApi: Type: AWS::Batch::JobDefinition Properties: JobDefinitionName: !Sub - "${TheAppNameForResources}-${TheEnvName}-jd-dashboard" - TheAppNameForResources: !Ref AppNameForResources TheEnvName: !Ref EnvName PlatformCapabilities: - FARGATE PropagateTags: true RetryStrategy: Attempts: 1 Type: container ContainerProperties: Environment: - Name: SES_IDENTITY_ARN Value: !Ref SesIdentityArn - Name: SES_FROM_ADDRESS Value: !Ref SesFromAddress - Name: SES_TO_ADDRESS Value: !Ref SesToAddress - Name: BASE_URL_FOR_UAT Value: !Ref BaseURLForUat - Name: CITCO_ENV Value: !Ref EnvName # 修正:引用传递过来的执行角色ARN ExecutionRoleArn: !Ref MyECSTaskExecutionRoleArn FargatePlatformConfiguration: PlatformVersion: LATEST Image: !Ref DockerImageURIForDashboard # 修正:引用传递过来的任务角色ARN JobRoleArn: !Ref MyECSTaskRoleArn LogConfiguration: LogDriver: awslogs NetworkConfiguration: AssignPublicIp: DISABLED ResourceRequirements: - Type: MEMORY Value: !Ref JobDefinitionMemoryReservation - Type: VCPU Value: !Ref JobDefinitionVcpuReservation
核心说明
- 嵌套栈参数传递是CloudFormation的标准用法,无需Export/Import,避免跨栈依赖的额外复杂度。
- 必须传递角色ARN:
!GetAtt RoleName.Arn才能获取到符合要求的ARN值,!Ref RoleName仅返回角色名称,无法满足Batch任务定义的参数要求。 - 嵌套栈必须先定义对应的Parameters字段,才能接收并引用根栈传递的值。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

