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

地獄絵図!CDKプロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法

Avatar for アキキー アキキー
July 12, 2025
160

 地獄絵図!CDKプロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法

Avatar for アキキー

アキキー

July 12, 2025
Tweet

More Decks by アキキー

Transcript

  1. 自己紹介 アキキー(池田 晃尚) AWS エンジニア 好きな AWS サービス AWS CDK

    Amazon Q Developer CLI 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 2
  2. IaC の鉄則 IaC で定義したリソースは IaC 以外の方法で変更しない Stack のリソースを CloudFormation 以外の方法で変更しないでください。変更す

    ると Stack の Template と Stack リソースの現在の状態の間で不一致が起こり、 Stack の更新または削除でエラーが発生する場合があります。 CloudFormation ベストプラクティス 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 5
  3. ① 検出できない差分が存在する CDK ソースとリソースのプロパティを検出する方法は 2 種類ある cdk diff cdk drift

    MyPC Deploy diff Template Synth CDK ソース AWS Cloud Resources Manage Stack drift 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 10
  4. ① 検出できない差分が存在する cdk diff... CDK で合成した Template と Stack との差分を検出する

    S3 Bucket (旧) S3 Bucket (新) 差分 Stack Template 追加 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 11
  5. ① 検出できない差分が存在する cdk drift... Stack とリソースの差分を検出する Stack Resource (S3) 差分

    地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 12
  6. ① 検出できない差分が存在する cdk diff と cdk drift があれば Stack とリソースの差分は検知できない?

    → ドリフト検知では、Stack に定義されていないプロパティは差分を検出できない!! MyPC Deploy diff Template Synth CDK ソース AWS Cloud Manage Stack Resource (S3) ❌ バージョニング バージョニング:有効 Console drift ❌ バージョニング 差分なし! 差分なし! 設定変更 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 13
  7. ② Stack へのインポートは全てのプロパティを指定する必要がある cdk import とは? CDK にリソースの定義を書き、 cdk import

    すると Stack にリソースを取り込める Resources CDK Source CDK ソースに追加 Manage Stack Resources AWS Cloud (import 前) Resources Manage Stack AWS Cloud (import 後) cdk import 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 14
  8. 解決の流れ STEP1. Remove フェーズ Deploy CDK ソース リソース (S3 )

    STEP2. Migrate フェーズ Scan リソース (S3 ) CDK ソース X Delete ( 保護) スタック Migrate STEP3. Refactor フェーズ CDK IaC ジェネレータ STEP4. Import フェーズ Import CDK ソース リソース (S3) スタック Import Refactor リソース (L1 Construct ) リソース (L2 Construct ) ※ フェーズ名は独自に付けました 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 17
  9. STEP 1. Remove フェーズ 対象のリソースを Stack から除外するフェーズ STEP1. Remove フェーズ

    Deploy CDK ソース リソース (S3 ) X Delete ( 保護) スタック 1. 依存関係の調査 2. 対象リソースに削除保護をかける 3. Stack から対象のリソースを除外する 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 18
  10. Remove フェーズ:① 依存関係の調査 依存度の深いリソースから置き換えを検討する → 依存関係先を置き換える時、再度同じリソースを更新することとなるため Aurora Lambda DynamoDB ECS

    API GW ALB VPC リソースの依存関係 Aurora API Gateway ALB Lambda ECS DynamoDB VPC 依存関係性 深い 浅い Stack 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 19
  11. Remove フェーズ:② 対象リソースに削除保護をかける RemovalPolicy とは リソースを削除するときの挙動を設定する RemovalPolicy.DESTROY: 削除する RemovalPolicy.RETAIN: 保持する

    RemovalPolicy.SNAPSHOT: スナップショットを作成して削除する RemovalPolicy.RETAIN_ON_UPDATE_OR_DELETE: 作成時は削除。作成完了後は保 持する → RemovalPolicy.RETAIN を設定して、Stack からは削除するがリソースは保持する 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 20
  12. Remove フェーズ:③ Stack から対象のリソースを除外する CDK ソース から対象リソースの記述を除外する (Refactor フェーズで使うのでコメントアウトで OK)

    地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 21
  13. Remove フェーズ:③ Stack から対象のリソースを除外する cdk diff で差分を確認 リソースをスタックから除外 リソースの参照を追加 地獄絵図!CDK

    プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 23
  14. Remove フェーズ:③ Stack から対象のリソースを除外する cdk deploy でリソースを除外する CloudFormation コンソール上でイベントを確認すると、DELETE_SKIPPED になってい

    る 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 24
  15. STEP 2. Migrate フェーズ 対象のリソースを検出して、CDK ソースに取り入れるフェーズ STEP2. Migrate フェーズ Scan

    リソース (S3 ) CDK ソース Migrate IaC ジェネレータ 1. IaC ジェネレータで全体を Scan する 2. cdk migrate で CDK プロジェクトを作成 3. 対象のリソースを CDK プロジェクトに取り込む 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 25
  16. Migrate フェーズ:① IaC ジェネレータで全体を Scan する IaC ジェネレータとは? CloudFormation の機能

    AWS アカウントにあるリソースを Scan する Scan したリソースから Template を作成できる Scan AWS Cloud IaC Managed Scan 結果 作成 IaC ジェネレータ Scan Template 作成 IaC ジェネレータ Template 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 26
  17. Migrate フェーズ:① IaC ジェネレータで全体を Scan する 〜注意点〜 Full Scan を推奨

    → 特定のリソースに限定すると漏れが発生する可能性があるため リソースが多いと時間がかかる 1 日に Full Scan できる回数は限られている リソースの数が 10,000 未満の場合 10 回、超えていれば 1 回 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 27
  18. Migrate フェーズ:② cdk migrate で CDK プロジェクトを作成 cdk migrate とは?

    AWS リソースを CDK プロジェクトに取り込める実験的機能 リソースは L1 Construct となる 対応していないリソースタイプも数多く存在する IaC ジェネレータ Scan filter cdk migrate CDK プロジェクト dynamodb.CfnTable lambda.CfnFunction iam.CfnPolicy iam.CfnRole 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 28
  19. Migrate フェーズ:② cdk migrate で CDK プロジェクトを作成 cdk import ではなく

    cdk migrate を使う理由 cdk import...リソースとプロパティを明示的に指定 cdk migrate...リソース及びプロパティは指定元(Template、Scan、Stack)から値 を取得 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 29
  20. Migrate フェーズ:③ 対象のリソースを CDK プロジェクトに取り込む 生成したプロジェクトから、リソースの記述を既存プロジェクトにコピぺ コピー& ペースト CDK プロジェクト

    (cdk migrate で⽣成) CDK プロジェクト(いままでの) ※ cdk migrate に失敗したらトラブルシューディング: 「cdk migrate が失敗する」を参 照 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 30
  21. STEP 3. Refactor フェーズ CDK ソースの可読性を向上させるフェーズ STEP3. Refactor フェーズ CDK

    リソース (L2 Construct ) Refactor リソース (L1 Construct ) 1. スナップショットテストを作成/更新する 2. L1 → L2 Construct にリファクタリング 3. リソースの参照関係、シークレットを置き換える 4. スナップショットテストを更新する 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 31
  22. Refactor フェーズ:① スナップショットテストを作成/更新する スナップショットテストとは? Template (旧) Template (新) ⽣成 ⽣成

    CDK ⽐較 Test 想定した差分であることを検証 変更点 バージョニング:無効 S3 → スナップショットテストを実施することにより、リファクタリング後にリソースの 差分がないことを証明できる 参考:AWS CDK における単体テストの使い所を学ぶ 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 32
  23. Refactor フェーズ:② L1 → L2 Construct にリファクタリング Construct とは?...リソース群を定義する単位 CloudFormation

    Stack L2 Construct L3 Construct ApplicationLoadBalancedFargateService Bucket Bucket CfnBucket L1 Construct 抽象度 ⼩ ⼤ ・・・ 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 33
  24. Refactor フェーズ:② L1 → L2 Construct にリファクタリング L1 Construct...リソースのプロパティが CloudFormation

    のプロパティと 1:1 で対応して いる CloudFormation Template S3 Bucket CDK L1 Construct aws_s3.CfnBucket 1:1 で対応 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 34
  25. Refactor フェーズ:② L1 → L2 Construct にリファクタリング L2 Construct...リソースのプロパティが扱いやすいように抽象化されている CloudFormation

    Template CDK L2 Construct aws_s3.Bucket S3 Bucket 抽象化 KMS Key ⾃動的に作成 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 35
  26. Refactor フェーズ:② L1 → L2 Construct にリファクタリング L2 に置き換えることで、L1 の複雑で冗長なプロパティを書かなくてよい

    → 可読性が向上する L1 Construct L2 Construct 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 36
  27. Refactor フェーズ:② L1 → L2 Construct にリファクタリング 〜注意点〜 L2 に置き換えた時に論理

    ID が更新されるのでオーバーライドする 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 37
  28. Refactor フェーズ:② L1 → L2 Construct にリファクタリング スナップショットテストを実行して、リソースやプロパティの設定に差分がなくなるま で修正する ※

    TIPS: 「生成 AI を頼る」を参照 ※ トラブルシューティング: 「スナップショットテストが合わない」 を参照 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 38
  29. STEP 4. Import フェーズ Stack にリソースを取り込むフェーズ STEP4. Import フェーズ Import

    CDK ソース リソース (S3) スタック Import 1. cdk import で Stack にリソースを取り込む 2. cdk drift で Stack とリソースに差分がないか検証する 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 41
  30. Import フェーズ:① cdk import で Stack にリソースを取り込む cdk import とは?(再掲)

    CDK にリソースの定義を書き、 cdk import すると Stack にリソースを取り込める Resources CDK Source CDK ソースに追加 Manage Stack Resources AWS Cloud (import 前) Resources Manage Stack AWS Cloud (import 後) cdk import 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 42
  31. Import フェーズ:① cdk import で Stack にリソースを取り込む cdk import を実行後に質問に答えていき、想定したリソースのみ

    Stack にインポート できることを確認する 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 43
  32. Import フェーズ:② cdk drift で Stack とリソースに差分がないか検証する 取り込んだリソースのプロパティに差分がある可能性があるため cdk drift

    で差分検 知をする 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 44
  33. 生成 AI を活用する L1 Construct → L2 Construct の変換 →

    スナップショットテストでガードしているので、生成 AI にまかせても OK! ただし、スナップショットテスト自体を更新されないよう注意 リソースの関連性の抽出 ex) API Gateway を migrate するとき、Lambda Permission が検出できない → 関連しそうなリソースを、生成 AI を利用して検出するのもあり 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 49
  34. トラブルシューティング cdk migrate が失敗する スナップショットテストが合わない IaC ジェネレータ、 cdk import がリソースタイプをサポートしていない

    地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 50
  35. cdk migrate が失敗する CDK で対応していないプロパティがある場合エラーになる Migrate failed for `dynamodb`: DynamodbStack

    could not be generated because WarmThroughput is not a valid property for resource DynamoDBTableSampleDatastoreTable6900098D1T62J7NNMU9XG of type AWS::DynamoDB::Table 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 51
  36. cdk migrate が失敗する CloudFormation コンソールから、IaC ジェネレータの Template を確認したら、 cdk import

    しようとした Template が存在する 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 52
  37. cdk migrate が失敗する Template をローカルにダウンロードし、エラーが出ているプロパティを削除 その後、 --from-path で Template のパスを指定して

    cdk migrade を再実行する 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 53
  38. スナップショットテストが合わない L1 → L2 Construct に置き換える時、どうしてもプロパティが合わないことがある - "TimeToLiveSpecification": { -

    "Enabled": false, - }, L2 Construct では、不要なプロパティを設定できないように抽象化されていることが ある。 可読性が高い書き方となっているためなので、差分を理解して許容する必要がある。 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 54
  39. IaC ジェネレータ、cdk import がリソースタイプをサポートしていない IaC ジェネレータ リソースを削除するとき、削除するリソース名を控えておく L2 Construct に置き換えた時に差分としてでてきていないリソースを

    Template に 追加する 生成 AI を利用してリソースの関連性を検証する cdk import 現状は存在しないが、存在したら不可能... 地獄絵図!CDK プロジェクトを手動更新して生まれた大量のプロパティ差分を解消する方法 AWS CDK Conference Japan 2025 56