There's an echo in my head

日々のメモ。

IAMでEC2を起動、停止できるカスタムポリシーを作る

ポリシージェネレータをいじったり手でいじったりして、特定のタグを持つインスタンスの起動、停止ができるカスタムポリシーを作った。

// ※ 実際はJSONなのでコメントは記入できません
{
  "Version": "2012-10-17",
  "Statement": [
    // EC2のインスタンスに対する状態の取得を許可する
    // これも↓のAllowStopStartのように対象をタグで絞り込もうとしたら動いてくれなかったので、全サーバに対して許可した
    {
      "Sid": "AllowDescribe",
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*"
      ],
      "Resource": [
        "*"
      ]
    },
    // key=Foo,value=Barタグを持つインスタンスに対して起動と停止を許可する
    {
      "Sid": "AllowStopStart",
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:ResourceTag/Foo": "Bar"
        }
      },
      "Resource": [
        "arn:aws:ec2:*"
      ]
    }
  ]
}

実際にはAllowStartStop部分だけでいいんだろうけど、decribe系のAPIも使いたかったのでAllowDescribeとして混ぜた。注釈でも触れているとおり、describe系の対象もタグで絞り込もうとしたら動かなかったので、全インスタンスを対象にした。ちなみにSidは自由に設定できる。

ポリシーは生成してからもあとから編集できるんだけど、反映されるまでに少し時間がかかった。それと、ポリシー名をあとから変えたらポリシー自体が設定していたユーザの画面から消えた…。

カスタムポリシーを使えばFull Accessのような過大な権限を与えた結果関係ない部分に対して誤操作をしてしまうこともないし、適切なポリシー名をつければそのユーザがグループの用途やできることがわかりやすくなる。

参考

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。