📝

CloudFormationスタックのドリフトってなんだろ?

2021/06/02に公開

ドリフトの検出とは?

ドリフト検出のチェックを開始すると、CloudFormation が、現在のスタック設定と、スタックを作成または更新するために使用された、テンプレートが指定する設定とを比較し、誤差があれば報告し、それぞれの詳細な情報を提供します。
新 – CloudFormation ドリフト検出 | Amazon Web Services ブログより

CloudFormationテンプレートの内容と、実際のリソースの異なる点を発見してくれる便利な機能です!
某頭文字がDのドリフトとは無関係です。

例えばこんなかんじです。
A「CloudFormationでt2.microのEC2インスタンスを作ったよ」
A「でも性能足りなかったからEC2コンソールからt2.mediumに変更したよ」
CloudFormation「ちょっと待って!ドリフト検出したらテンプレートの内容と実際のインスタンスサイズが違うよ!」

実際の検出画面です。ALB、ALBリスナー、ターゲットグループを作成したテンプレートから検出しています。

何のために使うの?

アンマネージド型の変更は、再起動時に問題を発生させる要因となります。実行中のスタックの設定がテンプレートから乖離してしまい、適切に記述されなくなるためです。深刻なケースでは、変更によってスタックの更新や削除が妨害される場合もあります。

ポイントはアンマネージド型の変更、つまり手動での変更です。
先ほどの例で言うと、EC2コンソール上から変更した部分にあたります。何がいけないの?
実は手動での変更が予期せぬトラブルの原因になるかもしれないのです。以下の部分です。

深刻なケースでは、変更によってスタックの更新や削除が妨害される場合もあります。

実体験を1つ挙げると、複数のセキュリティグループ間の通信を手動で変更した後に、CloudFormationからスタックを削除しようとした際、「依存関係があるため削除できません」という内容のエラーが発生しました。
こういったエラーを避けるために、スタックの更新や削除前にドリフトの検出を行い、テンプレートとの差分をなくすということができるのです。

ベストプラクティスをチェック!

スタックを起動した後、AWS CloudFormation コンソール、API、または AWS CLI を使用して、スタック内のリソースを更新します。スタックのリソースを AWS CloudFormation 以外の方法で変更しないでください。変更するとスタックのテンプレートとスタックリソースの現在の状態の間で不一致が起こり、スタックの更新または削除でエラーが発生する場合があります。
AWS CloudFormation ベストプラクティス - AWS CloudFormationより

そもそもCloudFormationで作成したリソースには手動で変更を加えないでね!と言っています。
ドリフトの検出は万が一手動で変更しちゃった場合の保険という考え方もできますね。

実際に試してみよう!

冒頭に実際の画面を貼りましたが、改めて検出までの流れを見てみましょう!
前提として、スタックをCloudFormationで作成済みであるとしますが、試すだけなら簡単なものでOKです。

まずはマネジメントコンソールからCloudFormationコンソールに移動しましょう。

スタック一覧からドリフトの検出を行うスタックを選択します。

右上のスタックアクションから、ドリフトの検出をクリックします。

画面上部にドリフトの検出を開始したというメッセージが表示されます。

スタックアクションから、ドリフト結果を表示をクリックします。

ドリフトの検出結果が表示されます。
今回は手動での変更を加えていないので、IN_SYNC、つまり差分はなしという結果になりました。

リソースごとの詳細な結果も見てみましょう。
論理IDを1つ選択して、右上のドリフトの詳細の表示をクリックします。

詳細な結果が表示されました。
差分なしと表示されているので、テンプレートと実際のALBの設定に差分はないことが確認できました。

差分を発生させてみよう

先ほどは差分なしの結果だったので、今度はALBに手動で変更を加えてみたいと思います。
EC2のELBコンソール上で、ALBにアタッチするセキュリティグループを追加してみました。

再度CloudFormationコンソールでドリフトの検出を行います。
すると、今回はスタックのドリフトステータスがDRIFTEDになり、リソースのドリフトステータスはMODIFIEDになりました。
詳細も見てみましょう。

こちらが詳細なステータスです。
ロードバランサーにセキュリティグループがADD、つまり追加されたことが分かります。また、追加されたセキュリティグループのIDも表示されています。

さらに、セキュリティグループにチェックを入れてみます。

すると、差分が発生している箇所を色付きで表示してくれました。Gitみたいですね!

この結果から、ALBにセキュリティグループが追加されており、テンプレートの内容と違うよということがわかりました。
では、正常なCloudFormation更新のために、差分を元に戻しましょう!
ALBのセキュリティグループの設定を元に戻してと。これで差分がなくなっていればいいな。

再度ドリフトの検出をした結果、無事IN_SYNCになり、差分はなくなりました!安心安心。

まとめ

今回はCloudFormationのドリフトの検出について紹介してみました。安全に意図したとおりにCloudFormationの更新や削除を行うためには、実際のリソースとの差分をなくすことが大切です。一時的に変更した設定を戻し忘れたときなどにも活躍する機能なので、CloudFormation実行前に毎回実施するとよいと思います!
CloudFormationのベストプラクティスには変更セットの使用という項目もあり、併用することでより安全に意図した内容で更新や削除を行うことができます。
ドリフトの検出と変更セットで安心安全なCloudFormationライフを!

Discussion