🎉

Terraform Cloud に新機能 Drift Detection がやってきた!Drift を継続的に監視&通知してくれる

2022/06/22に公開

はじめに

現在開催中の HashiCorp の年次カンファレンス、HashiConf Europe で、Terraform Cloud の新機能 Drift Detection が発表されました。

https://twitter.com/HashiCorp/status/1539147184993619969

  • Drift Detection 機能は現在 Public beta 期間です。
  • Terraform Cloud Business Plan で利用可能です。
    • どうしても気になる方は DM で相談してください (お約束はできませんが)。
  • GA リリースの際には (時期はまだ未定) たぶん Terraform Enterprise でも使えるようになる。

構成 Drift と向き合う

https://www.hashicorp.com/campaign/drift-detection-for-terraform-cloud

Terraform を運用していく上での一般的な課題の1つとして、Terraform で管理しているリソースに対して、Terraform 外からの操作によって変更が加えられた場合に、状態 (state) に不一致 (drift) が生じ、これを修正するために何らかのアクションが必要になる、という点が挙げられます。

ただし、管理しているリソースに Drift が起きているかどうかを知るには、Terraform を実際に実行するしかありません (plan/apply)。逆に言うと、その時になって初めて分かる、ということです。次に Terraform が実行されるのが仮に3ヶ月後だったとしたら、その時まで Drift に気付かない可能性がある、ということになります。

これにより、例えば下記のような課題が出てきます。

  • オペレーターへの負担
    • 気付かないうちに Drift が発生することにより、オペレーターが意図しない変更が plan/apply に混入し、事故に繋がる可能性。
  • セキュリティ上のリスク
    • 緊急対応などで一時的に Terraform を介さずにマニュアルで構成を変更したが、戻し忘れた (e.g., ACL, Security Policy)。データ漏洩などの事故に繋がる可能性。
  • 不要なコストの増加
    • 一時的なリソースの変更の戻し忘れ

例えば Kubernetes の普及によってよく聞くようになった "reconciliation loop" というコンセプトでは、こうした構成上の drift は Kubernetes によって常にチェックされていて、差分があった場合には Kubernetes があるべき状態に修正してくれます。

しかし Terraform はあくまでも都度実行方式 (on-demand) のため、このような feedback loop を回すことはできません。これを能動的に監視するには、自身で Terraform を定期実行して、drift を検知した際に通知する仕組みを作って運用する、などの工夫が必要です。

そこで、こういった課題を解決するソリューションとして、今回新たに Drift Detection 機能が Terraform Cloud に追加されました。

Drift Detection

Drift Detection は、Terraform Cloud 上で workspace 単位で有効にすることができます (workspace -> Settings -> General)。

Drift Detection が有効になっている workspace に対しては、Terraform Cloud が自動的にバックグラウンドで assesment を定期的に実行し、state との drift が発生していないかをチェックしてくれます。

実行に関して、今日時点での仕様としては、

  • assesment は最後の Run を起点として約24時間に1回の頻度で行われる
  • assesment の実行タイミングは指定できない
  • assesment はバックグラウンドで実行され、plan/apply をブロックしない (同時実行数に影響を与えない)

のようになっています。もちろん今後寄せられるフィードバックによって変わっていく可能性はあります。

Drift 検知時のワークフロー

実際に assesment によって Drift が検知された場合、UI (および後述の Notification) から内容を確認することができます。

Drift Detection が有効になっている workspace には、新たに Drift タブが追加されていて、ここから検知された Drift の具体的な内容を確認していくことができます。

このときオペレーターは、主に下記の2つのアクションを行うことになります。

Drift を正として受け入れる (refresh-only plan を実行)

検知された Drift が意図したものであり、現在のリソースの状態を修正する必要がない場合、refresh-only plan を新たに実行することにより、state ファイルを更新し、差分を取り込むことができます。

ただしこのアクションでは Terraform コード (*.tf ファイル) 上の定義そのものは更新されていないため、自身の Terraform コードも同様にこの構成に沿って更新しないと、次に Terraform が実行された際に元の状態に上書きされてしまいます。この辺りの詳細は公式の tutorial でも解説されています。

Drift を修正する

検知された Drift が意図するものではない場合、通常通り新たに Terrafrom の実行をスケジュールし、本来の Terraform コードで定義されている状態にリソースの修正を行うことができます。

Drift 検知時の通知

Terraform Cloud にはもともと Notification の機能があり、実行時のイベントを Webhook, Slack, Email, Microsoft Teams などに通知することができます。

今回新たに Drift Detection 機能のイベントも通知が可能になっています。

その他制限事項

  • Terraform version 0.15.4+
  • Terraform Cloud で Drift Detection を有効にする対象の workspace の Execution ModeRemote のみサポート
  • Remote 実行が前提のため、対象のインフラリソースに対する credential が Terrafrom Cloud 上に追加されている必要がある (Variables)

宣伝: HashiTalks: Japan を開催します!

今年も8月25日に HashiCorp コミュニティ向けのテックイベント HashiTalks: Japan を開催します!ぜひご参加ください!
毎年ここでしか聞けない開発者の皆さんからのディープな技術ネタが盛り沢山です。

イベントに登壇いただけるスピーカーも募集中です!

イベントページ: https://events.hashicorp.com/hashitalksjapan
CFP 応募: https://sessionize.com/hashitalks-japan

CFP に関しては、#HashiStack に関する内容であれば、テーマに細かな制限はありません。
Terraform, Vault, Consul, Nomad, Packer, ...etc

実際の現場でのプロダクションユースケースなどはもちろん、個人で XXXX やってみた/作ってみた 系のトークも歓迎です。興味あればぜひ CFP への応募を検討ください!他に社内や同僚の方で興味がありそうな方がいらっしゃれば、そちらにもぜひシェアください。

Discussion