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

如何在CloudFormation中将CommaDelimitedList参数转换为ARN列表

解决方案:用CloudFormation的!Map函数批量生成角色ARN

当然可以实现!CloudFormation提供了!Map(长格式Fn::Map)函数,正好满足你遍历列表并转换每个元素的需求。下面是具体的实现方式:

首先,你的参数定义保持不变:

Parameters:
  UserRoles:
    Type: CommaDelimitedList
    Default: ""

然后在策略文档的Principal字段中,使用!Map来遍历UserRoles列表,将每个角色名拼接成完整的IAM ARN:

Principal:
  AWS: !Map
    - RoleName  # 定义迭代变量名,用来指代列表中的每个角色名
    - !Ref UserRoles  # 要遍历的源列表
    - !Sub 'arn:aws:iam::${AWS::AccountId}:role/${RoleName}'  # 每个元素的转换规则

逻辑说明

  • !Map会逐个取出UserRoles里的角色名,用RoleName变量指代当前元素
  • 通过!Sub函数自动替换AWS::AccountId(当前AWS账号ID)和RoleName(当前遍历到的角色名),生成标准的IAM角色ARN
  • 最终Principal.AWS会得到一个包含所有转换后ARN的数组,完美适配多角色场景

处理空值边界情况

因为你的参数默认值是空字符串,!Ref UserRoles会返回一个包含空字符串的列表,这会生成无效的ARN(比如arn:aws:iam::123456789012:role/)。可以结合!Filter过滤掉空元素:

Principal:
  AWS: !Map
    - RoleName
    - !Filter
      - Value  # 过滤用的变量名
      - !Ref UserRoles
      - !Not [!Equals [!Ref Value, ""]]  # 过滤条件:排除空字符串
    - !Sub 'arn:aws:iam::${AWS::AccountId}:role/${RoleName}'

版本兼容说明

!Map函数是CloudFormation在2019-09-09版本中引入的,如果你使用的是更早的模板版本,可能需要确认环境是否支持。如果遇到兼容性问题,也可以通过自定义资源实现类似的映射逻辑,但!Map是最简洁原生的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:09:57