CloudFormationのドリフト検知するLambdaをServerlessRepositoryに公開しました！

公開したアプリケーションは[こちら](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:703976800898:applications~detect-stack-drifts)です。記事を読まずに飛びたい方はどうぞ。

先週、ついにdetect stack drift のAPIがついにリリースされました！
re:Invent 2017でも発表されていましたが、待望の機能がついにリリースされて嬉しく思います。
これにより、AWSCloudformationを使用した運用が安心して回せるようになりますね！

[AWS News Blog](https://aws.amazon.com/jp/blogs/aws/new-cloudformation-drift-detection/)
[AWS CloudFormationで手動で行った変更が検出可能になりました！！！](https://dev.classmethod.jp/cloud/aws/cloudformation-support-drift-detection/)

> 今回のアップデートであるドリフト検知はre:Invent 2017のセッションで発表されていた機能で、現在の状態とCloudFormationで定義されているあるべき状態の差分を検知することができる機能です。

> 初期の構築ではCloudFormationを利用するが、後のアップデートではUpdate Stackを実行せずに手動で変更したりCloudFormation以外の手段で変更してしまうことが多々あります。一旦別の手段へ変更してしまうと、テンプレートとの差が分からなくなりCloudFormationを利用した構成管理が行えなくなり、大きな問題になっていました。

> 実際のリソースとCloudFormationテンプレートの内容に乖離があることをドリフトと言い、それが可視化できる様になりました。

ということで、早速使ってみましょう。

# ドラフト検知をコンソールから実行する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/789867e3-6bd5-6b76-e170-5cd33a25af30.png)

そのままだとdetect driftのステータスがスタックの一覧から確認できないので、設定しましょう。
右上の歯車のアイコンから**Drift status**, **Last drift check time**にチェックを入れればOKです。
旧コンソールだとたしかデフォルトで表示されていたような・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/d6dc68ce-0e7e-df76-1cff-838643d28aea.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/ea37935e-d9ef-538c-6aff-f9063dbb6656.png)

設定ができました。
スタックを初期構築した時点だとドリフト検知は行われていないのでコンソールから実行してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/32aeaffa-8694-2602-18fe-295845510d85.png)

スタックを選択して、Actions > Detect drift で実行です。
ドリフト検知が完了すると、**IN_SYNC**のステータスになるかと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/dd3ed0e5-70d4-6615-c634-09b2762ffbae.png)

## スタックとして構築されたリソースを変更してみる

さて、次は構築されたリソースの一部をAWSコンソールから手動で変更してみましょう。
今回Cloudformationによって作成されたセキュリティグループのルールを変更してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/daf7eccc-c5da-cd49-8db2-d2397d173336.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/13d5407e-602f-0d82-05ac-dfd360115ea7.png)


インバウンドルールに3306ポートをパブリックに解放するルールを追加してみました。
これでテンプレートに記述した状態と、実際に構築されているリソースとの間に差が生まれました。
さっそくドリフト検知をしてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/78ccb5d6-986d-7fda-e0ce-918df25dd533.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/263f589b-adc7-6961-a07e-c224e4e42e61.png)

ドリフトが検知できました。
どの部分がテンプレートと差があるのか詳細を追ってみてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/c9b8da60-1809-cb52-b930-77c713c186ec.png)

リソースを選択して、**View drift result**から確認です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/5f7edf40-479d-5134-e785-d8c984292f1e.png)

今回は想定通り、セキュリティグループにインバウンドルールを追加したことが見て取れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/8cd7e9c0-fb53-ef91-732e-414d2bdd1e9a.png)

これでCloudformationを使用する際に怖がることは無くなりますね！


## 実運用のつらみ

AWSコンソールからドリフト検知が行えるようになったのはとても嬉しいのですが、
実際にチーム開発をしていると、ふとした時に誰かがリソースを勝手に変更してしまうというケースはよくあるかと思います。
さらに言えば、スタックが１つ２つの場合は手動で実行してみれば良いのですが、スタックの数が５０、６０個と増えてくるとそういうわけにも行きません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/327c9243-cc08-cc3e-a8ec-78db36eba339.png)


そこで**すべてのスタックに対して毎日ドリフト検知を行う**バッチを作ってしまいましょう。
今回はLambdaで実装してみましたので、せっかくなのでServerlessRepositoryに公開しました。

作成したものは[こちらのアプリケーション🎁](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:703976800898:applications~detect-stack-drifts
)です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/f513bf99-2ed3-0f83-1b76-cbd6ca8afc52.png)



右上の**deploy**ボタンを押せばすぐにこのアプリケーションをデプロイすることができます。
Lambdaのコンソール画面に移動しますのでIAMロールが作成されることを許可して（チェックボックスにチェック）デプロイしましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/e72fb22e-fe92-2064-cd31-83c057bbefd9.png)

アプリケーションが作成され始めます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/8cd30098-4aee-20da-e34b-3dcd7de0d909.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/4195c849-50d8-9a3e-d032-db54287866ad.png)

作成完了したら、完成したLambdaをテスト実行してみましょう。
CloudwatchEventsで毎日10時に起動するようにはしているのですが、テストイベントをぶち込めば実行が可能です。
Lambdaの画面からテストイベントを作成してテストを押せばOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/a91c6fd2-2474-f6d5-769d-bc6d081969cf.png)

最後にスタックの一覧を確認しておきましょう。
全てのスタックに対してドリフト検知が行われました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/91a751c9-f339-72d2-0f62-11dae278e2a5.png)

Lambdaで作成したアプリケーションをServerless Repositoryに公開する方法はまたの機会に記事にしようと思います。
まずは取り急ぎ、ドリフト検知のご紹介でした✋