AWS Configをサクッと試してみた

# 1. はじめに
運用も楽しく自動化できるといいなーと言うことで、
AWSの代表的な構成管理サービスであるAWS Configを軽く触ってみました。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/WhatIsConfig.html

https://www.youtube.com/watch?v=vnqX0gMj6jw

## 1.1. 【補足】AWS Configとは
AWS上に作成した各種リソースをまとめて構成管理してくれるサービスです。
リソース構成の変更を継続的に評価、モニタリング、記録してくれます。

また、AWS Config マネージドルールやカスタムルールを設定することで、リソースが所定のベストプラクティス、業界規制、独自ポリシーに準拠しているかを評価できます。PublicIPがEC2に付与されていないか、S3がパブリックアクセス可能になっていないか、など。。。

今回は触っていないのですが、ルールを守れていないリソースを、Config側から設定変更することもできます。


# 2. 設定してみる
マネジメントコンソールから有効化してみます。

![cap1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/45294fb6-f8d5-cc29-ddef-55942584992b.png)

リージョン内にレコーダーを作成します。レコーダーとは、リソース構成の記録と配信を行う基本的な単位です。

![cap2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/e8f76da4-bab1-9f8f-d16c-8ed979cbed2a.png)

設定を行っていきます。
記録戦略には「特定のリソースタイプ」を選択します。
記録するリソースタイプのプルダウンが表示されるので、テストのためS3バケットを選択します。

構成状態の記録頻度は「日次」または「連続」から選ぶことができます。
今回は「連続」を選択し、変更が起こるたび、構成状態を記録します。

※「カスタマイズ可能なオーバーライドのある全てのリソースタイプ」を選択すると、リージョン内の全てのリソースの構成を管理できます。カスタマイズ可能なオーバーライドのある、とある通り、全てのリソースを監視対象としつつ、一部は監視対象外にするなどのカスタマイズが可能です。

![cap3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/81d53eb2-5a32-2e13-d17c-62a0dd1ae200.png)

サービスロールを設定します。
「サービスにリンクされたロール」を選択します。[AWSConfigServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSConfigServiceRolePolicy.html)というポリシーを持つAWS管理のサービスロールが使用されます。（Read権限がほとんどですが、全てのリソースの状態を取得できるようなポリシーなので、気になる方はロールを用意するのがおすすめです。）

配信方法で設定スナップショットを保存するS3を設定します。

![cap4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/63eeb827-d39c-99d5-00bc-11cd7ecabde8.png)

監視対象リソースに適応するルールを選択します。
今回はテストとして、S3バケットがパブリックリードアクセス可能となっているかを監査する「[s3-bucket-public-read-prohibited](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-public-read-prohibited.html)」ルールを選択します。

![cap5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/64eb06f4-27b4-4fd8-6261-f7dfa5dd3f30.png)

確認をクリックすると、レコーダーが作成され、S3バケットの構成管理が開始されます。


# 3. 動作確認

マネジメントコンソールから、リソースの状況を確認してみます。

![cap6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/6ac4d443-1430-08e7-cffd-fbc114faf9f9.png)

ルールを全てパスしている準拠リソースが1つあることが分かります。

![cap7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/89cae8c0-0ea9-3697-346d-fa228b9b50e0.png)

クリックして、リソースの詳細を確認してみます。
AWS Configレコーダーのスナップショットを保存するためのバケットが、さっそく監視されていました。
パブリックアクセスできない設定のため、コンプライアンス準拠判定になっています。

![cap8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/fa68bf7d-c9f4-c3c3-0ea8-9636ae90dc55.png)

テストのため、S3バケット「my-test-paburikku-baketto」を新たに作成しました。
リソースのインベントリ内に、新た作成されたバケットが記録されました。

## 3.1. 記録しているリソースの設定状況を確認
リソースの設定状況を一覧できるのも、AWS Configの嬉しいトコロです。
リソースの詳細画面から、実際に設定状況を確認してみます。

![cap9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/2c4d4f78-ce77-2afb-9af8-faac6d37edba.png)

S3の設定が一覧されています。

![cap10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/3635398a-abff-0272-1ad0-eb83dd44bd9a.png)

下の方に行くと、json形式でも一覧できます。

![cap9_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/ebe60360-6d92-fa55-edf0-f23bbb9e5f7a.png)

また、上部「リソースタイムライン」から、リソースの変更履歴も確認できます。

![cap14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/bf761aab-3f48-72f1-651f-7117635b3d11.png)

設定の変更内容と、その際のCloudTrailイベントが記録されています。すごい

![cap15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/0b844cb9-bf75-8540-d89f-d2436ec7cc80.png)

中身を展開してみました。
リソースの変更差分や、履歴が辿れます。これは便利！

## 3.2. ルールに違反しているリソースを確認
設定したルールに違反しているリソースが存在する場合の挙動を確認してみます。

![cap12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/c4c05ee9-ddf3-a3d5-d6e3-d195bd9541c0.png)

バケットポリシーを変更し、パブリックアクセス可能な状態にしてみました。
再びリソースのインベントリ画面を確認しにいきます。

![cap13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/57ca911c-8d68-55e6-0363-94d0597d53e4.png)

変更したバケットがコンプラ非準拠と表示されました！

リソース群の監視、構成管理記録や、監視ルールの挙動を確認できました。

## 3.3. リソースの設定スナップショットを確認
指定したS3バケットへのスナップショット機能もテストしてみます。

> AWS Config AWS リソースの設定の変更を追跡し、更新された設定の詳細を指定した Amazon S3 バケットに定期的に送信します。 AWS Config 記録するリソースタイプごとに、6 時間ごとに設定履歴ファイルが送信されます。各設定履歴ファイルには、その 6 時間の間に変更があったリソースの詳細が含まれています。各ファイルに含まれるリソースタイプは 1 つです (Amazon EC2 インスタンスや Amazon EBS ボリュームなど)。設定が変更されない場合、 AWS Config はファイルを送信しません。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/how-does-config-work.html

デフォルトでは、S3へのスナップショット記録は6時間に1度とのことです。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/deliver-snapshot-cli.html

aws cliで任意のタイミングでスナップショットを別途記録できるので、そちらの方法でテストしてみます。

```bash
$ aws configservice describe-delivery-channels --output=json
{
    "DeliveryChannels": [
        {
            "name": "default",
            "s3BucketName": "s3-config-history-test-xzdesnzvz"
        }
    ]
}
```
コマンドのため、delivery-channelsの名前を取得します。
マネジメントコンソールから作成した場合は、nameがdefaultでチャンネルが作成されていました。

```bash
$ aws configservice deliver-config-snapshot --delivery-channel-name default
{
    "configSnapshotId": "2b7a0d18-5f9e-4c3b-9d6c-b7f32e5d1f9a"
}
```

snapshotを作成するコマンドを実行します。成功するとIdが返ってきます。

![cap16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/5da9e78b-b4fe-0013-3178-ed3715dd764b.png)

S3を確認すると、圧縮されたjsonが保存されていることが確認できました。
構成管理データの永続化も問題なくできていそうです。

## 3.4. リソースの設定変更をSNSへパブリッシュ
AWS Configでは、S3への定期的なスナップショットのほかにも、変更を随時SNSへパブリッシュできる機能が備わっています。
コンプラ非準拠をSNSへ知らせ、lambdaやSQSへ連携できるわけです！試してみます。

今回は、Config > SNS > lambda > cloudwatchとパブリッシュされたイベントをパスし、内容を確認します。

![cap19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/f9e6ce00-0159-0567-d994-43ae0ce2192f.png)

まずはテスト用にトピック「sns_test_topic」を作成し、上記アクセスポリシーを付与しました。
**[AWSConfigServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSConfigServiceRolePolicy.html)には```sns:Publish```を明示的にAllowするポリシーが含まれていない**ため、トピック側のアクセスポリシーで明示的に許可しています。

```index.js
exports.handler = async (event, context) => {
    console.log(event.Records[0]);
    return 'Hello from Lambda!';
};
```

また、SNSには上記関数を実行するlambdaをサブスクさせています。
SNSイベントをログ出力し、どのようなイベントがパブリッシュされるかをcloudwatchで確認します。

![cap17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/1e6f5ba1-a4ab-fb4b-2c62-3dbb1348dff9.png)

SNSトピックの準備ができたので、AWS Config側の設定画面から、SNSトピックを設定します。

S3の設定を適当に変更して、ログの内容を確認します。

### 3.4.1 リソースの設定変更イベント

全ての設定変更内容は随時SNSへパブリッシュされます。

![cap20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/98ecc27c-d10f-eb92-8fa7-4b4c96c7d40b.png)

S3のパブリックアクセスブロック設定を変更した際のログです。
変更箇所が記載されていることが確認できます。


### 3.4.2 設定変更によるルール非準拠化イベント

設定変更により、リソースがあるルールに非準拠する状態になった場合、追加のイベントがパブリッシュされます。

![cap21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/8a17d13d-1b71-1db6-57af-271cde42438b.png)

ルールに対し、NOT_COMPLIANT（非準拠）している状態であることがパブリッシュされていることが確認できます。

### 3.4.3 設定変更によるルール準拠化イベント


同様に、設定変更により、リソースがあるルールに準拠する状態になった場合、追加のイベントがパブリッシュされます。

![cap22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/97cdf222-25ac-8cd9-a19b-8a78d4d066a1.png)

ルールに対し、COMPLIANT（準拠）している状態であることがパブリッシュされていることが確認できます。

## 3.5. config設定の無効化
主な機能は動作確認したので、記録を止めてみます。

![cap23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/5f028053-1c6e-4a7d-7ae7-bad2d919c26d.png)

![cap24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/6e721341-85d3-8bab-9b3d-1109a7fbb684.png)

![cap25.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/02d521b3-0b99-a91c-4639-fab71c8ec454.png)

設定画面から、設定を変更します。

![cap26.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/e975cd6a-f0f0-1897-47e1-8164551de4a2.png)

レコードが記録停止になったことが確認できます。

![cap25_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/bfdedb9f-fc0f-3d48-7c01-f69b4c469c97.png)

途中のダイアログにもあったように、記録自体は残り続けるようです。
内部のリソース（レコーダー、チャンネル、ルールなど）も削除自体はされていません。
サービスの特性を考えると当然ですね。

# おわりに
SAAで何度も出題され、気になっていたAWS Configを触ってみました。
実際の現場でもぜひ使っていきたい便利なサービスで、とても楽しかったです。

使いそうなAWSサービスで遊ぶのは楽しいので、
遊ぶ、現場で提案してみる、遊ぶ、、、のループを回したいです！