NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

CloudFormation実行パターンについてまとめてみた【緊張の一瞬を乗り越えろ】

本記事は NRIネットコム Advent Calendar 2021 7日目の記事です。
6日目 ▶▶ 本記事 ▶▶ 8日目 🍰

こんにちは、栗田です。これまでイベントの告知でちょこちょこブログに現れていましたが、しっかり記事を書くのは実は初です。 Apple Watch7と美味しい牛タンは引き続き募集しております。

私がブログ運営以外にどんな仕事をしているかというと、主にAWSを使ったお仕事です。というかAWSの方がメイン(のはず)です。

デプロイって緊張しませんか?

いきなりなんですかって?でも緊張しますよね??
だって環境に変更が入るんですよ?うまくいきますように、でも失敗したらどうしよう、エラー出たら嫌だな、直すのめんどくさいな、なんか壊れて取り返しがつかなくなったら......考えたらキリがありません。キリがないので実行のボタンは早いうちに押さないといけません。

現在携わっているプロジェクトでは、CloudFormation(以下、CFn)のスタック実行によるデプロイを行っています。 スタック実行やスタック更新のボタンを押すたびに非常に緊張します。
CFnの実行には、大きく3通りあり、状況によってどの方法を使うかが変わってきます。

f:id:maokurita:20211206185601p:plain

新規スタック作成

デプロイしたいCFnファイルに書かれているリソースがなにも作られていない場合は簡単です。新規にスタックを作ればOKです。

スタック作成に失敗したら

あまり考えたくないですが、スタック実行に失敗してしまうときもあります。 その場合はスタックをいったん削除しやり直すことになりますが、削除する前に、失敗時点でどんなリソースが作られたのか確認しておきましょう。 複数のリソースを作るようなスタックの場合、一部のリソースが CREATE_COMPLETE になっていることがあります。そのリソースはスタック失敗時にロールバックされず残ることがあります。
リソースが一部残ったままスタックを再実行すると、今度は xxxxx(残されたままのリソース) is already exists. と表示されてまたスタックが失敗し、泣くことになります。辛いです。
スタック失敗時に残ってしまったリソースがないか確認し、もしある場合はスタック再実行の前に必ず削除しておきましょう。

変更セット

デプロイしたいCFnファイルですでにリソースを作っており、ルールをなにか追加したとかセキュリティグループが増えたとか減ったとかといった様々な事情で、CFnファイルを更新した部分をデプロイしたい場合に役立つのが変更セットです。 変更セットを使わず新規デプロイでも更新は可能ではありますが、どのような変更がなされるのかは実行してからでないとわかりません。もしかすると必要だったリソースが削除されてしまいほかの部分にまで影響を与えてしまうかも...環境壊れちゃうかも...なんて考えると恐ろしいです。怖すぎます。スタック実行ボタン押せません無理です。 やはり変更セットを使っておくのが良いでしょう。

変更セットを使うには、既存スタックの「更新」をクリックするか、「スタックアクション」→「既存スタックの変更セットの作成」から更新をかけます。

f:id:maokurita:20211203184545p:plain

その後は既存テンプレートを置き換えて、通常のスタック実行と同様に実行すれば更新が可能です。 変更セットを作成すると変更内容のJSONが表示されます。

f:id:maokurita:20211203193219p:plain

requiresRecreation:Never となっていれば、リソースが削除されることはありません。安心です。
attribute はこの変更セットで更新される箇所、changeSource は変更される要因を示します(DirectModification:CFnテンプレートの直接変更)。変更セットを実行する前に、JSONでこのあたりを確認しておくと良いでしょう。

ドリフト検出

車の話ではないです。ちなみに私はつい最近までドラフトと勘違いしてました。

CFnでデプロイした後、マネジメントコンソールから手でリソースを変更することが可能です。ただしその場合、デプロイしたスタックとの整合性が取れなくなってしまいます。本来はCFnでデプロイしたあとに手でリソースを変更するのはあまりよろしくありません。しかし、諸事情で仕方なく変更してしまったとき・手でリソースをいじったかどうか曖昧もしくは記憶にないとき、変更箇所を検出することができるのがドリフト検出です。

ドリフト検出は「スタックアクション」→「ドリフトの検出」から実行します。押すとすぐに検出が開始されます。

f:id:maokurita:20211203184545p:plain

スタックドリフトステータス 文字色 内容
NOT_CHECKED グレー ドリフト検出未実行
IN_SYNC CFnスタックと実際のリソースとの差分がなく、期待されるテンプレート構成と一致
DRIFTED CFnスタックと実際のリソースに差分あり。リソースがひとつでも異なっていたらスタック全体がこのステータスになる

IN_SYNC だった場合はそのまま変更セットの作成を行ってスタックを更新して問題ありません。
DRIFTED だった場合、CFnと実際のリソースは異なったものになっています。ドリフト詳細から変更内容を確認し、リソースかCFnテンプレートを修正する必要があります。

まとめ

この記事では、CFnの実行パターン3つについてざっくりとではありますがまとめてみました。
インフラもコード化やテンプレート管理が主流になってきている最近、CFnをはじめとするInfrastructure as Codeサービスを使う機会は多くなると思います。 本記事によってコードの自動管理に苦しむ方がひとりでも減れば幸いです。

NRIネットコム Advent Calendar 2021
🎁 6日目 ▶▶ 本記事 ▶▶ 8日目 🍰