EC2を起動できるサブネットを制限する方法

EC2を起動できるサブネットを制限するにはどうすればいいですか? に対するアンサーです。
2020.11.15

コンニチハ、千葉です。

テクニカルサポートノートとは?

クラスメソッドのカルチャー(CLP) の「情報発信を通じて、全ての人々の創造活動に貢献し続ける」という考えから、クラスメソッド メンバーズをご利用のお客様よりいただいたお問い合わせより、他の AWS ユーザーにとっても 有益な情報を一般的な TIPS としてご紹介しています。

困っていた内容

特定のサブネットでEC2を起動できるように権限を付与したいのですが、どうすればいいでしょうか?

解決方法

要件にあった IAM ポリシーを作成し、アタッチします。IAMポリシーは、2パターン利用できます。

  1. 特定のサブネットにタグを付与し、IAMポリシーでタグが付与されていない場合は操作を拒否する
  2. IAMポリシーにて起動するサブネットを直接指定する

1. 特定のサブネットにタグを付与し、IAMポリシーでタグが付与されていない場合は操作を拒否する

開発環境や本番環境などのタグをベースに、EC2が起動できるサブネットを制限します。 許可するサブネットが増えた場合は、追加のサブネットに対しタグを付与します。

  • IAMに対しAmazonEC2FullAccessを付与
  • サブネットに対しタグを付与。key=restrict, value=development
  • 以下のカスタムポリシーを付与
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*:*:elasticGpu/*",
                "arn:aws:ec2:*:*:key-pair/*",
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*::snapshot/*",
                "arn:aws:ec2:*:*:launch-template/*",
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:placement-group/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*::image/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*:*:subnet/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "ec2:ResourceTag/restrict": "development"
                }
            }
        }
    ]
}

参考:https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_ec2_tag-owner.html

2. IAMポリシーにて起動するサブネットを直接指定する

IAMポリシーに、EC2が起動できるサブネットIDを指定することで制限します。

subnet-subnet-id

を特定のサブネットIDに変更します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:GetConsole*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*:*:subnet/subnet-subnet-id",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*::image/ami-*",
                "arn:aws:ec2:*:*:key-pair/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        }
    ]
}

参考:https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_ec2_instances-subnet.html

以上、千葉がお送りしました。