AWS IAM:允许EC2实例停止自身

7
我想让我们AWS账户中的所有EC2实例都能够自行停止(使用一个使用aws cli的自动化脚本)。我尝试通过创建具有适当策略的AWS IAM角色来实现此目的。然而,我无法找到如何定义策略以仅允许实例停止自身(而不是其他实例)。
我尝试了以下策略:
{
     "Version": "2012-10-17",
     "Statement": [
         {
             "Effect": "Allow",
             "Action": [
                 "ec2:StopInstances"
             ],
             "Resource": [
                 "${ec2:SourceInstanceARN}"
             ]
         }
     ]
}

但在验证时,这给了我一个错误:此策略包含以下错误:以下资源无效:${ec2:SourceInstanceARN}

有没有一种方法允许实例停止自己(仅限自己)?如果有,应该如何做?


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Mark B
1
啊,当然,我怎么会忘记了!请把这个作为答案发布,然后我会接受它。对我来说,这肯定有效。然而,我可以想到两个其他人不想使用关机命令的原因:
  1. 关机命令只能在 root 权限下执行,所以您需要 sudo 权限才能执行。
  2. 如果实例的关机行为是终止,那么您将失去该实例而不是停止它。
- user1834095
ec2:SourceInstanceARN 键不能用作变量来填充语句中资源元素的 ARN。请参阅 ec2:SourceInstanceARN 条件键 的注释。 - Oleksandr Shmyrko
新闻:AWS刚刚破解了操作系统的关机命令。它不再像以前那样起作用了。两个选项都没有用处。 - undefined
正确答案是 @OleksandrShmyrko 的回答。https://stackoverflow.com/a/77121877/238074 - undefined
3个回答

7

关闭行为解决了终止问题,但可能存在其他需要限制对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}"
                }
            }
        }
    ]
}

2
这个已经不再起作用了:https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html#access-analyzer-reference-policy-checks-error-unsupported-global-condition-key - TheNavigat
有人找到了替代方案吗?“aws:ARN”不再受支持。 - Florin Andrei
@FlorinAndrei 你应该可以用 aws:SourceArn 替换 aws:ARN - Tomasz Kapłoński
aws:SourceArnaws:PrincipalArn都不起作用。但是aws:ARN仍然可以正常工作,尽管可视化编辑器会抱怨它不再受支持。 - rickb
aws:ARN在控制台的JSON编辑器中不再被接受。 - undefined

1
你可以在条件元素中使用 aws:useridec2:InstanceID
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["ec2:StopInstances"],
            "Resource": ["arn:aws:ec2:*:*:instance/*"],
            "Condition": {
                "StringLike": {
                    "aws:userid": "*:${ec2:InstanceID}"
                }
            }
        }
    ]
}

此政策授予关闭任何测试中的EC2的权限。 - undefined
增加了一个条件,应该将操作限制在实例本身。 - undefined
是的,非常好。谢谢! - undefined

0

正如马克·B在评论中建议的那样,我通过将我的脚本更改为使用shutdown而不是aws ec2 stop-instances来解决了我的问题。这使得任何策略的使用都是不必要的,因为任何系统都可以在自身上执行关机(仅限于自身)。


请注意,AWS已经秘密更改了这种“关闭”行为。现在,只有两种可能的结果:1)停止实例(不运行操作系统,AWS继续收费)或2)终止实例(即销毁,删除,消失)。默认情况下是1。 - undefined
@KevinBuchs 你的实例的关机行为设置为什么?根据AWS文档,将其设置为“停止”应该允许在调用操作系统的关机命令时停止实例。请注意,你必须使用shutdown命令而不是halt。https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#Using_ChangingInstanceInitiatedShutdownBehavior - undefined
设置为停止。这个行为是在最近一周内发生的变化。 - undefined
@KevinBuchs 请检查一下您是否在EC2实例上启用了停止保护或其他可能干扰标准停止行为的设置。我刚刚尝试了启用和禁用休眠功能,无论哪种情况,当我在操作系统级别(在一个t3.micro上运行Ubuntu 22.04 LTS)通过CLI发出shutdown命令时,两个实例都在AWS控制台上停止了。 - undefined
我没有启用停止预防或终止预防。AWS已经复现了这个问题,所以没有必要再进行进一步的讨论。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接