【AWS Config】基本設定と簡単な動作検証

##目標
AWS Configを開始し、簡単な動作確認を行う。

##AWS Configとは
AWSアカウント内に存在する各種AWSリソース（EC2、EBS、セキュリティグループ、VPCなど）の構成情報を取得し、管理するサービスです。
主要な利用目的としては、以下の２点が挙げられます。

①取得したAWSリソースの構成情報が利用者によって事前定義されたルール（ElasticIPが付与されているか、暗号化ボリュームを利用しているか、必須タグを使用しているか…等）と合致しているかを評価する。
②AWSリソースの構成変更履歴（いつ、どのように作成、変更、削除が行われたか等）を記録する。

より詳しくはAWSドキュメント参考
[AWS Config とは](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/WhatIsConfig.html)

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [Configを開始する](#1configを開始する) |
| 2 | [動作確認](#2動作確認)|

##手順
###1.Configを開始する
**①AWSコンフィグコンソールへ移動し、`今から始める`をクリック**
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/a296d1ae-07ac-9fb5-018c-851e83e8d90e.png)

**②設定**
まずはAWS Configで構成情報取得の対象とするAWSリソースを選択します。
今回はデフォルトの`このリージョンでサポートされているすべてのリソースを記録します`（AWS Configでサポートされている対象リージョンの全AWSリソースが構成情報管理の対象となります）で設定します（※）。


※補足
`グローバルリソース (AWS IAM リソースなど) を含める`を選択すると、IAM ユーザー、グループ、ロール、およびカスタマー管理ポリシーもAWS Configによる構成情報取得の対象となるようです。
また`このリージョンでサポートされているすべてのリソースを記録します`のチェックを外し、`特定の型`に対象AWSリソースを記載することで、構成情報取得の対象を絞り込むことも可能です（コストパフォーマンスに優れ、かつ注意したいAWSリソースのみに集中出来そうです）


![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/664e3cc6-13e3-c69f-4fca-57a54c191289.png)

次に取得したAWSリソース構成情報のスナップショット格納先S3バケットを設定します。
今回は`バケットの作成`を選び、新しくバケット作成をしてみます。

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/dfa7e717-c3d7-ea71-09a3-1ff4d0984f58.png)

SNSと連携することで、AWSリソースの構成情報に変更があった場合、Eメール等を利用した通知を行うことができます。
今回は新規作成したSNSトピックと連携させてみます。

`Amazon SNSトピックへのストリーム設定の変更と通知。`
⇒`トピックの作成`を選択

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/192a74cc-6250-00dc-e5b8-bac7baee0f80.png)

最後に各種AWSリソースへのアクセス権を付与したIAMロールをAWS Configに付与します。
特に使用したいロールがなければ`既存のAWS Configサービスにリンクされたロールを使用`でOKかと思います。

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/c9464e4e-21be-053a-f2fd-569bac48449a.png)

終わったら`次へ`を押下

**②ルール選択**
取得したAWSリソースの構成情報と照合するためのルール（※）を選択します。
ここではサンプルとしてEC2の`eip-attached`（EIPがEC2インスタンスに付与されているか判定）と`encrypted-volumes`（アタッチされているEBSボリュームが暗号化されているか判定）を選択

※補足
ルールはAWS Configセットアップ後でもカスタマイズ可能です。
ルールにはAWSがベストプラクティスに基づいて提供する「マネージドルール」（今回選択したのはこれ）と、利用者がカスタム開発する「カスタムルール」（Lambdaと連携して動作するようです）が存在します。

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/372fd4dc-8ef5-76c5-f230-604e83361107.png)

選択したら`次へ`押下

**③設定内容確認**
`確認`押下
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/d3604793-6355-d064-f6e7-e707a60b56a6.png)

**④Configダッシュボード作成確認**
しばらくしたらAWS Configのダッシュボードが作成されました。
正常に結果反映されるまで数分かかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/672cca45-e5f8-b5b0-0024-9e82be02ff9c.png)

**⑤SNS通知のセットアップ**
SNSコンソールから`トピック`を選択し、AWS Configと一緒に作成したSNSトピックをクリック
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/4e772fe7-45c7-70ef-9166-283410a0701f.png)

対象トピックにはまだサブスクリプション（※）がまだ作成されていないので新規作成します。
`サブスクリプションの作成`をクリック

※サブスクリプション
あるSNSトピックからのメッセージの受け取り手のこと。
httpやEメール等、様々なプロトコルを介してのトピック通知に対応している。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/91a1e847-27e7-6832-3216-39b481b1dfbe.png)


今回はEメールによるSNS通知を利用してみます。
受け取るメールアドレスを入力したら、`サブスクリプションの作成`をクリック
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/c5a6dda2-f5ae-1183-2418-5b0514e641f4.png)

その後、設定したメールアドレスにメールが来るので`Confirm subscription`をクリックしメールアドレス認証を完了させれば通知設定完了です。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/5224d40a-fdca-6944-4bd5-abf06e778860.png)


###2.動作確認
**①AWSリソース構成情報と定義ルール間の照合機能**
非準拠の定義ルールを全て準拠にしてみます。

**＜初期状態＞**
非準拠ルール：　2つ（`eip-attached`と`encrypted-volumes`が違反）
非準拠リソース：　3つ（`eip-attached`で1つのEIP、`encrypted-volumes`で2つのEBSボリュームが違反）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/ce33618d-63e6-c659-5fde-31c8e602b878.png)

※設定ルール内容
`eip-attached`：EIPがEC2インスタンスに付与されているか判定
`encrypted-volumes`：アタッチされているEBSボリュームが暗号化されているか判定

**＜過程＞**
`eip-attached`⇒非準拠EIPをEC2に付与して解消を試みる
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/4b1d2c96-b448-1472-6dbe-40feae1768d7.png)


`encrypted-volumes`⇒非準拠2ボリュームを暗号化させます（EBSスナップショット取得して暗号化ボリューム作成）。元の非準拠の2ボリュームは削除した

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/25155ac3-c869-5562-f935-484817f3bd10.png)


各ルール詳細から`再評価`実行（定期的に評価は行われるが検証迅速化のため実行）
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/4f1e5942-6a38-95d3-7199-37ccebedf071.png)

**＜結果＞**
全ルールを準拠させることが出来ました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/163eb9a3-1126-4c0c-4b4d-b281f75a282b.png)

**②AWSリソースの構成変更履歴確認機能**
AWS Configでは対象のAWSリソースの作成、変更、削除等が行われた際に、それを構成変更履歴として残します。
試しに、ある1つのセキュリティグループの80番ポートを新たに開けてみたところ、
数分後に変更したセキュリティグループに関するSNSからのメール通知を取得出来ました。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/77a86e04-9c26-bcd3-2681-4901bbc86bef.png)

メールのリンクをクリックすると、AWSコンソール上からどのような構成情報の変更がなされたかの詳細を確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/1291f7e2-c910-b558-e288-2aed56f76b55.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/61467516-4bfb-1d9f-6acb-fc424f194f45.png)

また、構成情報のスナップショット格納先として指定したS3バケットには各種リソースの構成情報をまとめたログファイルが格納されているのも確認できました（6時間ごとに格納しているらしい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/418581c0-6553-4f81-f021-ef38b4c9c37d.png)

##使い終わったら
構成情報取得が不要になった際はAWS Configコンソールの`設定`⇒`オフにする`にして余計な課金を防ぎます。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/2200ad9e-474b-7fec-61c1-1184a9b0258d.png)

またAWS CLIを利用することでAWS Configの設定自体を削除することも可能でした（※）。
※参考にしたサイト
[AWSマネジメントコンソールから消せないAWS Configの設定をAWSCLIで綺麗にする方法](https://dev.classmethod.jp/articles/delete-awsconfig/)

```bash

# AWS Configの設定状況確認
$ aws configservice describe-delivery-channels
{
    "DeliveryChannels": [
        {
            "snsTopicARN": "arn:aws:sns:ap-northeast-1:932699493995:config-topic",
            "name": "default",
            "s3BucketName": "config-bucket-932699493995"
        }
    ]
}

# AWS Config削除実行
$ aws configservice delete-delivery-channel --delivery-channel-name default

# AWS Config削除確認
$ aws configservice describe-delivery-channels
{
    "DeliveryChannels": []
}
```