我试图允许我们的 AWS 账户中的所有 EC2 实例自行停止(使用使用 aws cli 的自动脚本)。我尝试通过使用适当的策略创建 AWS IAM 角色来实现此目的。但是,我找不到如何定义策略以仅允许实例自行停止(而不是其他实例)。
我尝试了以下策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StopInstances"
],
"Resource": [
"${ec2:SourceInstanceARN}"
]
}
]
}
但是在验证时,这给了我错误
This policy contains the following error: The following resources are invalid : ${ec2:SourceInstanceARN}
有没有办法让实例停止自身(并且仅停止自身)?如果是的话我该怎么办?
关闭行为解决了终止问题,但可能还有其他场景需要限制对 API 请求的访问(即自标记)。因此,这是一个使用 IAM 策略的解决方案:
{
"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}"
}
}
}
]
}
正如 Mark B 在评论中建议的那样,我通过更改脚本以使用
shutdown
而不是 aws ec2 stop-instances
解决了我的问题。这使得无需使用任何策略,因为任何系统都可以对自身(并且仅对自身)执行关闭。
您可以使用
ec2:InstanceID
IAM 条件键作为资源块中的变量,以便使用此策略的实例只能访问其自身:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ec2:StopInstances"],
"Resource": ["arn:aws:ec2:*:*:instance/${ec2:InstanceID}"]
}
]
}