Skip to content

Repository files navigation

cdk-real-drift 検証リポジトリ

cdk-real-drift(CLI: cdkrd)の検出範囲、ベースライン管理、復旧動作、CI 統合を、使い捨て可能な AWS リソースで再現・評価するための検証リポジトリです。

本リポジトリでは、CloudFormation がテンプレートで明示されたプロパティだけを比較するのに対し、cdkrd がテンプレート未定義のプロパティや、CloudFormation スタック外で追加された子リソースをどのように扱うかを重点的に確認します。

検証時点

項目
検証基準日 2026-07-22
cdk-real-drift 0.23.2
aws-cdk-lib 2.261.0
Node.js 22(patch versionはflake.lockで固定)
AWS CDK CLI 2.1131.0
既定リージョン ap-northeast-1

バージョン差による挙動変化を避けるため、依存関係は pnpm-lock.yaml で固定します。Node.js と開発ツールは project-local flake.nix / flake.lock で固定し、別バージョンの評価は独立したコミットに分けます。

検証シナリオの前提、AWS実行境界、判定方法、受け入れ条件は docs/implementation-plan.md を正とします。特に S20 はbaseline作成後、S30はbaselineがない状態から開始します。

2026-07-22 時点の実測結果は docs/results/2026-07-22.md です。記事下書きは blog#13 です。

目的

この検証では、次の問いに回答します。

  • CDK コードで宣言したプロパティの手動変更を検出できるか。
  • CDK コードで宣言していないプロパティの手動変更を検出できるか。
  • CloudFormation スタック外で追加された子リソースを検出できるか。
  • 初回検出の Potential Drift と、ベースライン記録後の確定ドリフトを区別できるか。
  • recordignorerevert が意図どおりに機能するか。
  • ローカル CDK コードと実リソースを比較する --pre-deploy が機能するか。
  • --fail--json を CI で安全に利用できるか。
  • 標準の cdk driftcdkrd の検出結果がどこで異なるか。

非目的

次の項目は本リポジトリの初期スコープ外です。

  • cdk-real-drift が対応する全 AWS リソースタイプの網羅試験
  • 本番アカウントでの自動復旧
  • 複数アカウント・複数リージョンのベースライン共有
  • 高頻度な定期実行や大規模スタックでの性能評価
  • cdk-real-drift 本体の内部実装テスト
  • CloudFormation StackSets、Nested Stack、独自リソースタイプの評価

検証アーキテクチャ

検証スタックには、直接料金が発生しにくく、手動変更と削除が容易な次のリソースだけを作成します。

リソース CDK での状態 主な検証用途
Amazon SNS Topic DisplayName を明示 宣言済みプロパティのドリフト
IAM Role インラインポリシーを未定義 未宣言プロパティのドリフト
EventBridge Custom Event Bus Rule を未定義 スタック外で追加された子リソース
CloudFormation Outputs ARN・名前を出力 検証スクリプトからの参照

CDK スタックは以下のコンテキストを受け取ります。

コンテキスト 必須 既定値 用途
suffix はい なし リソース名の衝突回避
topicDisplayName いいえ cdkrd-verification --pre-deploy 検証

物理名は原則として cdkrd-<resource>-<suffix> とします。suffix は英小文字、数字、ハイフンのみで、20 文字以内を推奨します。

リポジトリ構成

.
├── bin/
│   └── app.ts
├── lib/
│   └── cdk-real-drift-verification-stack.ts
├── fixtures/
│   └── iam/
│       └── manual-inline-policy.json
├── scripts/
│   ├── common.sh
│   ├── deploy.sh
│   ├── export-outputs.sh
│   ├── baseline.sh
│   ├── verify-clean.sh
│   ├── scenario-declared-drift.sh
│   ├── scenario-undeclared-drift.sh
│   ├── scenario-added-resource.sh
│   ├── scenario-ignore.sh
│   ├── scenario-pre-deploy.sh
│   ├── reset.sh
│   └── destroy.sh
├── tests/
│   └── assert-cdkrd-report.mjs
├── .github/
│   └── workflows/
│       ├── test.yml
│       └── drift-check.yml
├── .cdkrd/
│   ├── baseline-*.json
│   └── ignore.yaml
├── cdk.json
├── flake.nix
├── flake.lock
├── package.json
├── pnpm-lock.yaml
├── tsconfig.json
└── README.md

設計方針

  • lib/ は AWS リソース定義だけを保持します。
  • 手動ドリフトの注入は scripts/scenario-*.sh に分離します。
  • 各シナリオは単独で実行でき、終了時に元の状態へ戻せるようにします。
  • AWS CLI の出力値をハードコードせず、CloudFormation Outputs から取得します。
  • .cdkrd のベースラインはレビュー対象として Git 管理します。
  • シナリオ中に更新したベースラインや ignore.yaml は、シナリオ終了後に復元します。
  • check / record用の読み取り権限と、注入 / revert / deploy用の書き込み権限をIAM上で分離します。
  • スクリプトは set -Eeuo pipefail を使用し、予期しない失敗を握りつぶしません。
  • 一時ファイルはmktemp -dで作成したディレクトリへ保存し、trapで回収します。固定の.tmp/は使いません。

シナリオ一覧

ID シナリオ 変更内容 cdk drift --fail cdkrd check --fail 主な期待結果
S10 宣言済みドリフト SNS DisplayName を変更 1 1 CFn-Declared Drift
S20 未宣言ドリフト IAM Role にインラインポリシー追加 0 1 CFn-Undeclared Drift
S30 追加リソース baselineなしでEvent BusにRuleを手動追加 0 0 未記録時はPotential Drift
S31 追加リソース変更 Rule を記録後に変更 0 1 Added Resource
S40 Ignore IAM の未宣言ドリフトを無視 0 0 .cdkrd/ignore.yaml にルール追加
S50 Pre-deploy 実リソースに合わせてローカルコード変更 1 0 --pre-deploy では差分なし
S60 Revert 宣言済み・未宣言ドリフトを復旧 0 0 再読込後に CLEAN
S70 JSON / CI 確定ドリフトを JSON 出力 0 または 1 1 stdout が単一 JSON 配列

Potential Drift は未確定のため、--fail の失敗対象にならないことを明示的に確認します。

前提条件

  • 検証専用またはサンドボックス用 AWS アカウント
  • Node.js 22
  • pnpm 11.9.0
  • AWS CLI v2
  • jq
  • AWS CDK v2 のブートストラップ済み環境
  • 対象アカウントへの AWS 認証情報
  • Git

本番、Management、共有開発アカウントでは実行しません。PoC Sandboxで人が実行する場合はaws-sandbox-run、エージェントが自律実行する場合は短期認証を発行するaws-agent-leaseをAWS CLI/CDKコマンドの実行境界にします。特にcdkrd revertはAWSリソースを書き換えます。

AWS 権限

読み取り検証

cdkrd checkcdkrd record は基本的に読み取り処理です。検証を単純化する場合は AWS 管理ポリシー ReadOnlyAccess を付与した専用ロールを使用します。

最低限、CloudFormation、Cloud Control API、STS、および対象リソースを読み取る権限が必要です。

ドリフト注入と復旧

各シナリオでは次の書き込み権限が必要です。

  • sns:SetTopicAttributes
  • iam:PutRolePolicy
  • iam:DeleteRolePolicy
  • events:PutRule
  • events:DeleteRule
  • cloudcontrol:UpdateResource
  • cloudcontrol:DeleteResource
  • cloudcontrol:GetResourceRequestStatus
  • 対象リソースタイプの更新・削除権限
  • CDK デプロイと削除に必要な CloudFormation 権限

check / record用の読み取り権限と、注入 / revert / deploy用の書き込み権限はIAM上で分離します。実行時の認証先は任意のAWS_PROFILEで切り替えず、aws-sandbox-runまたはaws-agent-leaseが行うアカウントpreflightに従います。

セットアップ

1. 環境変数

export AWS_REGION=ap-northeast-1
export EXPERIMENT_ID=20260722-cdkrd-001
export EXPIRES_AT=2026-07-29
export SUFFIX=yourname
export STACK_NAME="CdkrdVerification-${SUFFIX}"

認証先を必ず確認します。

以下のAWS CLI/CDKコマンドはpayloadの例です。実装するシナリオスクリプトは、これらをaws-sandbox-runまたはaws-agent-leaseへ渡して実行します。

aws sts get-caller-identity
aws configure get region

2. 依存関係のインストール

pnpm install --frozen-lockfile

3. CDK Bootstrap

初回のみ実行します。

ACCOUNT_ID="$(aws sts get-caller-identity --query Account --output text)"

pnpm exec cdk bootstrap \
  "aws://${ACCOUNT_ID}/${AWS_REGION}"

4. デプロイ

pnpm exec cdk deploy "${STACK_NAME}" \
  --context suffix="${SUFFIX}" \
  --require-approval never

5. Outputs の取得

source scripts/export-outputs.sh

以下の変数が設定される想定です。

  • TOPIC_ARN
  • ROLE_NAME
  • EVENT_BUS_NAME

ベースラインの作成

1. 初回チェック

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict

初回は .cdkrd のベースラインがないため、テンプレートに存在しない実リソースの値が Potential Drift として表示される場合があります。

この段階では、次を確認します。

  • 宣言済みプロパティに確定ドリフトがないこと
  • 表示された未宣言値が AWS の既定値または意図した状態であること
  • 不明な値を機械的に記録しないこと

2. ベースライン記録

内容を確認してから記録します。

pnpm exec cdkrd record "${STACK_NAME}"

自動化検証では、対象が既知である場合に限り --yes を使用します。

pnpm exec cdkrd record "${STACK_NAME}" \
  --yes

3. ベースラインを Git 管理

git add .cdkrd
git commit -m "test: record initial cdkrd baseline"

4. クリーン状態の確認

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail

期待値は終了コード 0 と CLEAN です。

S10: 宣言済みプロパティのドリフト

SNS Topic の DisplayName は CDK で明示的に宣言します。

ドリフト注入

aws sns set-topic-attributes \
  --topic-arn "${TOPIC_ARN}" \
  --attribute-name DisplayName \
  --attribute-value "manual-declared-drift" \
  --region "${AWS_REGION}"

標準 CDK の確認

set +e
pnpm exec cdk drift "${STACK_NAME}" \
  --fail
CDK_EXIT=$?
set -e

echo "cdk drift exit code: ${CDK_EXIT}"

期待値は終了コード 1 です。

cdkrd の確認

set +e
pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail
CDKRD_EXIT=$?
set -e

echo "cdkrd exit code: ${CDKRD_EXIT}"

期待値は次のとおりです。

  • 終了コード 1
  • CFn-Declared Drift
  • desired が CDK で宣言した値
  • actual が manual-declared-drift

Revert の確認

必ず先に実行計画を確認します。

pnpm exec cdkrd revert "${STACK_NAME}" \
  --dry-run

問題がなければ復旧します。

pnpm exec cdkrd revert "${STACK_NAME}" \
  --yes

復旧後に再確認します。

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail

期待値は終了コード 0 と CLEAN です。

S20: 未宣言プロパティのドリフト

IAM Role の Policies は CDK で宣言しません。初期ベースラインを作成した後、AWS CLI でインラインポリシーを追加します。

テスト用ポリシー

fixtures/iam/manual-inline-policy.json:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ManualDrift",
      "Effect": "Deny",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*"
    }
  ]
}

このポリシーはドリフトを作るための値であり、権限を追加しないようDenyにします。検証用ロールをアプリケーションからAssumeRoleして利用しません。

ドリフト注入

aws iam put-role-policy \
  --role-name "${ROLE_NAME}" \
  --policy-name "cdkrd-manual-policy" \
  --policy-document file://fixtures/iam/manual-inline-policy.json

標準 CDK の確認

set +e
pnpm exec cdk drift "${STACK_NAME}" \
  --fail
CDK_EXIT=$?
set -e

echo "cdk drift exit code: ${CDK_EXIT}"

期待値は終了コード 0 です。Policies がテンプレートで宣言されていないため、CloudFormation ベースのドリフト検出では対象にならないことを確認します。

cdkrd の確認

set +e
pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail
CDKRD_EXIT=$?
set -e

echo "cdkrd exit code: ${CDKRD_EXIT}"

期待値は次のとおりです。

  • 終了コード 1
  • CFn-Undeclared Drift
  • IAM Role の Policies に追加したポリシーが表示される

Revert の確認

pnpm exec cdkrd revert "${STACK_NAME}" \
  --dry-run

pnpm exec cdkrd revert "${STACK_NAME}" \
  --yes

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail

期待値は、インラインポリシーが削除され、CLEAN に戻ることです。

S30 / S31: スタック外で追加された子リソース

S30は.cdkrdのbaselineが存在しないfresh stackから開始します。S20で使ったbaselineを引き継ぎません。CDKで作成したEventBridge Custom Event Busに、AWS CLIでRuleを追加します。

Rule の追加

export MANUAL_RULE_NAME="cdkrd-manual-rule-${SUFFIX}"

aws events put-rule \
  --name "${MANUAL_RULE_NAME}" \
  --event-bus-name "${EVENT_BUS_NAME}" \
  --state ENABLED \
  --event-pattern '{"source":["cdkrd.manual.v1"]}' \
  --region "${AWS_REGION}"

未記録状態の確認

pnpm exec cdk drift "${STACK_NAME}" \
  --fail

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail

期待値は次のとおりです。

  • cdk drift --fail: 終了コード 0
  • cdkrd check: Potential Drift
  • 未記録の Potential Drift だけであれば --fail の終了コードは 0

追加リソースの記録

pnpm exec cdkrd record "${STACK_NAME}" \
  --yes

記録直後は CLEAN になることを確認します。

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail

記録済みリソースの変更

aws events put-rule \
  --name "${MANUAL_RULE_NAME}" \
  --event-bus-name "${EVENT_BUS_NAME}" \
  --state ENABLED \
  --event-pattern '{"source":["cdkrd.manual.v2"]}' \
  --region "${AWS_REGION}"

set +e
pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail
CDKRD_EXIT=$?
set -e

echo "cdkrd exit code: ${CDKRD_EXIT}"

期待値は次のとおりです。

  • 終了コード 1
  • Added Resource
  • ベースラインに記録した Rule と実際の Rule の差分が表示される

シナリオ後の復元

Rule を削除します。

aws events delete-rule \
  --name "${MANUAL_RULE_NAME}" \
  --event-bus-name "${EVENT_BUS_NAME}" \
  --region "${AWS_REGION}"

この時点ではベースラインが Rule を監視しているため、Deleted として検出されます。シナリオ開始時にmktemp -dへ保存した.cdkrdのスナップショットへ戻します。git restore .cdkrdは未コミットの変更を消すため使用しません。

その後、cdkrd check --fail が CLEAN になることを確認します。

S40: Ignore

IAM Role に未宣言のインラインポリシーを追加し、その検出結果だけを無視します。

aws iam put-role-policy \
  --role-name "${ROLE_NAME}" \
  --policy-name "cdkrd-ignored-policy" \
  --policy-document file://fixtures/iam/manual-inline-policy.json

対話モードで対象を選択します。

pnpm exec cdkrd ignore "${STACK_NAME}"

.cdkrd/ignore.yaml に追加されたルールを確認します。

ignore:
  - path: <check が表示した正確なパス>
    stack: CdkrdVerification-*
    account: "<AWS_ACCOUNT_ID>"
    region: ap-northeast-1

確認項目:

  • 対象プロパティが cdkrd check に表示されなくなること
  • 同名スタックが別アカウント・別リージョンにある場合へ意図せず適用されないこと
  • 無視理由を YAML コメントとして残せること
  • cdk drift の結果には影響しないこと

シナリオ終了後はポリシーと ignore 設定を削除します。

aws iam delete-role-policy \
  --role-name "${ROLE_NAME}" \
  --policy-name "cdkrd-ignored-policy"

# シナリオ開始時に保存した .cdkrd のスナップショットへ戻す

S50: --pre-deploy

実リソースの変更を CDK コードへ取り込み、デプロイ前に実リソースとローカル synth が一致することを確認します。

実リソースを変更

aws sns set-topic-attributes \
  --topic-arn "${TOPIC_ARN}" \
  --attribute-name DisplayName \
  --attribute-value "adopt-me" \
  --region "${AWS_REGION}"

通常のチェックでは、デプロイ済みテンプレートとの差分として検出されます。

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict

ローカル CDK コード側の期待値を変更

本リポジトリでは topicDisplayName コンテキストで切り替えます。

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --pre-deploy \
  --fail \
  --context topicDisplayName=adopt-me

期待値は終了コード 0 です。これは、実リソースとローカル synth が一致していることを意味します。

CDK デプロイ

pnpm exec cdk deploy "${STACK_NAME}" \
  --context suffix="${SUFFIX}" \
  --context topicDisplayName=adopt-me \
  --require-approval never

デプロイ後、通常モードでも CLEAN になることを確認します。

pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail

検証終了後、既定値へ戻します。

pnpm exec cdk deploy "${STACK_NAME}" \
  --context suffix="${SUFFIX}" \
  --context topicDisplayName=cdkrd-verification \
  --require-approval never

JSON 出力と終了コード

CI では対話処理を行わず、--fail--json を使用します。

mkdir -p artifacts

set +e
pnpm exec cdkrd check "${STACK_NAME}" \
  --strict \
  --fail \
  --json \
  > artifacts/cdkrd-report.json
EXIT_CODE=$?
set -e

jq . artifacts/cdkrd-report.json
exit "${EXIT_CODE}"

検証項目:

  • stdout 全体が単一の JSON 配列として JSON.parse できること
  • 進捗や警告が stderr へ出力されること
  • クリーン時は終了コード 0
  • 確定ドリフト時は終了コード 1
  • CLI 利用方法や認証などの実行失敗は、ドリフトとは別の失敗として扱われること
  • Potential Drift のみの場合は drifted に含まれず、終了コード 0 であること

tests/assert-cdkrd-report.mjs では、少なくとも次を検証します。

  • ルートが配列である
  • 各要素に stackdriftedfindings がある
  • drifted が 0 以上の整数である
  • findings が配列である
  • 想定シナリオで finding の tierpath が一致する

GitHub Actions

静的検証

.github/workflows/test.yml は AWS 認証を必要としない処理だけを実行します。

  • pnpm install --frozen-lockfile
  • TypeScript の型チェック
  • lint
  • cdk synth
  • テストスクリプトの単体テスト

実 AWS ドリフトチェック

.github/workflows/drift-check.yml は、誤操作防止のため初期状態では workflow_dispatch のみにします。

name: drift-check

on:
  workflow_dispatch:

permissions:
  contents: read
  id-token: write

jobs:
  check:
    runs-on: ubuntu-latest
    environment: cdkrd-sandbox

    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-node@v6
        with:
          node-version: 22
          cache: pnpm

      - run: pnpm install --frozen-lockfile

      - uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: ap-northeast-1

      - name: Check drift
        env:
          STACK_NAME: ${{ vars.STACK_NAME }}
        run: |
          mkdir -p artifacts
          pnpm exec cdkrd check "${STACK_NAME}" \
            --strict \
            --fail \
            --json \
            > artifacts/cdkrd-report.json

      - uses: actions/upload-artifact@v7
        if: always()
        with:
          name: cdkrd-report
          path: artifacts/cdkrd-report.json

CI 用 AWS ロールには読み取り権限だけを付与します。recordignorerevertcdk deploy は CI の定期チェックへ含めません。

定期実行へ拡張する場合も、最初は通知のみとし、自動 revert は別設計・別承認フローに分離してください。

pnpm scripts

package.json には以下の操作を定義します。

{
  "packageManager": "pnpm@11.9.0",
  "scripts": {
    "build": "tsc --noEmit",
    "synth": "cdk synth",
    "deploy": "bash scripts/deploy.sh",
    "destroy": "bash scripts/destroy.sh",
    "baseline": "bash scripts/baseline.sh",
    "check": "cdkrd check",
    "check:ci": "cdkrd check --fail --strict --json",
    "verify:clean": "bash scripts/verify-clean.sh",
    "scenario:declared": "bash scripts/scenario-declared-drift.sh",
    "scenario:undeclared": "bash scripts/scenario-undeclared-drift.sh",
    "scenario:added": "bash scripts/scenario-added-resource.sh",
    "scenario:ignore": "bash scripts/scenario-ignore.sh",
    "scenario:pre-deploy": "bash scripts/scenario-pre-deploy.sh",
    "reset": "bash scripts/reset.sh",
    "test": "pnpm run build && pnpm run synth"
  }
}

スクリプトの共通要件

すべてのシナリオスクリプトは以下を満たします。

  • EXPERIMENT_IDEXPIRES_ATAWS_REGIONSUFFIXSTACK_NAME の存在を検証する。
  • aws-sandbox-runまたはaws-agent-leaseのpreflightでアカウントとリージョンを検証する。
  • スタックが *_COMPLETE 状態であることを確認する。
  • ベースライン作成済みか確認する。
  • シナリオ開始前の.cdkrdmktemp -dで作ったディレクトリへ退避する。
  • 予想終了コードを明示的に検証する。
  • 終了時に AWS リソースと .cdkrd を復元する。
  • 復元後にcdkrd check --fail --strict --jsonが期待したクリーン状態を返すことを確認する。
  • 復元に失敗した場合は、削除すべきリソース名とコマンドを表示する。

安全策

  • 検証対象スタックを明示し、引数なしの cdkrd revert を使用しません。
  • revert の前に必ず --dry-run を実行します。
  • スクリプトでは、意図的なテスト以外に --force を使用しません。
  • 未記録リソースを削除し得る --remove-unrecorded は初期スコープでは使用しません。
  • --yes は自動化された検証シナリオだけで使用します。
  • cdkrd check --yes は解決処理を実行しないため、書き込み操作にはスタンドアロンの recordignorerevert を使用します。
  • .cdkrd の差分をレビューせずに main ブランチへマージしません。
  • 検証用 IAM Role をアプリケーションから AssumeRole しません。
  • AWS 認証先とリージョンを各シナリオの開始時に表示します。
  • cdk.context.json が更新される可能性を考慮し、意図しない差分か確認します。

コスト

SNS Topic、IAM Role、EventBridge Event Bus と Rule 自体には、通常の検証範囲では大きな料金は発生しません。ただし、AWS の料金体系は変更される可能性があります。

本リポジトリでは次を禁止します。

  • SNS メッセージの大量発行
  • EventBridge イベントの大量送信
  • 有料ターゲットの接続
  • 長期間のリソース放置

検証終了後は必ずスタックを削除します。

クリーンアップ

シナリオで作成したスタック外リソースを先に削除します。

aws events delete-rule \
  --name "cdkrd-manual-rule-${SUFFIX}" \
  --event-bus-name "${EVENT_BUS_NAME}" \
  --region "${AWS_REGION}"

aws iam delete-role-policy \
  --role-name "${ROLE_NAME}" \
  --policy-name "cdkrd-manual-policy"

aws iam delete-role-policy \
  --role-name "${ROLE_NAME}" \
  --policy-name "cdkrd-ignored-policy"

スタックを削除します。

pnpm exec cdk destroy "${STACK_NAME}" \
  --force

最後に残存確認を行います。

aws cloudformation describe-stacks \
  --stack-name "${STACK_NAME}" \
  --region "${AWS_REGION}"

ValidationError でスタックが存在しないことを確認します。

既知の注意点

Potential Drift は誤検知の可能性がある

ベースラインがない状態では、テンプレート未定義の値が意図した値か、AWS が補完した値か、手動変更かを完全には判定できません。そのため、初回の Potential Drift は内容を確認してから record または ignore します。

CloudFormation ドリフト検出は全リソース・全プロパティを保証しない

cdk drift は CloudFormation のドリフト検出を使用します。対象リソースタイプが対応していても、テンプレートで明示していないプロパティは比較対象になりません。

record は承認ではなく監視開始点

record は「この未宣言状態を現時点の正として記録し、以後の変更を監視する」操作です。CDK コードで管理すべき設定を安易にベースラインへ逃がさないでください。

ignore は検出範囲を恒久的に狭める

ignore は対象パスの変更を今後報告しません。外部コントローラーが管理する値など、明確な所有者がある場合に限定し、理由をコメントへ残します。

revert は AWS への書き込み

revertcdkrdのうちAWSへ書き込む操作です。スタック更新中のリソース、他システムが継続的に更新する値、サービス側制約がある値では、復旧が拒否または失敗する可能性があります。

追加リソースの所有関係

他の CloudFormation スタックが所有するリソースを、単純なスタック外追加として扱わないことが重要です。検証時も、同じ親リソースへ別スタックから子リソースを追加しません。

拡張検証の完了条件

以下はignore--pre-deploy、CIまで含む拡張検証の完了条件です。記事初稿に必要なMust条件はdocs/implementation-plan.mdを参照します。記事下書きは blog#13_drafts/issue-13-cdkrd-vs-cdk-drift/)です。

  • 初回の Potential Drift を確認した
  • ベースラインを作成し、Git 管理した
  • 宣言済みドリフトを cdk driftcdkrd の両方で検出した
  • 未宣言ドリフトを cdkrd だけで検出した
  • 未記録の追加リソースが Potential Drift になることを確認した
  • 記録済み追加リソースの変更が確定ドリフトになることを確認した
  • revert --dry-run の計画を確認した
  • 宣言済みドリフトを revert して CLEAN に戻した
  • 未宣言ドリフトを revert して CLEAN に戻した
  • ignore.yaml のスコープとコメントを確認した
  • --pre-deploy でローカル synth と実リソースの一致を確認した
  • JSON 出力を機械的に検証した
  • CI が確定ドリフトで失敗した
  • クリーンアップ後に検証リソースが残っていない

検証結果の記録形式

検証結果は Issue または docs/results/YYYY-MM-DD.md に記録します。

# 検証結果

- 日付:
- 実行者:
- AWS アカウント:
- リージョン:
- Git commit:
- cdk-real-drift:
- aws-cdk-lib:
- Node.js:
- AWS CLI:

## シナリオ結果

| ID | baseline前提 | 結果 | cdk exit | cdkrd exit | Finding | coverage gap | 備考 |
|---|---|---|---:|---:|---|---|---|
| S10 | あり | PASS | 1 | 1 | CFn-Declared Drift | なし | |
| S20 | あり | PASS | 0 | 1 | CFn-Undeclared Drift | なし | |
| S30 | なし | PASS | 0 | 0 | Potential Drift | なし | |
| S31 | Rule記録済み | PASS | 0 | 1 | Added Resource | なし | |

## 想定外の挙動

- なし

## 証跡

- コマンド出力:
- JSON レポート:
- `.cdkrd` 差分:
- CloudTrail Event ID:

AWS アカウント ID、ARN、物理リソース名、ポリシー内容などを公開リポジトリへ掲載する場合は、必要に応じてマスキングしてください。

About

cdk drift vs cdk-real-drift (cdkrd) comparison verification

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages