🏗️ CloudFormation ドリフト検出と自動修復

設計図通りに建物が維持されているか自動チェック&修復
Config + Systems Manager Automation完全ガイド

🏢 建築設計図と実際の建物で例えると超わかりやすい!

CloudFormation = 建物の設計図📐

設計図通りに建物(AWSリソース)を建てたはずなのに...
時間が経つと誰かが勝手に改装して 設計図と違う状態 に!😱

これが 「ドリフト(Drift)= 乖離」 です。

AWS Config は定期的に建物を点検する 検査員👷
Systems Manager Automation は設計図通りに直す 工事業者🔧

検査員が問題を見つけたら → 工事業者が自動で修復!
これが今日学ぶ最強の組み合わせです✨

🏗️ 建築プロジェクトに例えると...

📐

設計図(CloudFormation)

🏛️ 最初の状態:
建築家が作った完璧な設計図。
「3階建て、各階に10部屋、エレベーター2基」

📋 設計図の内容(テンプレート):
• EC2インスタンス: t3.medium
• セキュリティグループ: ポート80, 443のみ
• RDS: db.t3.small, 暗号化ON
• S3バケット: バージョニング有効

✅ 設計図通りに建設したはず...
🏢

実際の建物(現在の状態)

😱 数ヶ月後の現実:
誰かが勝手に改装してしまった!
「3階建て、でも部屋数が変わってる、エレベーター1基に」

🚨 実際の状態(勝手な変更):
• EC2インスタンス: t3.large に変更された!
• セキュリティグループ: ポート22を誰かが追加!
• RDS: 暗号化を誰かがOFFに!
• S3バケット: バージョニングが無効化!

❌ これが「ドリフト(乖離)」です!
🎯 なぜドリフトが発生するの?
人間による手動変更が原因です!

よくある状況:
• 「急いでるから」とマネジメントコンソールから直接変更
• トラブルシューティング中に設定を変更してそのまま
• 新人エンジニアが知らずにAWS CLIで変更
• セキュリティチームが緊急対応で設定変更
• テスト目的で変更してリセット忘れ

💡 結果:CloudFormationテンプレートと実際のリソースが不一致に!

📊 ドリフトの種類と実例

🔄

プロパティの変更

設計図: t3.medium
実際: t3.large

📝 例:
• EC2インスタンスタイプ変更
• RDSストレージサイズ拡張
• Lambda関数のメモリサイズ
• EBSボリュームサイズ

検出難易度: ★★☆☆☆

リソースの追加

設計図: ポート80, 443
実際: ポート80, 443, 22

📝 例:
• SGに新しいルール追加
• IAMポリシーに権限追加
• S3バケットにタグ追加
• VPCにサブネット追加

検出難易度: ★★☆☆☆

リソースの削除

設計図: エレベーター2基
実際: エレベーター1基

📝 例:
• SGルールを誰かが削除
• タグが消えている
• アラームが削除された
• ログ設定が無効化

検出難易度: ★★★☆☆
🔐

セキュリティ設定の変更

設計図: 暗号化ON
実際: 暗号化OFF

📝 例:
• RDS暗号化を無効化
• S3バケットポリシー変更
• パブリックアクセス許可
• バックアップ設定OFF

検出難易度: ★★★★☆
⚠️ ドリフトを放置すると...
🔥 重大な問題が発生します!

1. セキュリティリスク:
• 意図しないポート開放でハッキングリスク
• 暗号化が無効化されてデータ漏洩
• パブリックアクセスで機密情報流出

2. コンプライアンス違反:
• 監査で承認されていない設定が発覚
• 規制要件を満たせない
• 認証更新が不可能に

3. 予期しない障害:
• CloudFormationスタック更新時に失敗
• 災害復旧時に正しく復元できない
• Infrastructure as Codeが機能しない

4. コスト超過:
• インスタンスサイズが勝手に大きくなって高額請求
• 不要なリソースが放置
• バックアップが過剰に取られる

🔄 検出から自動修復までの完全フロー

1 AWS Config: ドリフト検出ルール設定
👷 検査員の配置

ルール名:
cloudformation-stack-drift-detection-check

📋 チェック内容:
• CloudFormationスタックに対してドリフト検出を実行
• テンプレートと実際のリソース設定を比較
• 24時間ごと、または設定変更検出時に実行
• ドリフトがあれば「NON_COMPLIANT」判定

🎯 検出対象:
• すべてのCloudFormationスタック
• または特定のタグ/名前パターンのスタック
⬇️
2 ドリフト検出実行
🔍 建物の詳細検査開始

AWS Configが自動的に以下を実行:
1. CloudFormationスタックを特定
2. DetectStackDrift APIを呼び出し
3. スタック内の各リソースをチェック
4. テンプレートとの差分を検出

📊 検出結果:
IN_SYNC : 一致(問題なし)
DRIFTED : 乖離あり(修復必要)
MODIFIED : 一部変更
DELETED : リソース削除済み
⬇️
3 Config評価結果: NON_COMPLIANT
🚨 検査員が問題を発見!

判定条件:
• ドリフト状態が DRIFTED → ❌ 非準拠
• ドリフト状態が IN_SYNC → ✅ 準拠

記録される情報:
• どのスタックでドリフトが発生したか
• どのリソースが変更されたか
• 具体的な変更内容(差分)
• 検出日時とタイムスタンプ

💡 この情報を使って自動修復をトリガー!
⬇️
4 EventBridgeルールが発火
📡 緊急連絡システム作動

イベントパターン:
「Configルールが非準拠を検出したら」
→ EventBridgeが自動的にキャッチ

📄 EventBridgeルール例
{
  "source": ["aws.config"],
  "detail-type": ["Config Rules Compliance Change"],
  "detail": {
    "configRuleName": [
      "cloudformation-stack-drift-detection-check"
    ],
    "newEvaluationResult": {
      "complianceType": ["NON_COMPLIANT"]
    }
  }
}
🎯 ターゲット:
Systems Manager Automation Runbook を起動
⬇️
5 Systems Manager Automation実行
🔧 工事業者が自動修復開始!

Runbook名:
AWS-UpdateCloudFormationStack

実行内容:
1. 問題のスタックを特定
2. 元のテンプレートを取得
3. スタック更新(Update Stack)を実行
4. CloudFormationが設計図通りに修復
5. 完了後に通知

🎯 結果:
• すべての変更が元に戻る
• 設計図通りの状態に復元
• 手動作業ゼロ!
⬇️
6 修復完了・通知
✅ 建物が設計図通りに修復された!

通知内容:
• SNSトピック経由でメール/Slack通知
• 「スタック○○のドリフトを自動修復しました」
• 修復内容の詳細レポート
• 次回チェック予定日時

📊 監査ログ:
• CloudTrailに全操作を記録
• Config Timelineで履歴確認
• 誰が変更して、いつ修復されたかすべて追跡可能

🎉 自動運用サイクルの完成!

🤖 AWS-UpdateCloudFormationStack の仕組み

🔧 Runbookの動作ステップ

📥

Step 1: 入力パラメータ取得

• StackName: 修復対象のスタック名
• TemplateBody/TemplateURL: 元のテンプレート
• Parameters: スタックパラメータ
• Capabilities: 必要な権限(IAM作成など)

🔍

Step 2: 現在の状態確認

• スタックの存在確認
• 現在のスタックステータスチェック
• 更新可能な状態か検証
• (UPDATE_IN_PROGRESS なら待機)

🔄

Step 3: スタック更新実行

UpdateStack API呼び出し
• 元のテンプレートを使用
• 変更セット(Change Set)を作成
• CloudFormationが差分を自動検出して修正

Step 4: 完了待機

• スタック更新完了を監視
• ステータスが UPDATE_COMPLETE になるまで待機
• タイムアウト: 通常30-60分
• エラー発生時はロールバック

📊

Step 5: 結果レポート

• 修復成功/失敗をレポート
• 変更されたリソース一覧
• 実行ログの出力
• CloudWatch Logsに詳細記録

💡 重要ポイント
AWS-UpdateCloudFormationStack は以下を自動実行:

1. 元のテンプレート通りに復元
→ 手動変更をすべて上書き

2. 安全な更新
→ Change Setで事前確認
→ 失敗時は自動ロールバック

3. 完全自動化
→ 人間の介入不要
→ 深夜でも修復可能

🎯 これで設計図通りの状態が常に維持されます!

🛠️ 完全な実装例

1️⃣ AWS Configルールの設定

📄 CloudFormation: Configルール
Resources:
  DriftDetectionConfigRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: cloudformation-stack-drift-detection
      Description: CloudFormationスタックのドリフトを検出
      Source:
        Owner: AWS
        SourceIdentifier: CLOUDFORMATION_STACK_DRIFT_DETECTION_CHECK
      Scope:
        ComplianceResourceTypes:
          - AWS::CloudFormation::Stack
      MaximumExecutionFrequency: TwentyFour_Hours  # 24時間ごと

2️⃣ EventBridgeルールの設定

📄 CloudFormation: EventBridgeルール
  DriftDetectionEventRule:
    Type: AWS::Events::Rule
    Properties:
      Name: cfn-drift-auto-remediation
      Description: ドリフト検出時に自動修復
      EventPattern:
        source:
          - aws.config
        detail-type:
          - Config Rules Compliance Change
        detail:
          configRuleName:
            - cloudformation-stack-drift-detection
          newEvaluationResult:
            complianceType:
              - NON_COMPLIANT
      State: ENABLED
      Targets:
        - Arn: !Sub 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:automation-definition/AWS-UpdateCloudFormationStack:$DEFAULT'
          RoleArn: !GetAtt AutomationRole.Arn
          Id: UpdateStackTarget
          InputTransformer:
            InputPathsMap:
              stackName: $.detail.resourceId
            InputTemplate: |
              {
                "StackName": ["<stackName>"],
                "UsePreviousTemplate": ["true"],
                "AutomationAssumeRole": ["!GetAtt AutomationRole.Arn"]
              }

3️⃣ IAMロールの設定

📄 CloudFormation: 必要なIAMロール
  AutomationRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: CFN-Drift-Auto-Remediation-Role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ssm.amazonaws.com
                - events.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole
      Policies:
        - PolicyName: CloudFormationUpdatePolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - cloudformation:UpdateStack
                  - cloudformation:DescribeStacks
                  - cloudformation:DescribeStackEvents
                  - cloudformation:GetTemplate
                Resource: '*'
              - Effect: Allow
                Action:
                  - iam:PassRole
                Resource: '*'
                Condition:
                  StringEquals:
                    iam:PassedToService: cloudformation.amazonaws.com

4️⃣ SNS通知の設定(オプション)

📄 CloudFormation: 通知設定
  DriftNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: cfn-drift-notifications
      DisplayName: CloudFormation Drift Notifications
      Subscription:
        - Endpoint: your-email@example.com
          Protocol: email

  DriftNotificationRule:
    Type: AWS::Events::Rule
    Properties:
      Name: cfn-drift-notification
      EventPattern:
        source:
          - aws.ssm
        detail-type:
          - EC2 Automation Execution Status-change Notification
        detail:
          DocumentName:
            - AWS-UpdateCloudFormationStack
      Targets:
        - Arn: !Ref DriftNotificationTopic
          Id: SNSTarget

💼 実際のユースケースと活用例

🏢

エンタープライズ本番環境

課題:
複数チームが同じインフラを触る環境で、誰かが勝手に設定変更してしまう

解決策:
• ドリフト検出を有効化
• 手動変更を即座に元に戻す
• Slackに通知して犯人を特定
• 教育材料として活用

結果:
• 設定変更は必ずコード経由に
• Infrastructure as Codeが徹底
• セキュリティ事故ゼロ

効果: ★★★★★
🔒

セキュリティコンプライアンス

課題:
監査で「承認されていない変更」が発覚し、コンプライアンス違反のリスク

解決策:
• 暗号化設定などの重要設定を監視
• 変更を即座に検出・修復
• 監査証跡を自動記録
• 変更履歴を可視化

結果:
• ISO27001/SOC2適合
• 監査対応が超楽に
• 規制要件クリア

効果: ★★★★★
💰

コスト最適化

課題:
誰かがインスタンスサイズを大きくして、気づいたら請求額が爆増

解決策:
• インスタンスタイプ変更を検出
• 承認されたサイズに自動復元
• コスト超過を未然に防ぐ
• 変更理由を記録して分析

結果:
• 月額30%コスト削減
• 予算超過ゼロ
• コスト管理の自動化

効果: ★★★★☆
🚨

災害復旧(DR)対策

課題:
災害復旧テストで、CloudFormationが失敗。実際の設定とテンプレートが違っていた

解決策:
• 常に設計図通りの状態を維持
• DR時のスタック再作成を保証
• 定期的なドリフトチェック
• 復旧手順の自動化

結果:
• DR成功率100%
• RPO/RTO達成
• 災害時の安心感

効果: ★★★★★
🏆 ドリフト管理のベストプラクティス
1. すべての本番スタックで有効化
• 重要度の高いスタックから優先的に
• 本番環境は必須、開発環境は任意
• タグで管理対象を明確に

2. 自動修復は段階的に導入
• 最初は通知のみ(自動修復OFF)
• ドリフトのパターンを分析
• 意図的な変更と誤操作を区別
• 安定してから自動修復ON

3. 重要度別に対応を変える
• 【高】セキュリティ設定 → 即座に自動修復
• 【中】リソースサイズ → 通知して確認後に修復
• 【低】タグの変更 → 定期的にまとめて修復

4. チームへの教育
• 「手動変更は禁止」を周知
• すべての変更はコード経由
• ドリフトアラートの意味を理解
• インシデント分析を共有

5. 例外管理の仕組み
• 緊急時の手動変更フロー定義
• 一時的にルールを無効化する手順
• 変更後にテンプレート更新
• ドキュメント化と承認プロセス

6. 定期的なレビュー
• 週次でドリフト発生状況を確認
• よくある変更パターンを分析
• テンプレートの改善点を発見
• チーム全体で振り返り

7. 監査ログの活用
• CloudTrailでドリフト原因を追跡
• 誰がいつ変更したか記録
• Config Timelineで変更履歴可視化
• コンプライアンスレポート作成

8. コスト監視との連携
• ドリフトでコスト増加を検出
• 予算アラートと組み合わせ
• Cost Explorerで影響分析
• 無駄なリソースを即座に削減
⚠️ 自動修復の注意点と制限事項
🔴 自動修復できないケース:

1. 削除されたリソース
• スタック外で手動削除されたリソースは復元不可
• CloudFormationは既存リソースの更新のみ可能
• 完全な復元にはスタック再作成が必要

2. 変更不可能なプロパティ
• RDSのインスタンスIDなど一部プロパティは変更不可
• この場合、リソースの置き換え(Replacement)が発生
• データ損失のリスクあり

3. 依存関係エラー
• 他のリソースに依存する変更は失敗する可能性
• 複雑なスタックでは修復に時間がかかる
• 手動介入が必要なケースも

4. 権限不足
• AutomationRoleに必要な権限がないと失敗
• IAM権限、KMS暗号化キーなど確認
• エラーログを確認して権限追加

💡 推奨事項:
• 最初は通知のみで運用開始
• ドリフトパターンを把握してから自動修復を有効化
• 重要なリソースは手動確認後に修復
• 定期的にテスト環境で動作確認

❓ よくある質問(FAQ)

Q1 ドリフト検出の頻度は変更できる?
A: はい、Configルールで設定可能です

• 1時間、3時間、6時間、12時間、24時間から選択
• または設定変更時にトリガー
• 頻度を上げるとコストも増加
• 通常は24時間で十分

💰 コスト例(東京リージョン):
• 24時間ごと: 月額$3-5程度
• 1時間ごと: 月額$50-70程度
Q2 自動修復で既存データが消える心配は?
A: 基本的に安全ですが、注意は必要です

✅ 安全なケース:
• 設定変更のみ(タグ、SG、IAMポリシーなど)
• CloudFormationが既存リソースを更新
• データは保持される

⚠️ 注意が必要なケース:
• リソースの置き換え(Replacement)が発生
• 例:RDSインスタンスIDの変更
• この場合は新規作成→古いものを削除

💡 対策:
• DeletionPolicyを「Retain」に設定
• 重要データは必ずバックアップ
• Change Setで事前確認
Q3 意図的な変更も戻されてしまう?
A: はい。だからこそテンプレート更新が重要

正しいフロー:
1. CloudFormationテンプレートを更新
2. スタック更新を実行
3. これで変更が「正式」になる
4. ドリフトは発生しない

間違ったフロー:
1. マネジメントコンソールで直接変更
2. ドリフトとして検出される
3. 自動修復で元に戻される
4. 変更が失われる

💡 Infrastructure as Codeを徹底しましょう!
Q4 複数アカウント環境でも使える?
A: はい、むしろ推奨です

方法1: 各アカウントで個別設定
• シンプルで分かりやすい
• アカウントごとに調整可能
• StackSetsで一括デプロイ

方法2: 組織全体で一元管理
• AWS Organizations統合
• 管理アカウントで集中管理
• Aggregatorで全体を可視化

💡 大規模環境では方法2がおすすめ

🎓 まとめ

🏗️ 建物は設計図通りに保つべき

CloudFormation = 建物の設計図📐
ドリフト = 設計図と実際の建物の違い🏢

検査員(Config) が問題を見つけて、
工事業者(SSM Automation) が自動で直す!

これが最強の組み合わせです✨

👷
検査員

AWS Config
24時間監視で
ドリフトを検出
📡
連絡網

EventBridge
問題発生を
即座に伝達
🔧
工事業者

SSM Automation
設計図通りに
自動修復

🎯 導入のステップ:

1️⃣ Configルール cloudformation-stack-drift-detection-check を有効化
2️⃣ EventBridge で非準拠イベントをキャッチ
3️⃣ SSM Automation AWS-UpdateCloudFormationStack を起動
4️⃣ IAMロール に必要な権限を付与
5️⃣ SNS通知 でチームに共有

これで完全自動化の完成!🎉

💡 覚えておくべき最重要ポイント:

すべての変更はコード経由で
Infrastructure as Code を徹底すれば、
ドリフトは発生しません!

手動変更は 必ず検出・修復 されて、
設計図通りの安全な状態が維持されます🔒

自動化で、安心して眠れる夜を!😴✨

Created by SSuzuki1063

AWS SAP Learning Resources