Upgrade to Pro — share decks privately, control downloads, hide ads and more …

IaC運用の落とし穴を防ぐ:AWS CloudFormation Stackの構成逸脱監視

IaC運用の落とし穴を防ぐ:AWS CloudFormation Stackの構成逸脱監視

Avatar for NRI Netcom

NRI Netcom PRO

July 23, 2025
Tweet

More Decks by NRI Netcom

Other Decks in Technology

Transcript

  1. IaC運用の落とし穴を防ぐ: AWS CloudFormation Stackの構成逸脱監視 NRIネットコム TECH & DESIGN STUDY #71

    2025年7月22日 NRIネットコム株式会社 クラウド事業推進部 藤本 匠海
  2. 1 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy はじめに

    01 ドリフト検出とは 02 Lambdaによるドリフト検出 03 Configルールによるドリフト検出 04 運用のTips 05 最後に 06
  3. 2 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ◼

    名前:藤本匠海 ◼ 出身:愛知県 ◼ 経歴 ⚫ 2023年~ • NRIネットコム入社 • クラウド事業推進部に配属 ⚫ 2023年7月~ • AWSを活用したシステムの構築・支援 ⚫ 2025年6月~ • 2025 Japan AWS Jr. Champions • 2025 Japan All AWS Certifications Engineers ◼ 好きなAWSサービス ◼ 保有資格 自己紹介 AWS CloudFormation AWS Organizations https://tech.nri-net.com/archive/author/nnc-t-fujimoto
  4. 4 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ◼

    AWSのリソースの構築・管理において、IaC(Infrastructure as Code)の活用が一般化 ⚫ IaC(Infrastructure as Code):インフラ環境をコードとしてバージョン管理できるため、再現性や一貫性を向上 • AWS CloudFormation • AWS CDK • Terraform など ◼ IaCの管理下では、意図しないリソースの設定変更によって、ドリフト(構成逸脱)を引き起こす可能性 ⚫ 手動でのリソース設定変更 ⚫ スクリプトや他サービスによるリソース操作 ◼ ドリフト(構成逸脱) :テンプレートと実際の構成が乖離している状態 ⚫ 運用リスクが高まる • 本来あるべき状態の検証が困難 • 壊滅的な設定・誤った設定に変更された場合に重大なリスクを招く恐れ ⚫ CloudFormation ベストプラクティスでも非推奨 • https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html#donttouch 今回の勉強会で、このドリフト(構成逸脱)を自動で検知する仕組みを紹介します。 はじめに
  5. 6 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ドリフトの例

    ◼ 例:テンプレートで定義されたセキュリティグループに対して、AWSコンソールで手動でインバウンドルールを追加 ⚫ テンプレート:ポート80のみ許可 ⚫ 実リソース:ポート80とポート22を許可 ◼ ドリフト検出 ⚫ CloudFormationスタックのリソースが、テンプレートで定義された状態からドリフトしていないかを検出する機能 ⚫ ドリフト検出は自動で実行されず、明示的に実行する必要がある • マネジメントコンソール上では、スタックアクションから「ドリフトの検出」を実行 ドリフト検出とは ドリフト発生
  6. 7 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ドリフト検出

    ◼ ドリフト検出の流れ 1. テンプレートに定義された各リソースについて、現在の実リソースの構成を取得 2. その構成とテンプレート定義をプロパティ単位で比較 3. 差異があるかどうかを判定し、結果を検出 ◼ ドリフト検出の対象 ⚫ スタック単位:スタック内のリソースにドリフトが存在するか確認 ⚫ スタック内のリソース単位:各リソースのドリフトの有無、またドリフトが発生しているリソースのプロパティを確認 ドリフト検出とは ・ CloudFormationのマネジメントコンソール
  7. 8 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ドリフトステータス

    ◼ スタック単位のステータス ⚫ DRIFTED:スタックが意図したテンプレート構成とは異なる(ドリフトが発生している状態) ⚫ NOT_CHECKED:まだドリフト検出を行っていない、ドリフト検出の対象外 ⚫ IN_SYNC:意図したテンプレート構成と一致する ◼ スタック内のリソース単位のステータス ⚫ DELETED:リソースが削除されている ⚫ MODIFIED:テンプレートと異なるプロパティがある ⚫ NOT_CHECKED:まだドリフト検出を行っていない、ドリフト検出の対象外 ⚫ IN_SYNC:テンプレートと一致している ◼ スタック単位: DRIFTED、リソース単位: DELETED, MODIFIED のステータスである場合、ドリフトが発生している ことを把握し、対処する必要がある ◼ ドリフトを自動検知し、通知する方法 1. Lambdaによるドリフト検出 2. Configルールによるドリフト検出 ドリフト検出とは
  8. 10 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 実行の流れ

    ◼ 実行の流れ 1. EventBridgeスケジュールでLambda①を定期実行 2. Lambda①でCloudFormation ドリフト検出を実行 3. ドリフト検出された結果をEventBridgeルールでキャッチし、Lambda②を実行 4. Lambda②でドリフト検出の結果を取得し、SNSで通知 Lambdaによるドリフト検出 ① ②
  9. 11 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy Lambda①でCloudFormation

    ドリフト検出を実行 ◼ Lambda① ⚫ スタック一覧を取得し、全てのスタックに対して、ドリフト検出を行うLambda ⚫ EventBridgeスケジュールにより、任意のタイミングでLambdaを実行 ◼ detect_stack_driftメソッド ⚫ boto3 のCloudFormation ドリフト検出を開始するメソッド ⚫ あくまでもドリフト検出を開始するだけで、検出完了までには時間がかかり、非同期に処理 ⚫ ドリフト検出の対象となるCloudFormation Stackによって展開されているリソースの参照権限が必要 ◼ describe_stack_drift_detection_statusメソッド ⚫ boto3 において、CloudFormationドリフト検出の進行状況と結果を確認するためのメソッド Lambdaによるドリフト検出 ・Lambda①のコード抜粋
  10. 12 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ドリフト検出された結果をEventBridgeルールでキャッチ

    ◼ ドリフト検出の完了をトリガーにLambda②を実行 ⚫ ドリフト検出の開始(detect_stack_drift)によって、非同期で処理されたドリフト結果をEventBridgeルールによってキャッチ ⚫ EventBridgeルールのターゲットにLambda②を選択 ◼ イベントパターン ⚫ EventBridgeイベント「CloudFormation Drift Detection Status Change」 • CloudFormation がスタックのドリフト検出を行った際に、そのステータスが変更されたことを通知するイベント ⚫ 6行目:“detection-status”: [“DETECTION_COMPLETE”]を指定 • ドリフト検出が完了したイベントのみをキャッチするため →この指定が無いと、ドリフト検出が進行中である「DETECTION_IN_PROGRESS」の状態もマッチしてしまう Lambdaによるドリフト検出 イベントパターン
  11. 13 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy Lambda②でドリフト検出結果を整形し、通知する

    ◼ Lambda② ⚫ ドリフト検出の結果から、どのリソースのプロパティにドリフト検出が出ているか確認し、通知するLambda ⚫ EventBridgeルールで直接SNSをターゲットに設定できるが… • SNSで通知する内容を整形することで、視認性を向上 • スタック単位でなく、リソース単位でドリフト結果を取得 ◼ describe_stack_resource_driftsメソッド ⚫ boto3のリソース単位でのドリフトとその詳細を取得するメソッド ◼ 通知内容 ⚫ ドリフト検出が起こっているリソースのプロパティを即座に把握し、対処するための情報を通知する • ドリフト検出されたリソースの種類 • リソース単位のドリフトステータス • 変更(MODIFIED)ステータスの場合、プロパティの詳細 • CloudFormation のコンソールURL Lambdaによるドリフト検出
  12. 14 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 実際の通知確認

    ◼ 各リソースのプロパティを手動で変更し、通知を確認 ⚫ SNS トピック:表示名(Display name) を変更 ⚫ SQS キュー:可視性タイムアウト(VisibilityTimeout)を30から45に変更 ⚫ DynamoDB:DynamoDBコンソールから「DriftTestTable」を削除 ◼ 実際の通知内容 ⚫ View in ConsoleのURLから対象のスタックを確認 ⚫ 今回はメール宛に通知を行ったが、運用面ではSlack通知の方が管理しやすい Lambdaによるドリフト検出
  13. 16 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ◼

    Configルール「cloudformation-stack-drift-detection-check」を設定 ⚫ ドリフトの有無を確認するConfigルール ⚫ 実行タイミング • 定期実行(1,3,6,12,24時間) • CloudFormation設定変更(UpdateStack)時 ⚫ 評価方法 • 各スタックに対して DetectStackDrift オペレーションを実行する • スタック単位でのドリフト検出を行う • IN_SYNC ステータス → COMPLIANT(準拠)と評価 • DRIFTED ステータス→ NON_COMPLIANT(非準拠)と評価 ⚫ Configルールはあくまでも準拠、非準拠を判定するだけで、スタック単位からドリフトを判断し、リソース単位で検知はしない ◼ メリット ⚫ マネージドサービスであるため、管理の必要がない ⚫ 簡単に設定できる ⚫ SNSトピックを指定できるため、簡単に通知設定も行える(データの整形は行えない) Configルールによるドリフト検出 AWS Config AWS CloudFormation Amazon SQS Amazon SNS Amazon DynamoDB AWS CloudFormationによって展開されたリソース
  14. 17 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy 5.

    EventBridge+LambdaとConfigルールによるドリフト検出の使い分け
  15. 18 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy EventBridge+LambdaとConfigルールによるドリフト検出の使い分け

    観点 EventBridge+Lambda Configルール 実行タイミング 任意のタイミング(1時間以内も設定可能) 最短1時間 デフォルト:24時間 検出対象 Lambdaにより、任意のスタックを指定可能 全てのスタック 結果の取得 リソース単位 スタック単位 (準拠か非準拠) 通知内容 Lambdaにより、自由にカスタマイズ JSON形式のイベント 設定の容易さ 複雑であり、管理が必要 容易 主な用途 柔軟なドリフト検出と迅速な通知を行いたい 簡単に定期的な監査を行いたい
  16. 20 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ◼

    タグを利用し、監視対象を絞る ⚫ 対象スタックが多い場合・スタックによって展開されているリソースが多い場合は、Lambdaのクォータ(15分)に達する可能性 ⚫ 通知の優先度が低いスタックは除外する • 通知の必要がない検証用スタック • すべての環境に一律で適用しているガードレール設計に用いられるような設定を展開しているスタック →より重要な変更に集中 ◼ そもそも意図しない設定変更が行われないよう、SCP(Service Control Policy)を適用する ⚫ ガードレール設計等のスタックなど ◼ CloudFormation StackSetsによる展開で、マルチリージョン対応 ⚫ 今回作成した構成逸脱(ドリフト)を監視する構成をCloudFormationでテンプレート化 運用のTips
  17. 22 Copyright(C) NRI Netcom, Ltd. All rights reserved. #nncstudy ◼

    ドリフト(構成逸脱) :テンプレートと実際の構成が乖離している状態 ⚫ 本来あるべき状態の検証が困難 ⚫ 壊滅的な設定・誤った設定に変更された場合に重大なリスクを招く恐れ →CloudFormationによるドリフト検出機能を利用 ◼ ドリフト検出は自動で実行されず、明示的に実行する必要がある 1. EventBridge+Lambdaによるドリフト検出→柔軟なドリフト検出と即時通知 2. Configルールによるドリフト検出→定期的な監査 ◼ 運用Tips ⚫ タグを利用し、監視対象を絞る ⚫ SCP(Service Control Policy)による制御 ⚫ マルチリージョン対応 最後に