CloudWatchのアラームをSlackに通知する(Serverless Application Repositoryでやってみる)

# Serverless Application Repository とは
re:Invent 2017で発表された Serverless Application Repository が正式にリリースされました。

**AWS Serverless Application Repository Now Generally Available**
https://aws.amazon.com/jp/about-aws/whats-new/2018/02/aws-serverless-application-repository-now-generally-available/

Serverless Application Repository を使用すると、AWSやコミュニティ、パートナーによって公開されている
サーバーレースアプリケーションを数クリックで自身の環境にデプロイすることができます。
また公開さているテンプレートを利用するだけではなく、自身のアプリケーションの公開や
組織内の非公開での利用も行うことができます。

# やってみる
既に数多くのアプリケーションが公開されており、以下のURLからコンソールログイン不要で一覧を確認できます。

https://serverlessrepo.aws.amazon.com/applications

今回は [awslabs](https://github.com/awslabs/)でも公開されている[cloudwatch-alarm-to-slack](https://github.com/awslabs/serverless-application-model/tree/master/examples/apps/cloudwatch-alarm-to-slack) 
を使って CloudWatch アラームの Slack 通知を設定してみたいと思います。

## Incoming Webhookの設定(Slack)
まず Slack 側の設定を済ませておきます。
https://\<your-team-domain\>.slack.com/apps/manage/custom-integrations
から Incoming WebHooks の Configuration を追加します。

通知先のチャネル名を選択し、Add します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/49406b20-40d6-2573-9cf5-53a572544c54.png)

追加後、発行される Webhook URL を控えておきます。
Name や Icon は任意で設定し、設定を保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/a52e0aaf-e655-90bd-a3ab-2c71b4738a81.png)

## KMS キーを作成する
cloudwatch-alarm-to-slack では Lambda 関数の環境変数に設定する Slack の Webhook URL を
AWS Key Management Service で暗号化します。
以下の手順であらかじめカスタマーマスターキーを作成しておきます。

IAM コンソールメニューの暗号化キーから、リージョンを選択してキーの作成を押下します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/2540e2c1-dc73-9dd8-7cc2-41a2cca849f0.png)

手順1でキーのエイリアス名を入力し、次のステップに進みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/44175522-708e-34ae-1123-f6f0d10a9e39.png)

手順2のタグは任意で設定します。
手順3でキーを管理できるIAMユーザまたはロールを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/c25bea1d-e267-0fba-880e-eb08b10eef06.png)

手順4ではキーを使用してデータを暗号化、復号化できるユーザまたはロールを設定します。
Lambdaに設定する実行ロールを選択する必要がありますが、この時点では作成されていないので
そのまま次に進みます。

手順5で設定したポリシーの内容を確認し、キーの作成を完了します。
キーが作成されたらキーIDを控えておきます。


## アプリケーションのデプロイ
Lmabda の関数の作成ページでこれまでの、一から作成・設計図(buleprint)に加えて、
サーバーレースアプリケーションのレポジトリが選択できるようになっています。
ここでは slack や CloudWatch等で検索し、cloudwatch-alarm-to-slack を選択します。
デプロイ数はグローバルではなく、リージョン内でのカウントであるようです。

https://docs.aws.amazon.com/ja_jp/serverlessrepo/latest/devguide/serverless-app-consuming-applications.html

> (Note: The deployment counts are shown for the region in which you are trying to deployment application)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/cc8b2439-f1a7-d7ce-9691-a4ab17519437.png)

利用に必要な権限やライセンスの情報を確認することができます。
またデプロイは CloudFormation を拡張したモデルである、[AWS Serverless Application Model (AWS SAM)](https://github.com/awslabs/serverless-application-model)
をもとに行われるため、SAM テンプレートも確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/bbabf38b-df51-1cb3-30d2-f5a874071f6c.png)

ページ下部でアプリケーションの起動に必要なパラメータを設定します。
cloudwatch-alarm-to-slack では アプリケーション名に加えて、KMS キーIDの情報が必要です。
前の手順で控えておいたキーIDを入力し、デプロイします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/522d0e47-c387-82d5-bd57-a9cd84efd77d.png)

アプリケーションが正常にデプロイされることを確認します。
ステータス画面では作成されているリソースも確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/e61ea8bd-8189-29c1-b49a-5b1c457343dd.png)

cloudwatch-alarm-to-slackで作成されるリソースは以下の通りです。

* IAMポリシー&実行ロール
* Lambda 関数
    * 実行ロールおよびトリガーは設定済み
* SNSトピック
* サブスクリプション
    * エンドポイントとしてLambda 関数が登録済み
    
View CloudFormation Stack から実際のスタックも確認できます。
削除についてもCloudFormation からスタック毎削除します。


## KMS キーの編集
前の手順で作成したキーの詳細画面から、キーユーザーを追加します。
デプロイ時に作成されたIAMロールをアタッチし、変更を保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/87f2ad92-29a7-9562-75d0-98f2306d0a27.png)

## Lambda 関数の設定
デプロイされた Lambda 関数の環境変数に Webhook の URL および 通知先チャンネル名を設定する必要があります。
kmsEncryptedHookUrl には 前の手順で控えておいた Webhook URL を記載しますが、プロトコル部分を除いて
記載する必要があります。(ex. hooks.slack.com/services/abc123)

また暗号化の設定で **伝送中の暗号化のためのヘルパーの有効化** にチェックを入れます。
KMSキーの指定では前の手順で作成済のキー名を指定します。
その後、暗号化をクリックし、kmsEncryptedHookUrl を暗号化して Lambda 関数の設定を保存します。
slackChannel は 暗号化不要です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/98420d88-6616-b5cd-7b5c-0c542203104c.png)

## CloudWatchアラームへの通知先追加
デプロイ後、すべてのアラームが Slack に通知されるわけではありません。
アラーム毎に通知先を追加する必要があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/bad4eb3c-6db7-df3e-54db-4d7c2f5a8de3.png)

デプロイ時に作成されたSNSトピックを送信先に選択し、アラームの変更を保存します。
以上で設定は完了です。参考になれば幸いです。

## 通知の確認
実際にアラームを発生させ、通知先のSlackチャネルを確認すると内容を確認することができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/0bb880d1-e61c-b04c-af86-503c99076878.png)

# さいごに
今回 Serverless Application Repository リリース記念で試してみましたが、非常に便利なサービスだと感じました。
この他にも Alexa スキルのサンプルやサムネイル作成のような画像処理、splunk や Datadog へのロギングといったデータ処理
など、多種多様なアプリケーションが公開されていますので色々試してみたいと思います。