AWS CloudFormation组合使用Join与Sub生成账户ARN列表报错如何解决
问题排查
错误原因
- 核心问题不符合CloudFormation的函数嵌套语法规则,触发参数校验报错,具体问题有两个:
- 使用带自定义变量映射的
!Sub(列表形式的!Sub)时,模板字符串中用到的所有变量都需要在映射中显式声明,包括AWS::Partition这类伪参数。你当前外层!Sub的模板里使用了${AWS::Partition},但变量映射中仅定义了acc_id,没有对该伪参数做显式声明,导致解析异常。 - 短格式函数的缩进不规范,CloudFormation解析时误判
!Join的参数数量不匹配,触发了你看到的参数错误提示。
- 使用带自定义变量映射的
修复方案
以下是修正后可正常运行的代码,可实现「传入账号ID列表生成对应ARN列表」的需求:
Principal: Service: lambda.amazonaws.com AWS: !Split - ',' - !Sub - 'arn:${Partition}:iam::${acc_id_joined}:root' - Partition: !Ref AWS::Partition acc_id_joined: !Join - !Sub ':root,arn:${AWS::Partition}:iam::' - !Ref AccountIds
逻辑说明
- 首先用
!Join把账号ID列表用分隔符:root,arn:${AWS::Partition}:iam::拼接为长字符串,例如账号ID列表为["111111111111", "222222222222"],拼接结果为111111111111:root,arn:aws:iam::222222222222 - 再通过
!Sub把拼接好的账号串替换到ARN模板中,得到完整的ARN拼接字符串:arn:aws:iam::111111111111:root,arn:aws:iam::222222222222:root - 最后用
!Split按逗号分割,即可得到符合要求的ARN列表。
内容的提问来源于stack exchange,提问作者Mithun Devkate
相关产品推荐
相关产品推荐

