AWS CloudFormation中如何批量对列表应用!Sub函数生成IAM ARN?
动态实现方案
不需要硬编码列表索引,以下两种方案都可以动态适配任意数量的账号ID,账号增减时不需要修改模板逻辑。
方案一:纯原生内置函数实现(无额外依赖)
利用ARN的固定格式特征,通过字符串拼接+拆分直接生成目标数组,全部使用CloudFormation默认支持的内置函数,所有环境全兼容。
对应YAML配置如下:
Principal: AWS: !Split - "," - !Sub - "arn:aws:iam::${AccountList}:root" - AccountList: !Join - ":root,arn:aws:iam::" - !Split [",", !Ref Accounts]
实现逻辑:
- 先将传入的账号字符串按逗号拆分为账号列表
- 用固定后缀+前缀作为连接符,把账号列表重新拼接为字符串:相当于在每个账号(除了最后一个)后面补上ARN后缀,同时补上ARN前缀连接下一个账号
- 在拼接好的字符串整体前后补全第一个账号的前缀和最后一个账号的后缀,得到一个用逗号分隔所有完整ARN的长字符串
- 最后按逗号拆分长字符串,直接得到需要的ARN数组
这个方案在传入1个或多个账号时都能正常生成正确结果,没有数量限制。
方案二:官方扩展循环语法(逻辑更直观)
如果需要更直白的遍历逻辑,或者后续要处理更复杂的元素转换规则,可以启用AWS官方推出的AWS::LanguageExtensions原生语言扩展,直接通过!ForEach实现列表遍历,完全匹配「拆分字符串→逐个元素应用!Sub生成ARN」的处理思路。
首先需要在模板顶层添加扩展声明:
Transform: AWS::LanguageExtensions
然后Principal部分的配置可以简化为:
Principal: AWS: !ForEach - Account - !Split [",", !Ref Accounts] - !Sub "arn:aws:iam::${Account}:root"
这个写法不需要做字符串拼接的取巧处理,逻辑和预期处理流程完全一致,遍历拆分后的每个账号ID单独生成对应的ARN,哪怕后续每个账号的ARN生成规则变复杂,也只需要修改循环内的!Sub逻辑即可,维护成本更低。
内容的提问来源于stack exchange,提问作者vladsiv
相关产品推荐
相关产品推荐

