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

壊して学ぶAWS CDK: そのcdk deployで消えるもの、残るもの

壊して学ぶAWS CDK: そのcdk deployで消えるもの、残るもの

AWS CDKの変更で「何が消え、何が残るのか」を、実際に壊しながら確かめます。RemovalPolicy、Construct ID変更、CDK Refactor、cdk diffとcdk driftの違いを具体例で整理。デプロイ成功だけでは分からない、リソース・データ・アプリへの影響を安全に見極める方法を紹介します。

登壇資料 @CDK Conference 2026
https://jawsug-cdk.connpass.com/event/393595/

Avatar for Kazuki Adachi

Kazuki Adachi

July 18, 2026

More Decks by Kazuki Adachi

Other Decks in Technology

Transcript

  1. 自己紹介 SPEAKER 好きなAWSサービス AWS Community Builder AWS All Certifications Engineer

    JAWS-UG 配信部 最近ハマっているもの Kazuki Adachi KiroとCDK @k_adachi_01 コーヒーとトレラン 2
  2. “To invent you have to experiment, and if you know

    in advance that it’s going to work, it’s not an experiment.” 「発明するには実験しなければならない。 あらかじめ成功すると分かっているなら、 それは実験ではない」 Jeff Bezos Amazon 2015 Letter to Shareholders https://ir.aboutamazon.com/files/doc_financials/annual/2015-Letter-to-Shareholders.PDF 7
  3. lib/s3-stack.ts ts const bucket = new s3.Bucket(this, "Uploads" removalPolicy: RemovalPolicy.DESTROY,

    autoDeleteObjects: true, }); データとか知らん、消えてしまえ 13
  4. CDKコードからBucketを削除 - const bucket = new s3.Bucket( this, "Uploads", {

    removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, - }); 実出力(抜粋) Resources [-] AWS::S3::Bucket Uploads4F6EB0FD destroy [-] Custom::S3AutoDeleteObjects 16
  5. deploy成功 実出力(抜粋) $ cdk deploy S3Stack S3Stack: deploying... [1/1] DELETE_IN_PROGRESS

    AWS::S3::Bucket DELETE_COMPLETE AWS::S3::Bucket UPDATE_COMPLETE AWS::CloudFormation::Stack ✅ S3Stack 17
  6. OrderStack export class OrderStack extends Stack { constructor( scope: Construct,

    id: string, props?: StackProps, ) { super(scope, id, props); const table = new Table(this, "Table", { partitionKey: { name: "id", type: AttributeType.STRING, }, removalPolicy: RemovalPolicy.RETAIN, }); } } DynamoDB 変更前: 3件 24
  7. Construct IDを変更する - const table = new Table(this, "Table", {

    + const table = new Table(this, "Orders", { 25
  8. cdk diffのmethod method auto change-set template 動作 Change Setを試す 失敗したらtemplate比較

    Change Setを使って差分を確認 template同士を比較 https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-diff.html 30
  9. これはConstruct ID const table = new Table( this, "Orders", {

    /* ... */ }, ); これは変数名ではない Construct ID 34
  10. Construct IDを変えた結果 Construct ID Table Construct ID Orders → →

    旧Logical ID 旧DynamoDB → Table 新Logical ID 新DynamoDB → Table CloudFormationには、別のリソースに見える 36
  11. Logical IDを付け替える 旧Logical ID 新Logical ID → 同じ物理 DynamoDB Table

    Logical IDは変わる 物理リソースは変えない 45
  12. まず --dry-run $ cdk refactor --unstable=refactor --dry-run 実出力 The following

    resources were moved or renamed: AWS::DynamoDB::Table OrderStack/Table/Resource → OrderStack/Orders/Resource 46
  13. 今回の変更をrefactorする Construct ID: Table → Orders Logical ID: 旧 →

    新 物理Table: 同じものを引き継ぐ dry-run 実出力 OrderStack/Table/Resource → OrderStack/Orders/Resource 同じ物理Tableを引き継ぐ 48
  14. driftがあれば終了コード1 $ cdk drift QueueStack --fail --fail driftが見つかったらexit code 1

    すべてのリソースやプロパティが、drift detectionの対象とは限らない 59
  15. IN_SYNCは何を意味するか Stackのdrift status 意味 IN_SYNC 対応リソースの現在の構成がtemplateと一致 DRIFTED 1つ以上のリソースに差分がある NOT_CHECKED driftをまだ確認していない

    UNKNOWN driftの確認に失敗した IN_SYNCでも、アプリが正常に動くとは限らない リソース単位ではMODIFIED / DELETEDなどのstatusも表示される 62
  16. 変更前は読める GetObject: 成功 kms:Decrypt: Allow Lambda invoke 実出力 $ aws

    lambda invoke ... { "StatusCode": 200 } { "status": "ok", "object": "sample.txt" } 65
  17. AccessDenied Lambda invoke 実出力 { "StatusCode": 200, "FunctionError": "Unhandled" }

    AccessDenied not authorized to perform: kms:Decrypt no identity-based policy allows the action 71
  18. 消えていない head-object 実出力 $ aws s3api head-object --bucket <bucket> --key

    sample.txt ContentLength: 17 describe-key 実出力 $ aws kms describe-key --key-id <key-id> KeyState: Enabled 72
  19. IN_SYNCでも、アプリは壊れる 確認 cdk diff cdk drift cdk deploy アプリ 結果

    kms:Decrypt削除を表示 IN_SYNC UPDATE_COMPLETE AccessDenied リソースもデータも残っている でも、アプリからは使えない 73
  20. 見ているものが違う コマンド cdk diff cdk drift AI 比較しているもの 新しいtemplate ↔

    デプロイ済みtemplate デプロイ済みtemplate ↔ 現在のリソース AIに見えるのは、コードとコマンド出力だけ どちらも、アプリが正常に動くことまでは確認していない 74