如何在AWS CloudFormation中截取AWS::AccountId最后四位并追加至S3存储桶名
CloudFormation 提取账号ID最后四位拼接S3桶名实现方案
实现思路
不需要额外部署自定义Lambda、也不需要手动硬编码账号ID,直接用CloudFormation内置函数就能完成字符串截取,全程不引入额外资源开销。
可直接复用的配置写法
目前AWS账号ID为固定12位数字格式,将账号ID拆分为单字符数组后,索引从0开始计数,最后四位字符恰好对应数组的8、9、10、11位索引,取出这四个位置的字符拼接即可得到目标后缀。
直接在S3存储桶资源的BucketName属性中写入如下配置即可:
ProdAppBucket: Type: AWS::S3::Bucket Properties: # 替换为你自己的业务桶名前缀 BucketName: !Sub - "my-company-app-prod-logs-${AccountSuffix}" - AccountSuffix: !Join - '' - - !Select [8, !Split ['', !Ref AWS::AccountId]] - !Select [9, !Split ['', !Ref AWS::AccountId]] - !Select [10, !Split ['', !Ref AWS::AccountId]] - !Select [11, !Split ['', !Ref AWS::AccountId]]
逻辑拆解
!Ref AWS::AccountId:获取当前部署环境的12位数字账号ID(注:真实AWS账号ID均为12位长度,提问中示例的11位字符串52514856415属于输入笔误,按12位长度计算,最后四位恰好是要提取的6415)!Split ['', 目标字符串]:以空字符串为分隔符,把完整账号ID拆分为单字符组成的数组!Select [索引值, 数组]:从拆分好的字符数组中,取出对应位置的单个字符!Join ['', 字符列表]:把取出的四个单字符拼接成完整的四位后缀!Sub:将拼接好的后缀替换到桶名的占位符位置,生成最终符合规则的桶名
注意事项
- 这套写法在所有公开区域的CloudFormation中全兼容,不会因为函数版本过新出现资源创建失败的问题
- 给桶名追加账号ID后缀的设计,恰好匹配S3全局名称空间的命名规则,能从根源上避免跨账号、跨环境的桶名冲突
- 全程使用内置的
AWS::AccountId引用,不要在模板里硬编码固定的账号ID字符串,这样模板跨账号复用的时候不需要做任何手动修改
内容的提问来源于stack exchange,提问作者Rapuru
相关产品推荐
相关产品推荐

