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

ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolera...

ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)

More Decks by アキキー | Akihisa Ikeda

Other Decks in Programming

Transcript

  1. CDKドリフトでは検出できない差分 スタック リソース AWS 定義されていないプロパティ (undeclared property) No drift detect

    定義されているリソースに ⼦リソース が追加される (out-bound added resource) No drift detect 定義されているリソースが 削除される (deleted resource) + Environment: [ + owner: "akikii__" +] + Function URLs Drift detection failed ドリフト検出が失敗する!
  2. CDKドリフトでは検出できない差分 スタック 定義されていないプロパティ (undeclared property) リソース AWS No drift detect

    + Environment: [ + owner: "akikii__" +] そんな中、希望の光が...! 定義されているリソースに ⼦リソース が追加される (out-bound added resource) No drift detect + Function URLs 定義されているリソースが 削除される (deleted resource) Drift detection failed ドリフト検出が失敗する!
  3. cdk-real-drift(cdkrd)とは? MyPC AWS Cloud 管理対象 ベースライン CDK スタック リソース群 CDKのデフォルト値を加味し、

    実際の状態と⽐較して差分を検出 が定義しないプロパティの期待値を記録 cdk drift:スタック定義のプロパティとリソースのプロパティを比較 cdkrd check:CDKのデフォルト値 + ベースライン + スタック定義 のプロパティを組み合わせてリソースのプロパティと比較
  4. cdk-real-drift(cdkrd)とは? MyPC AWS Cloud 管理対象 ベースライン CDK スタック リソース群 CDKのデフォルト値を加味し、

    実際の状態と⽐較して差分を検出 が定義しないプロパティの期待値を記録 cdk drift:スタック定義のプロパティとリソースのプロパティを比較 cdkrd check:CDKのデフォルト値 + ベースライン + スタック定義 のプロパティを組み合わせてリソースのプロパティと比較
  5. 以前のドリフト修正手順 地獄絵図!CDKプロジェクトを手動更新して生まれた大量のプロパティ差分を解消する by アキキー | Akihisa Ikeda by アキキー |

    Akihisa Ikeda 地獄絵図!CDKプロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法
  6. 以前のドリフト修正手順 地獄絵図!CDKプロジェクトを手動更新して生まれた大量のプロパティ差分を解消する by アキキー | Akihisa Ikeda by アキキー |

    Akihisa Ikeda 手順が27ページもあり複雑! スタックに操作を加えるので間違えたら大変... 地獄絵図!CDKプロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法
  7. ドリフトの修正手順 ① ドリフトを誤として破棄する Stack Lambda Function 1024 MB runtime: Runtime.NODEJS_24_X,

    timeout: Duration.minutes(10), memorySize: 1024, ... ② ドリフトを正としてCDKに反映する Lambda Function Stack runtime: Runtime.NODEJS_24_X, timeout: Duration.minutes(10), memorySize: 1024 , → 2048 ...
  8. ① ドリフトを誤として破棄する ドリフトの修正 Stack Lambda Function 1024 MB runtime: Runtime.NODEJS_24_X,

    timeout: Duration.minutes(10), memorySize: 1024, ... :破棄したいドリフトを選択してスタックに定義さ れている値もしくはデフォルト値に戻す cdkrd revert ※ 子リソースを破棄するには`--remove-unrecorded`オプションが必要
  9. ドリフトの修正:Step1. revertフェーズ 対象のドリフトを選択して破棄する ❯ pnpm exec cdkrd revert • CdkrdVerify-main

    (ap-northeast-1): reading live AWS state & computing drift… space = toggle · → = all · ← = none · enter = confirm # ▪ revert ▪ Description -> deployed-template value ▪ MemorySize -> remove (undeclared, not in baseline) # □ □ Timeout -> remove (undeclared, not in baseline) □ AWS_IAM ... -> DELETE out-of-band AWS::Lambda::Url 2 selected ◆ Apply 2 revert op(s) to CdkrdVerify-main? This WRITES to AWS. CdkrdVerify-main: CLEAN after revert. 選択済み: する 未選択:ドリフト状態のままにする ※ 出力は一部省略しています • Yes
  10. ② ドリフトを正としてCDKに反映する ドリフトの修正 Lambda Function Stack runtime: Runtime.NODEJS_24_X, timeout: Duration.minutes(10),

    memorySize: 1024 , → 2048 ... : ドリフトを検出しながら、コーディン グエージェントでドリフトが無くなるまで修正する --pre-deploy オプションをつけると合成したテンプレートと AWSリソースの差分を比較する ドリフトが無くなったらCDKデプロイする cdkrd check --pre-deploy
  11. ドリフトの修正:Step2. refactorフェーズ コーディングエージェントで差分をCDKソースに反映 /goal 以下の手順で、CDKソースと実環境のリソース状態を一致させてください。 を実行し、全ドリフト(declared + undeclared + added)を把握する

    ドリフトがあれば、該当プロパティをライブ値でCDKコードに明示的に定義する があればCDKコードに定義を追加し、`cdk import` で取り込む を実行し、残りの declared ドリフトをCDKソースに取り込む 差分が無くなるまで 〜 を繰り返す 1. `cdkrd check` 2. undeclared 3. added out-of-band resources 4. `cdkrd check --pre-deploy` 5. 2 4 → ドリフトが発生してないことを確認してデプロイ! ※ ここではリソースの変更が発生しません。
  12. ドリフトの修正:Step2. refactorフェーズ コーディングエージェントで差分をCDKソースに反映 /goal 以下の手順で、CDKソースと実環境のリソース状態を一致させてください。 を実行し、全ドリフト(declared + undeclared + added)を把握する

    ドリフトがあれば、該当プロパティをライブ値でCDKコードに明示的に定義する があればCDKコードに定義を追加し、`cdk import` で取り込む を実行し、残りの declared ドリフトをCDKソースに取り込む 差分が無くなるまで 〜 を繰り返す 1. `cdkrd check` 2. undeclared 3. added out-of-band resources 4. `cdkrd check --pre-deploy` 5. 2 4 これにてドリフトの修正は完了です! → ドリフトが発生してないことを確認してデプロイ! ※ ここではリソースの変更が発生しません。
  13. ドリフトを使い捨てる ドリフトを利用する 今年に入ってからドリフトを1コマンドで元に戻せるようになりました cdk deploy --revert-drift (2026/3/9) cdkrd revert (2026/7/6)

    EventBridge Schedulerのスケジュールを一度だけ実行したい時など、 気軽に試せてコマンド1つで戻せるのが便利です!