IAM策略限制无合规标签实例创建时不同AMI表现异常咨询
问题根源与解决方案
这个问题的核心原因是不同AMI的ARN格式差异导致的权限覆盖不全,咱们来具体分析:
1. AMI ARN的两种格式差异
- AWS官方发布的公共AMI(比如你测试的Amazon Linux 2),它的ARN格式是:
arn:aws:ec2:<region>::image/<ami-id>——注意中间没有账号ID段,直接是两个冒号连接region和image。 - 第三方发布的公共AMI(比如CentOS 7),ARN格式是:
arn:aws:ec2:<region>:<account-id>:image/<ami-id>——这里多了一个发布者的账号ID段。
2. 你的IAM策略的漏洞
在AllowRunInstances这条允许语句里,你指定的image资源仅覆盖了官方AMI的格式:
"arn:aws:ec2:*::image/*"
完全没有包含第三方AMI的ARN格式。而ec2:RunInstances是一个多资源依赖的操作,需要对启动实例用到的AMI、子网、安全组等所有资源都拥有允许权限,只要其中一个资源没有被允许,整个请求就会被拒绝。
这就解释了为什么选Amazon Linux 2时正常(AMI资源符合允许列表),选CentOS 7时触发权限拒绝(AMI资源不在允许范围内)。
3. 修复方案
修改AllowRunInstances语句中的Resource列表,同时包含两种AMI的ARN格式:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowToDescribeAll", "Effect": "Allow", "Action": [ "ec2:Describe*", "ec2:CreateTags", "ec2:DeleteTags" ], "Resource": "*" }, { "Sid": "AllowRunInstances", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*::image/*", "arn:aws:ec2:*:*:image/*", "arn:aws:ec2:*::snapshot/*", "arn:aws:ec2:*:*:subnet/*", "arn:aws:ec2:*:*:network-interface/*", "arn:aws:ec2:*:*:security-group/*", "arn:aws:ec2:*:*:key-pair/*" ] }, { "Sid": "AllowLaunchOnlyWithRequiredTags1", "Effect": "Deny", "Action": [ "ec2:RunInstances" ], "Resource": [ "arn:aws:ec2:*:012345678901:instance/*" ], "Condition": { "StringNotLike": { "aws:RequestTag/Purpose": "?*", "aws:RequestTag/CostCategory": "?*", "aws:RequestTag/Env": "?*", "aws:RequestTag/CreatedBy": "?*", "aws:RequestTag/Owner": "?*", "aws:RequestTag/CreationDate": "?*", "aws:RequestTag/Expiry": "?*", "aws:RequestTag/Name": "?*", "aws:RequestTag/Project": "?*" } } } ] }
添加arn:aws:ec2:*:*:image/*这个资源条目后,就能覆盖所有第三方发布的公共AMI,同时也支持你自己账号创建的自定义AMI(这类AMI的ARN格式同样包含账号ID段),确保启动CentOS 7实例时的AMI资源权限被允许。
内容的提问来源于stack exchange,提问作者Tanmay Maheshwari
相关产品推荐
相关产品推荐

