AWS CloudFormation中角色PhysicalResourceId非ARN,如何获取其ARN?
CloudFormation中IAM角色PhysicalResourceId非ARN的原因及ARN获取方法
问题背景
使用AWS CLI创建IAM角色时,可直接获得格式规范的ARN:
arn:aws:iam::836101485904:role/sigmund-freud
但通过CloudFormation创建角色时,栈资源返回的PhysicalResourceId并非ARN格式:
stack-example9-SigmundFreud-1SXXK5AE0GRA3
而通过CloudFormation创建IAM策略时,返回的PhysicalResourceId却是标准ARN:
"PhysicalResourceId": "arn:aws:iam::836101485904:policy/bucket-simple1-FirstPolicy-1DMVF6Q0R9G95"
原因分析
CloudFormation对不同IAM资源的PhysicalResourceId返回逻辑存在差异:
- IAM策略的物理ID直接返回ARN,因为策略的ARN是创建后固定且唯一的标识,符合CloudFormation对这类资源的返回规则。
- IAM角色的物理ID返回的是角色名称(此处为CloudFormation自动生成的带栈前缀的角色名)。这源于早期CloudFormation的设计逻辑:IAM角色的名称是其核心标识,ARN可由名称推导;同时角色名称支持修改(不推荐操作),修改后ARN会同步变更,返回名称作为物理ID能保证标识的稳定性。
获取角色ARN的方法
1. 在CloudFormation模板中配置输出
在模板里添加Outputs段落,直接引用角色的Arn属性:
Outputs: SigmundFreudRoleArn: Value: !GetAtt SigmundFreud.Arn Description: ARN of the SigmundFreud IAM Role
部署栈后,可在CloudFormation控制台的「输出」页签查看ARN,也能通过AWS CLI命令获取:
aws cloudformation describe-stacks --stack-name stack-example9 --query "Stacks[0].Outputs[?OutputKey=='SigmundFreudRoleArn'].OutputValue" --output text
2. 通过AWS CLI根据角色名查询
使用返回的角色名称作为参数,调用IAM查询命令:
aws iam get-role --role-name stack-example9-SigmundFreud-1SXXK5AE0GRA3 --query "Role.Arn" --output text
3. 控制台直接查看
登录AWS控制台,进入目标CloudFormation栈的「资源」页面,找到对应的IAM角色资源,点击跳转至IAM控制台,即可直接查看角色的ARN。
内容的提问来源于stack exchange,提问作者Billy Billy
相关产品推荐
相关产品推荐

