为何部分AWS ARN需指定账户ID?EC2资源IAM策略配置问题
EC2资源标签权限策略的ARN格式问题解答
一、为什么部分资源要指定账户ID,部分不需要?
AWS EC2不同资源的ARN(Amazon资源名称)规则存在差异:
- 卷(Volume)和实例(Instance)是严格绑定特定账户的资源,它们的ARN必须明确包含账户ID才能匹配到本账户的目标资源,省略或用通配符代替都会导致策略无法识别资源,权限失效;
- 快照(Snapshot)的权限逻辑特殊,它的ARN支持省略账户ID(用
::占位),此时AWS会自动将空占位解析为当前执行操作的账户ID,正确匹配本账户的快照。但如果强行在快照ARN里添加账户ID,反而不符合它的标准格式,导致策略匹配失败。
二、:*:和::的区别
:*::代表匹配任意账户ID,这种写法在卷和实例的ARN里不生效,因为这两类资源属于专属账户,必须明确指定账户ID才能定位到资源;:::是空账户ID的占位符,仅适用于快照ARN,AWS会自动替换为当前操作所属的账户ID,从而正确匹配本账户的快照资源。
三、实现格式一致的可行方案
要让策略格式尽量统一且权限生效,最合规的方式是遵循EC2资源的原生ARN规则,保留快照的::写法,卷和实例指定账户ID,最终策略片段如下:
"Resource": [ "arn:aws:ec2:*:<account-id>:volume/*", "arn:aws:ec2:*::snapshot/*", "arn:aws:ec2:*:<account-id>:instance/*" ]
如果非要追求视觉上的完全统一,也可以通过条件语句来实现,用aws:PrincipalAccount限定操作仅针对本账户资源,此时ARN可以统一使用:*:,但这种写法会增加策略复杂度:
"Effect": "Allow", "Action": "ec2:CreateTags", "Resource": [ "arn:aws:ec2:*:*:volume/*", "arn:aws:ec2:*:*:snapshot/*", "arn:aws:ec2:*:*:instance/*" ], "Condition": { "StringEquals": { "aws:PrincipalAccount": "<account-id>" } }
不过更推荐第一种写法,逻辑清晰,符合AWS原生规则,维护起来更简单。
内容的提问来源于stack exchange,提问作者Salmon
相关产品推荐
相关产品推荐

