【AWS】IAMポリシーでEC2へタグ付けを強制する

# はじめに
組織内で利用しているAWS環境の利用ルールを整備している過程で、「EC2へ特定のタグ付けを強制するIAMポリシー」を作成したのでここに記しておきます。
こちらのポリシーを適用することで、特定のタグをつけなければEC2の起動が拒否されるようになります。

# 前提条件

前提として、IAMユーザはEC2へのすべてのアクションを許可されているとします。
そのユーザに対して、Denyステートメントを用いて「EC2へ特定のタグ付けを強制するIAMポリシー」を適用します。

:::note info
ポリシーではDenyがAllowより優先されます。

>該当するポリシーに Deny ステートメントが含まれている場合、リクエストは明示的に拒否されます。リクエストに適用されるポリシーに Allow ステートメントと Deny ステートメントが含まれている場合は、Deny ステートメントが Allow ステートメントより優先されます。リクエストは明示的に拒否されます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#AccessPolicyLanguage_Interplay

:::

# IAMポリシーの作成・適用
今回はEC2へ`Project`というタグを強制するポリシーを作成し、IAMユーザに適用します。

## IAMポリシーの作成
1. 管理コンソールから「IAM」→「ポリシー」→「ポリシーの作成」をクリックします。
1. ポリシーエディタでJSONを選択し、以下のポリシーを入力します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2812915/cd2cdd1a-c09f-d51c-fd85-ff9e1bce3fb9.png)
    ```json:ポリシー定義
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "DenyRunInstancesWithoutTag",
                "Effect": "Deny",
                "Action": "ec2:RunInstances",
                "Resource": "arn:aws:ec2:*:*:instance/*",
                "Condition": {
                    "Null": {
                        "aws:RequestTag/Project": "true"
                    }
                }
            }
        ]
    }
    ```
    こちらのポリシーでは、`Action`に`ec2:RunInstances`を指定し、EC2インスタンスの起動操作がこのポリシーにより制御されるようにします。
    `Resource`に`arn:aws:ec2:*:*:instance/*`を指定し、すべてのEC2インスタンスを対象とします。
    `Condition`は、このポリシーが適用される具体的な条件を指定します。ここでの`Null`コンディションは、指定されたキーが存在しない場合にマッチします。つまり、`aws:RequestTag/Project`が`true`となっているので、EC2インスタンス作成リクエストが`Project`タグを持っていない場合に、このポリシーが適用されます。
    （参考：[条件キーの有無をチェックする条件演算子](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)）
    

1. ポリシー名を設定し、「ポリシーを作成」をクリックします。
    （今回は「DenyRunInstancesWithoutTag」というポリシー名を設定しました。）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2812915/31b2e247-db3e-3791-7df9-6ba3a5e16a6a.png)

## ポリシーの適用
今回は簡易的に動作確認を実施するために、testユーザへ直接ポリシーを適用します。
1. 「IAM」→「ユーザー」からポリシーを適用するユーザを選択します。
1. 「許可」タブ→「許可を追加」をクリックします。
1. 許可のオプションから「ポリシーを直接アタッチする」を選択し、先ほど作成したIAMポリシーを選択します。「次へ」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2812915/dc773731-d44a-c2f0-e8a7-ac8aae78feca.png)
1. 「許可を追加」をクリックします。


# 動作確認
testユーザで管理コンソールへログインし、動作確認を行います。

## 指定されたタグ無しでEC2を起動
1. `Prject`タグを設定せずにEC2を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2812915/42da0e44-146e-46fe-8517-4080fb756524.png)

1. インスタンスの起動に失敗したことを確認できました。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323831323931352f66393534643463632d343531362d326563302d346335342d3237363739336533323933652e706e6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2812915/a4ae3f0c-aab7-d887-b027-a1cdab54a9f3.png)


## 指定されたタグ付きでEC2を起動

1. `Prject`タグを設定してEC2を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2812915/366fe8c5-1803-9594-b1d2-36de88ed068e.png)


1. インスタンスの起動に成功したことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2812915/c2b5514c-5d8c-7801-8171-5aae93668177.png)

:::note info
ポリシー条件のキー名では、大文字と小文字は区別されないため、タグ名を`project`と設定しても起動できます。

>ポリシー条件のキー名では、大文字と小文字は区別されません。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_tags.html#access_tags_control-tag-keys

:::