ACM証明書を自動更新してチャットボット経由で通知を受け取る

思い出したようにサーバー証明書の更新通知が来たので、復習を兼ねて設定方法をメモ。

ちなみに証明書はVue.jsのサンプルサイトやCloudFront+S3など、主にWebサイト系の素振り（たまに本番運用）をする際に使っている。
ドメインはRoute 53で構成。

## やりたいこと
- AWS Certificate Managerで運用している証明書の、1年ごとの更新を自動で行えるようにする
- 更新時にチャットボットを介して通知を受け取る

## 使ったサービス
- AWS Certificate Manager（ACM）
    - 2K証明書を無料で払い出し、更新するためにACMを使う。
- AWS Chatbot（Chatbot）
    - 証明書自動更新の通知をチャットツールに送るためのチャットボットを作るのに使用。
- Amazon Chime（Chime）
    - 普段使いしているチャットツール。ここでChabotから通知を受け取る。
- AWS Personal Health Dashboard（PHD）
    - 自動更新の通知をマネジメントコンソール上で受け取る仕組み。
- Amazon CloudWatch Events（CWE）
    - PHDのイベントを引っかけて処理するのに使う。
- Amazon Simple Notification Service（SNS）
    - CWEからメッセージをPublishし、SubscribeしているChatbotに通知するための繋ぎ目として使う。 

少々長いが、正しく構成すれば、

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/6885254f-36d6-02b3-6929-a134db97681e.png)

という流れで自動更新の通知が飛んで来るようになる。

イメージとしては、「証明書の自動更新」というニュースがニュースサイトに載ると、それを担当者がクリップして登録者に一斉配信し、登録者に名を連ねているボット君が配信メッセージを受け取ってチャットに投稿してくれる、といった感じ。自分でニュースサイトをウォッチしている必要がなくなるし、見落としも起きにくくなくなるメリットがある。

## ACMの証明書更新について
ACMで作成した証明書は1年で切れる。
更新方法は、ドメインの所有権の検証方法（リクエストしたユーザーがドメインの管理者であることを確認するプロセス）に対応する形で二種類存在する。

|検証方法|概要|更新|
|:--|:--|:--|
|Eメール検証|whoisの管理者アドレスにメールを送付し、所有権を検証する|手動|
|DNS検証|ドメインにACMがCNAMEを作成し、レコードの存在をもって所有権を検証する|**自動**|

以前サイト運用をしていた時はEメール検証を使っていたが、ドメインのwhois情報は一般にプライバシーを考慮してプロバイダーによる代理公開となっているため、メールが届かない。このため、更新時期にwhoisを一時的に解除して検証メールを受け取れるようにした上で承認を行う必要があり、大変面倒くさかった。
DNS検証にしておくと、ACMが登録したCNAMEがドメイン上に存在している限り自動的に検証され、whoisをいじる必要も、メールを開いて承認する必要もない。なので、よほどのことがない限りDNS検証にしておくのがおすすめ。
詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/how-domain-validation-works.html)。

## 通知
自動更新にしておけばほぼメンテフリーだが、一応更新の通知は受け取りたい。
証明書の更新はAWSの[Personal Health Dashboard（PHD）](https://docs.aws.amazon.com/ja_jp/health/latest/ug/getting-started-phd.html)で捕捉できるので、これをボットに食わせてチャットツールで受け取れるようにする。

## Step by Step
手順は以下の通り。
最初に「受け手」を構成し、次に「送り手」を構成する。

### 1. 証明書のリクエストとDNS検証の構成
マネジメントのコンソールにログインし、ACMノードを開く。
新規に証明書をリクエストし、その際ドメイン所有者の検証方法として**DNSの検証**を選択する。後は手なりでOK。
<img width="1050" alt="ACM" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/0fb9c17d-4845-0f48-26fa-fd07f77fe172.png">

### 2. Chime Webhookの作成
通知を受け取れるよう、チャットボットを構成していく。
まずは通知を受け取りたいChime Room（チャットツール上の部屋。Slackならチャンネル）を選択し、右上の管理ボタンから、Webhookを生成する。名前は何でもよい。
<img width="280" alt="Chime Webhook1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/60d55796-1e7a-d20f-a26b-23e62322269b.png">
![webhook-acm-room.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/dc065ccf-4b67-3a63-44ed-634f3ad1e8cd.png)

### 3. WebhookのURLをコピー
Webhookを作成したら、URLをコピーする。
<img width="640" alt="Chime Webhook1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/db3de208-2e84-2404-6c1f-9751c1601c84.png">

### 4. 新規Chatbotの作成
マネジメントコンソールからAWS Chatbotに移動し、新しいChatbotを作成する。
ChimeとSlackが選択可能。ここではChimeを選択。
<img width="599" alt="Chatbot1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/f6df4642-a91d-c512-139d-0d0a8b83f31a.png">

### 5. Chatbotの設定（1）
そのままWebhookの設定画面に進むので、先程コピーしたChime WebhookのURLを貼り付ける。
![webhook-acm-config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/c87ce49b-1c61-827a-c462-2cc42fe06f01.png)

### 6. Chatbotの設定（2）
CloudWatchにアクセスするためのIAMロール（今回はCloudWatchは関係ないが、設定上必須）と、指定したWebhookに通知を行うためのSNSトピックを指定する。ここでは、いずれも作成されている前提で進める。

|IAMロール|SNSトピック|
|:--|:--|
|role4Chatbot|myTopic-NotifyMe|

![webhook-acm-config2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/f6166e89-db95-797c-bf94-cb6f01f2d256.png)

設定が終わったら保存。
Chatbot（Webhook）が作成され、SNSにSubscriberとしてWebhookが追加される。

【Chatbot】
![chatbot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/eea6d264-6e5f-f5fa-c636-a6166379116c.png)
【SNS】
![sns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/6952dc46-c147-5c07-cd76-9446513101cc.png)

ここまでで、SNSトピックに送られた通知をChatbotで受け取り、Chimeに送るための仕掛けができた。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/a7954840-5949-d9b8-efc6-1d3a9b75b57c.png)

ただし、「受け手」を作っただけなので、これだけではまだ更新通知は届かない。

ACMの証明書更新通知はPHDに届くので、PHDのイベントを引っかけて、SNS経由でChatbotに送るための「送り手」を構成する必要がある。

### 7. CWEルールの作成
PHDの通知を受け取れるよう、CWEルールを設定する。
PHDの右上にCWEへのリンクがあるので、今回はここから飛ぶ。
<img width="341" alt="スクリーンショット 2020-05-15 17.00.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/c7b2b139-bc55-2e0b-94f0-a63b44d1fd01.png">

### 8. CWEルール：イベントソースの設定
CWEの構成画面から、イベントソースとして`Health`を選択する（`Health`はPHDを指す）。
<img width="853" alt="スクリーンショット 2020-05-15 16.59.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/697e7427-3645-adc1-7be7-955e970bb3a3.png">

### 9. CWEルール：ターゲットの設定
同じく、ターゲットとしてSNSを選択する。トピックは先程Chatbotで設定したものを使う（PublisherがCWE、SubscriberがChatbotの関係）。
<img width="860" alt="スクリーンショット 2020-05-15 16.59.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/5bf5beb9-4c26-6b1d-c0f4-5e0ae9150617.png">

あとはルール名を設定して完了。

受け手と送り手の構成ができたので、これで、1年ごとの証明書更新時にChimeに通知が届くようになる。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/4f0bfc26-6295-5cb8-6105-fe806bc0f081.png)

## 証明書更新の通知

更新日になると、DNS更新の恩恵で証明書が自動更新され、以下のようなメッセージがChimeに届く。
![webhook-acm-update.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/c31584b0-1185-d5ed-6599-cb8268b03535.png)

ちなみに、AWS BudgetsなどもChatbotに対応しているので、SNS経由でAWSの利用量アラートをChime（ないしSlack）で受け取る、といったことも可能。