我正在进行一项设置,由于不活动(即一段时间以来 Web 服务器访问日志中没有任何新内容),我需要终止 AWS 实例。这些实例是测试实例,由 CI/CD 软件自动创建。
我希望这些实例能够表明自己已被遗弃并终止自己。我想为每个实例分配一个通用的 iam 角色,该角色只允许实例终止自身,而不允许终止对等实例。
到目前为止我一直在这里:
并发现策略中有 2 个可用变量:
ec2-instance-id
ec2:SourceInstanceARN
我对我的角色政策提出了一些变体,但都不起作用:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:TerminateInstances",
"Resource": "*",
"Condition": {
"ArnEquals": {
"ec2:SourceInstanceARN": "arn:aws:ec2:*:*:instance/${ec2-instance-id}"
}
}
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:TerminateInstances",
"Resource": "arn:aws:ec2:*:*:instance/${ec2-instance-id}"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:TerminateInstances",
"Resource": "${ec2:SourceInstanceARN}"
}
]
}
是否真的可以实现所需的行为,即只允许实例对其自身执行特定操作(例如终止)?
更新:
我确实知道我可以使用标签,这就是我同时正在做的事情,但这意味着所有标记的实例都可以终止其对等体。这是一个有点太宽松的限制,我想真正将其限制在实例中
您与您的
condition
很亲近。诀窍是将实例 ARN 与 ec2:sourceInstanceARN
: 进行比较
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:DeleteTags",
"ec2:DescribeTags",
"ec2:CreateTags",
"ec2:TerminateInstances",
"ec2:StopInstances"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ARN": "${ec2:SourceInstanceARN}"
}
}
}
]
}
显然出于测试目的,我允许具有此策略的实例标记并停止自身。
由于“aws:ARN”条件不再起作用,我发现以下方法适用于使用 IAM 角色启动的实例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow instance to modify itself",
"Effect": "Allow",
"Action": [
"ec2:DeleteTags",
"ec2:CreateTags"
],
"Resource": "*",
"Condition": {
"StringLike": {
"aws:userid": "*:${ec2:InstanceID}"
}
}
}
]
}
您可以使用
ec2:InstanceID
IAM 条件键作为资源块中的变量,以便使用此策略的实例只能访问其自身:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:AssociateAddress",
"ec2:AttachVolume",
"ec2:CreateTags",
"ec2:RebootInstances",
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Effect": "Allow",
"Resource": [
"arn:aws:ec2:*:*:instance/${ec2:InstanceID}",
"arn:aws:ec2:*:*:elastic-ip/*",
"arn:aws:ec2:*:*:volume/*"
]
}
]
}
注意! 并非所有 EC2 操作都支持资源级权限,授予访问权限的策略必须在资源元素中指定“*”。
例如,大多数
ec2:Describe*
操作仅在 Resource: "*"
时才有效。