You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:05:00