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

如何将SSM存储的账号JSON映射加载为CloudFormation模板参数?

多账号动态参数加载实现方案

针对你用StackSets跨账号部署,需要根据AWS账号ID动态加载对应参数的需求,以下几种方案可以替代FindInMap的思路:

方案1:用CloudFormation宏解析JSON返回对应值

把账号映射JSON存到SSM Parameter Store后,创建一个CloudFormation宏来处理解析逻辑:

  • 宏的Lambda函数负责读取SSM里的JSON内容,传入当前部署的账号ID(通过AWS::AccountId伪参数),直接返回该账号对应的配置值
  • 在StackSet模板里调用这个宏,就能直接拿到对应账号的参数,示例模板片段:
    Parameters:
      AccountConfigParamName:
        Type: String
        Default: "/account-config/mappings"
    Outputs:
      TargetAccountValue:
        Value: !Transform AccountConfigLookup
          Parameters:
            ParamName: !Ref AccountConfigParamName
            AccountId: !Ref AWS::AccountId
    
    Lambda核心代码:
    import boto3
    import json
    
    def handler(event, context):
        param_name = event['params']['ParamName']
        account_id = event['params']['AccountId']
        ssm = boto3.client('ssm')
        resp = ssm.get_parameter(Name=param_name, WithDecryption=True)
        config_map = json.loads(resp['Parameter']['Value'])
        return config_map.get(account_id, "")
    
    注意:要确保目标账号有调用该宏的权限,宏可以创建在管理账号,通过权限策略开放给目标账号。

方案2:改用SSM层级参数替代单JSON

放弃单一JSON文件,把每个账号的参数按层级存在SSM里,比如/account-config/{账号ID}/instance-type、/account-config/{账号ID}/environment:

  • 在StackSet模板里用动态引用拼接账号ID,直接读取对应参数:
    Parameters:
      ConfigPrefix:
        Type: String
        Default: "/account-config/"
    Resources:
      WebServer:
        Type: AWS::EC2::Instance
        Properties:
          InstanceType: !Sub "{{resolve:ssm:${ConfigPrefix}${AWS::AccountId}/instance-type:1}}"
    
    这种方式无需解析JSON,权限控制更灵活,还能单独更新某个账号的参数。

方案3:自定义资源获取对应配置

用Lambda-backed的自定义资源来处理SSM JSON的读取和解析:

  • 在模板里定义自定义资源,传入SSM参数名和当前账号ID,Lambda函数返回对应值
  • 示例模板片段:
    Parameters:
      AccountConfigParamName:
        Type: String
        Default: "/account-config/mappings"
    Resources:
      ConfigLookup:
        Type: Custom::AccountConfigLookup
        Properties:
          ServiceToken: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:ConfigLookupFunc"
          ParamName: !Ref AccountConfigParamName
          AccountId: !Ref AWS::AccountId
    Outputs:
      AccountValue:
        Value: !GetAtt ConfigLookup.Value
    
    Lambda函数逻辑和方案1一致,只是通过自定义资源的方式返回结果,适合需要在模板中多次引用的场景。

方案4:StackSet参数覆盖

如果账号数量不多,直接用StackSet的参数覆盖功能:

  • 在创建StackSet时,为每个目标账号单独指定参数值,或者通过部署集批量设置
  • 比如部署到账号123456789012时,覆盖InstanceType为t3.medium;部署到账号098765432109时,覆盖为t3.large
  • 这种方式不需要额外资源,操作直接,适合账号数量较少的场景

内容的提问来源于stack exchange,提问作者blizz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:38:13