特定のタグが設定されていないAWSリソースの作成を拒否するIAMポリシー

# はじめに
IAMポリシーで「特定のタグが設定されている場合はリソース作成を許可する」という内容の記事はよく見かけるのですが**「特定のタグが設定されていない場合はリソース作成を拒否する」**パターンを見かけなかったのでやってみました。

# IAMポリシー
今回はEC2作成時にインスタンスにownerというKeyのタグが設定されていない場合は作成を拒否するという内容にしました。
ConditionでNull条件演算子を使用してownerタグの存在を確認している箇所がポイントです。
※以下のサンプルでは先頭でフル権限を付与していますが実際の運用では必要最小限の権限を付与することが好ましいです。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "Null": {
                    "aws:RequestTag/owner": "true"
                }
            }
        }
    ]
}
```


# テスト
以下4パターンのテストを行いました。
パターン①：タグ無しでEC2を作成
パターン②：Key=hogehogeというタグを設定してEC2を作成
パターン③：Key=ownerというタグを設定してEC2を作成
パターン④：Key=ownerとKey=hogehogeという2つのタグを設定してEC2を作成

EC2の作成はポリシーをアタッチしたIAMユーザの権限でAWSCLIで実行することにします。
各テストパターンの実行結果は以下の通りとなりました。

**パターン①：タグ無しでEC2を作成**
結果：EC2作成 失敗

```
・実行コマンド
aws ec2 run-instances \
 --image-id ami-abcd026eaf697efgh \
 --count 1 \
 --instance-type t2.micro \
 --key-name ec2-test-key

・実行結果
An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: pTr0TjJdNIjcdcmjoPjkI94_N8qzQripyTsnR9grts3estiIgfAM5-txSLA-0yXXamJ-Tf4qn_NuJg2CAddyZGNl-KRJ6sK3rYtsIWBRpab9lom5Mh3FCPAMu9YoT7fAp9Q-t0Dy8NoIe3gMXZQfOdRbapNC-4Ce8w82OuL1YvSwRlQiLBNAbpJtkEys1ugkLnGtcKUz3RwIho0MCgv7BeW9IuOIQ5mvkg2ze9Okw-ObSffLjwkknT7NZJ1Q4imf6KBHZWqKGklplQGToUqnfSRzIXhaUilY7iyrmN62r2LBZhdadNDYWslHyb1537mnS7MvGp_Shr-TgiuXWJO1ToxjOEF5xEeGKNIDbk7aSvcIcctTkve9rFhzVBNHmDSDeb2UdONu0hPUBgfKaklcuuLKnd8pyVD3C8_KJZSHQKElOiXHAR3OJXPbKvKjSfGy053NPawOf3EF4khPagAKUzXC3ivcoFF5ztdPOFZ2dJjgrXfT0gLogrJGVD_p7lRxJyzyrs0z3QBwNyE5iZY-fItW7q5O_VSxUmrlPRiLLpUbxvAdUWoY19wwlr3UaySvzrBqXgJ2ZFnMi-xn3DyoKxMKDZZd8D4CiQi-xsZLX8iMAvnJE1ZVGbaYlLGV_6pHw6ZzbeOy56FhTDjqyDqTr4ALhZ3sxXxl7AyigBq3X4H2E9964F9falptIrMrCyDXpIu6qP-W7k1771JxjBedILPQjJ7A0h2SuapJ9OG1C_qojYLBWtvmE65HCUTO4303fqxj1-2g-u23BOJ05--nzA
```

<br>
**パターン②：Key=hogehogeというタグを設定してEC2を作成**
結果：EC2作成 失敗

```
・実行コマンド
aws ec2 run-instances \
--image-id ami-abcd026eaf697efgh \
--count 1 \
--instance-type t2.micro \
--key-name ec2-test-key \
--tag-specifications 'ResourceType=instance,Tags={Key=hogehoge,Value=test-user}'

・実行結果
An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: VYezoTqMW-lgRuRVAjlJj7YVePPOnoLlTqCucIts1IdWv2bN44CAiaaR7Nxs-S3fKfyf9R9kIDJflU0WmM5psufI87A1SSXLIGtoTsBxXChoCN3uIVBMiuubiFXOS0Z0nHUn6aVLqJhg0FdYv2NiFurA0eUbxvCfmT8Cx_AbFo-PYDDyFo9_MN_2GOGLdnZw6ytTxwby-CHg487bgjp_Hp9rx1h40ymWZaQ9wIab7EFRjPcghV_gobVM2u57G01tXuW_7jbeamhy0XExJdhO7qQ7cFXst9ZQmsrODvI0yK03WhXopczmrVpPaAPujZ1KRR_C1wfS69vlecUFHHoQ7JOduOlqS3YTmKG5LrMQyQg8NFwEbhFwT_wGg4y9NXg9Mxogk3V_XKLsEgW7dNyA0zfBvLIRHUnLkjsiIJLoD1csDq_HMvNskvjws_7SESxfpbxBP20ji1SESK9BbhtrqYwFGEI7TVstol3C26NCTeKXl2D1r6ijwVrDY8AWZ2dKMVajyetW9VuPBgypdH3NAyYeS-4_V8sSBpQNgG25p39vdjHqLBdjsPba_gkhXWEoGYTeNs6wX7oeBCMhbJFbUpunleVOlPl-tTAixvLehryy5hvzKKIBqs0vEyYjfMtbNATI2kG6tjbPgltfwhC7zWAKkFslXHYOvQhPjpQwLsjE8afGeCw-Li9OcUXeYQDE7TITQbA5JRDItJgnOaY6UKsslmoaWSNZXrmmLE-0AyPleET5qrlfYzypBN90ofNixnYOpdyUuZk_mvp_g4b3
```

<br>
**パターン③：Key=ownerというタグを設定してEC2を作成**
結果：EC2作成 成功

```
・実行コマンド
aws ec2 run-instances \
--image-id ami-abcd026eaf697efgh \
--count 1 \
--instance-type t2.micro \
--key-name ec2-test-key \
--tag-specifications 'ResourceType=instance,Tags={Key=owner,Value=test-user}'

・実行結果
{
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
～中略～
            "Hypervisor": "xen",
            "BlockDeviceMappings": [],
            "Architecture": "x86_64",
            "RootDeviceType": "ebs",
            "RootDeviceName": "/dev/xvda",
            "VirtualizationType": "hvm",
            "Tags": [
                {
                    "Value": "test-user",
                    "Key": "owner"　　※Key=ownerタグが設定されている
                }
```

<br>
**パターン④：Key=ownerとKey=hogehogeという2つのタグを設定してEC2を作成**
結果：EC2作成 成功

```
・実行コマンド
aws ec2 run-instances \
--image-id ami-abcd026eaf697efgh \
--count 1 \
--instance-type t2.micro \
--key-name ec2-test-key \
--tag-specifications 'ResourceType=instance,Tags=[{Key=owner,Value=test-user},{Key=hogehoge,Value=test-hoge}]'

・実行結果
{
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
～中略～
            "Hypervisor": "xen",
            "BlockDeviceMappings": [],
            "Architecture": "x86_64",
            "RootDeviceType": "ebs",
            "RootDeviceName": "/dev/xvda",
            "VirtualizationType": "hvm",
            "Tags": [
                {
                    "Value": "test-hoge",
                    "Key": "hogehoge"　　※Key=hogehogeタグが設定されている
                },
                {
                    "Value": "test-user",
                    "Key": "owner"　　※Key=ownerタグが設定されている
                }
```

# まとめ
タグはAWSリソースの管理を行う上で重要ですが、設定をうっかり忘れてしまうこともあります。
IAMポリシーで設定忘れを防止することが可能ですので是非お試しください。