AWS Configを有効化してみた


# Agenda
本記事では、以下のことを書いています。
- AWS Configの有効化、初期化方法
- AWS Configのサービスリンクロールとは何か？
- AWSグローバルサービスとは何か？

# Introduction
## AWS Configとは何か？
AWS リソースの設定を継続的に記録・評価するためのフルマネージドサービス

以下のような機能が提供される
- アカウント内のリソース検出
- 設定内容の記録
- リソースの設定内容の詳細や削除・変更・設定履歴の記録

[デベロッパーガイド](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/WhatIsConfig.html)

# Action
## 有効化方法
大きく5つのステップを踏んで有効化していきます

```
1. AWS Configで記録するリソースタイプを指定
2. 必要なIAMロールを設定
3. 設定履歴やスナップショットのファイルを送信するS3バケットの指定
4. 設定変更を通知するようSNSトピックを設定
5. AWS Configルールを設定
```

1. AWS Configのトップ画面から[Get Started]を選択
   ![config-001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/433dd4ba-5b6d-e260-c3f7-0f04cb95c69b.png)

2. 一般設定(General settings)と配信方法(Delivery method)についての設定画面。
   今回は以下のように設定をして「Next」を押す
   - 現在指定中のリージョンの全リソースを記録対象にしたい場合は`Record all resources supported in this region`
   - AWSグローバルサービスも対象にしたい場合は`Include global resources`にチェックを入れる(グローバルサービスとは何ぞや？という人はCommentsを参照)
   - AWS Config Roleで`Use an existing AWS Config service-linked role`を選択すると、AWS提供のデフォルト設定ロールがサービスに付与される
   - AWS Configで記録された証跡ログはS3バケットに保管されるのでバケット名の指定が必要
   - 通知設定をしたい場合はSNSトピックも作成
   ![config-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/e0d85881-ee7c-d068-ce8d-504f3e959267.png)

3. Configルールに関する設定画面。
   必要に応じてAWS のManaged Ruleにチェックすることで、ルールを遵守してAWSサービスが利用されているかを自動で確認してくれる。
   今回は特にチェックせずデフォルトのまま「Next」を押す
   ![config-003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/2f89de84-ac3f-cd9d-fb46-0493bf7c57d6.png)

4. レビュー画面。
   設定した内容について問題なければ[Confirm]を選択
   ![config-004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/55a8e3f8-acd2-0248-9fe4-7b930c2c89ea.png)

5. 暫くするとセットアップが始まり、評価結果などが見れるようになる
   ![config-005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/c9ea8b11-7dc9-6378-4392-0484263b79ae.png)

6. Amazon SNS画面を見ると、SNSトピックも作成されているので必要に応じてsubscriptionを作成し、通知設定を行います。
   (手順は割愛)
    ![config-006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/8db666bc-6a33-c917-fa99-b1b71a5e6107.png)

7. S3バケットも作成されている。
   証跡ログは`${指定したバケット名}/AWSLogs/${指定したPrefix}`フォルダ内に格納される。
    ![config-007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/ef8eaddb-6c06-a928-2cc6-3aecdee2fca9.png)

8. AWS Config設定画面は以下の通り。
   Configを有効化するとRecorderが「Recording is on」と表示されます。
   これで各種サービスがルールに遵守しているかなどを自動チェックしてくれます。
   検知した変更などについては指定したS3バケットにログが保管されます。
    ![config-008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/df81f2a1-b6f9-f16d-808f-68ffbc44289d.png)

    また、AWS Configに付与されているサービスリンクロールは以下のものとなります。
    AWS提供のものを利用する場合は、全てのサービスへのアクセス権が付与され、自動でリソース情報を取得するようになっている。
    ![config-009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/c4ac414d-11e6-ab37-dff6-dfc2bcda1ad5.png)

9.  CLI上では以下コマンドで設定を確認できる
    ```json
    // 配信設定のっp確認
    $ aws configservice describe-delivery-channels
    {
        "DeliveryChannels": [
            {
                "name": "default",
                "s3BucketName": "config-bucket-test-20221109",
                "snsTopicARN": "arn:aws:sns:ap-northeast-1:${AccounrtId}:config-topic-test"
            }
        ]
    }

    // レコーダー設定の確認
    $ aws configservice describe-configuration-recorders
    {
        "ConfigurationRecorders": [
            {
                "name": "default",
                "roleARN": "arn:aws:iam::${AccounrtId}:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig",
                "recordingGroup": {
                    "allSupported": true,
                    "includeGlobalResourceTypes": true,
                    "resourceTypes": []
                }
            }
        ]
    }
    ```

## 初期化方法
AWS Configは一度有効化するとコンソール上からは無効化できないようになっている。

もし、一度設定したAWS Configの設定を初期化したい場合はCLI上にて行う必要がある。
設定の初期化はDeliveryChannel、AWSConfigRecorder設定を削除すればOK。
事前にRecorderの設定はOFFにしておく必要がある。

1. Recorderの設定を無効化します。
   ![config-010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/b90137ba-3650-341a-e2e0-b7ed8f5de097.png)

2. 削除する前にCLIで設定を確認しましょう。
   CLIでの操作は`CloudShell`が便利です。
    ```json
    // DeliveryChannelの設定確認
    $ aws configservice describe-delivery-channels
    {
        "DeliveryChannels": [
            {
                "name": "default",
                "s3BucketName": "config-bucket-test-20221109"
            }
        ]
    }

    // AWSConfigRecorderの設定確認
    $ aws configservice describe-configuration-recorders
    {
        "ConfigurationRecorders": [
            {
                "name": "default",
                "roleARN": "arn:aws:iam::${AccountId}:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig",
                "recordingGroup": {
                    "allSupported": true,
                    "includeGlobalResourceTypes": false,
                    "resourceTypes": []
                }
            }
        ]
    }
    ```

3. 以下コマンドですぐに削除ができます
    ```json
    // DeliveryChannelの設定削除
    $ aws configservice delete-delivery-channel --delivery-channel-name default

    // AWSConfigRecorderの設定削除
    $ aws configservice delete-configuration-recorder --configuration-recorder-name default

    // 再度設定確認すると、削除されていることがわかる
    $ aws configservice describe-delivery-channels
    {
        "DeliveryChannels": []
    }
    $ aws configservice describe-configuration-recorders
    {
        "ConfigurationRecorders": []
    }
    ```

4. 削除後、初期セットアップ画面が表示されたら初期化成功
    ![config-011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/95855647-d5a9-fb65-88fa-21b3a3052e2c.png)


# Comments

## AWS Configのサービスリンクロールとは？
AWS Configの機能を利用するために必要な権限が事前に定義されているロール。
これをAWS Configに設定しないと、各サービスに対する設定変更情報などを取得ができない。

AWS提供のサービスリンクロールには、AWS管理のポリシー`AWSConfigServiceRolePolicy`が付与されている。
ここでAWS Configでサポートしている全サービスへのアクセス許可を実装している。

自分で作成することもできるが、さっさと有効化したい場合はAWSで事前に定義されたロールを利用するのも1つ。

AWS提供のサービスリンクロールは、指定されると同時に作成される。


[サービスにリンクされた AWS Config ロール](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/service-linked-awsconfig-rules.html)


## AWSグローバルサービスとは？
リージョン外で機能するAWSサービス。
リージョン選択画面で`グローバル`と表示されるサービスは基本的にAWSグローバルサービスである。
IAMやRoute53などはグローバルサービスである。
![config-012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/4e9a7396-895a-9baf-0fe0-a8e23e91ab87.png)


それとは反対に、リージョン内のサービスは`リージョナルサービス`と呼ばれたりする。
各種サービスの場所については以下記事などが参考になる
[AWS サービスがどこにあるのかまとめ](https://qiita.com/saitotak/items/d2ede050e7a2224da46d)


# Reference
1. [コンソールによる AWS Config の設定](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/gs-console.html)
2. [AWS Configはとりあえず有効にしよう](https://dev.classmethod.jp/articles/aws-config-start/)
3. [AWSマネジメントコンソールから消せないAWS Configの設定をAWSCLIで綺麗にする方法](https://dev.classmethod.jp/articles/delete-awsconfig/)