IAM ポリシータグを使用して EC2 インスタンスまたは EBS ボリュームの作成方法を制限するにはどうすればよいですか?

最終更新日: 2020 年 11 月 11 日

AWS Identity and Access Management (IAM) ユーザーまたはグループのアクセスに対して、新しい Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの起動を許可したいです。また、特定のタグを適用する場合にのみ、IAM ユーザーのアクセスに対して、新しい Amazon Elastic Block Store (Amazon EBS) ボリュームの作成を許可したいです。IAM ポリシー条件を使用して、新しいリソースを作成するアクセスを制限するにはどうすればよいですか?

簡単な説明

リソースを作成する API 呼び出しの一部として、EC2 インスタンスと EBS ボリュームのタグを指定できます。この原則を使用して、IAM ポリシーに条件を適用することで、特定のリソースにタグ付けするよう IAM ユーザーに要求できます。次のポリシーの例では、ユーザーはセキュリティグループまたはキーペアの作成が許可されていないため、既存のセキュリティグループとキーペアを選択する必要があります。

次の IAM ポリシーの例により、ユーザーは次のことが行えます。

  • 一致するタグキーと値を持つ EC2 インスタンスを起動する
  • 少なくとも 1 つの一致するタグと値を持つ EC2 インスタンスを起動する
  • 少なくとも 1 つの一致するタグキーを持つ EC2 インスタンスを起動する
  • 指定されたタグのリストのみを持つ EC2 インスタンスを起動する

解決方法

一致するタグキーと値を持つ EC2 インスタンスを起動する

次のポリシーの例では、ユーザーが修飾子 ForAllValues を使用してポリシーで定義されているすべてのタグを適用する場合にのみ、EC2 インスタンスを起動して EBS ボリュームを作成できます。ユーザーがポリシーに含まれていないタグを適用すると、そのアクションは拒否されます。大文字と小文字の区別を強制するには、条件 aws:TagKeys を使用してください。

注: ポリシーの例の key1value1 を変更して、リソースに適用するタグと値を含めます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowToDescribeAll",
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowRunInstances",
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
        "arn:aws:ec2:*::image/*",
        "arn:aws:ec2:*::snapshot/*",
        "arn:aws:ec2:*:*:subnet/*",
        "arn:aws:ec2:*:*:network-interface/*",
        "arn:aws:ec2:*:*:security-group/*",
        "arn:aws:ec2:*:*:key-pair/*"
      ]
    },
    {
      "Sid": "AllowRunInstancesWithRestrictions",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateVolume",
        "ec2:RunInstances"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:volume/*",
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ec2:*:*:network-interface/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/key1": "value1",
          "aws:RequestTag/key2": "value2"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": [
            "key1",
            "key2"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreateTagsOnlyLaunching",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateTags"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:volume/*",
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ec2:*:*:network-interface/*"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:CreateAction": [
            "RunInstances",
            "CreateVolume"
          ]
        }
      }
    }
  ]
}

重要: EC2 インスタンスを正常に起動するには、一致するタグキーと値をこのポリシーに含める必要があります。キーと値のペアが一致しない場合は、「起動失敗」エラーや同様の種類の API エラーメッセージが表示されます。

Example results

Key/Value Result
key1/value1 and key2/value2 allow
key1/value1 deny
key1/value2 deny
no keys and values deny

少なくとも 1 つの一致するタグと値を持つ EC2 インスタンスを起動する

次の例では、AllowRunInstancesWithRestrictions 条件ブロックを置き換えて、少なくとも 1 つのタグキーが key1、1 つの値が value1 である場合、ユーザーが EC2 インスタンスを起動して EBS ボリュームを作成できるようにします。RunInstances リクエストには、任意の数のタグを追加できます。

"Condition": {
  "StringEquals": {
    "aws:RequestTag/key1": "value1"
  },
  "ForAnyValue:StringEquals": {
    "aws:TagKeys": [
      "key1"
    ]
  }
}

Example results

Key/Value Result
key1/value1 and key2/value2 allow
key1/value1 allow

key1/value2

deny
no keys and values

deny

少なくとも 1 つの一致するタグキーを持つ EC2 インスタンスを起動する

次のポリシーの例では、AllowRunInstancesWithRestrictions 条件ブロックを置き換えて、少なくとも 1 つのタグキーが key1 である場合、ユーザーが EC2 インスタンスを起動して EBS ボリュームを作成できるようにします。key1 タグには特定の値は不要で、RunInstances リクエストに任意の数のタグを追加できます。

"Condition": {
  "ForAnyValue:StringEquals": {
    "aws:TagKeys": [
      "key1"
    ]
  }
}

Example results

Key/Value Result
key1/value1 and key2/value2 allow
key1/value1 allow
key1/value2 allow
no keys and values deny

指定されたタグのリストのみを持つ EC2 インスタンスを起動する

次のポリシーの例では、AllowRunInstancesWithRestrictions 条件ブロックを置き換えて、リクエストにタグキー key1key2 が提供されている場合にのみ、ユーザーが EC2 インスタンスを起動して EBS ボリュームを作成できるようにします。どちらのタグキーにも特定の値は不要で、RunInstances リクエストにタグを追加することはできません。

"Condition": {
  "StringLike": {
      "aws:RequestTag/key1": "*",
      "aws:RequestTag/key2": "*"
  },
  "ForAllValues:StringEquals": {
    "aws:TagKeys": [
        "key1",
        "key2"
    ]
  }
}

注: StringLike 条件は、すべてのタグの存在を保証するために必要です。

Example results

Key/Value Results
key1/AnyValue and key2/AnyValue Allow
key1/AnyValue

Deny

key2/AnyValue Deny
No keys or values Deny
key1/AnyValue, key2/AnyValue, key3/AnyValue Deny