継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

AWS CDK の S3 バケットの振る舞いを理解して開発スピードをあげよう!

タダです.

CDK のS3 を作ってみてリソースを扱う時に注意すべきことがあると学んだのでその結果を記事にまとめます.

S3 バケットを作るコードで生成される CloudFormation テンプレートの確認

S3 だけを作る TypeScript のコードを書くとして以下のようなコードになります.

import * as cdk from '@aws-cdk/core';
import s3 = require('@aws-cdk/aws-s3');

export class Mks3Stack extends cdk.Stack {
  
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const cdkS3TestBucket = new s3.Bucket(this, 'CdkS3TestBucket');
  }
}

cdk synth で CloudFormation テンプレートで出してみるとわかりますが,UpdateReplacePolicyDeletionPolicy の値が Retain になっています.つまり,この2つのパラメーターが Retain であることはリソースのスタック更新時や削除する時にリソースが残り続ける状態というステータスです.開発中にバケットを作って消してを繰り返したい時はこの設定は手間が増えてしまいます.

Resources:
  CdkS3TestBucketD2F17ADE:
    Type: AWS::S3::Bucket
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Metadata:
      aws:cdk:path: Mks3Stack/CdkS3TestBucket/Resource
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Modules: aws-cdk=1.22.0,@aws-cdk/aws-events=1.21.1,@aws-cdk/aws-iam=1.21.1,@aws-cdk/aws-kms=1.21.1,@aws-cdk/aws-s3=1.21.1,@aws-cdk/core=1.21.1,@aws-cdk/cx-api=1.21.1,@aws-cdk/region-info=1.21.1,jsii-runtime=node.js/v13.2.0
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
    Fn::Or:
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ca-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-northwest-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-central-1
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-2
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-3
          - Fn::Equals:
              - Ref: AWS::Region
              - me-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - sa-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-2
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-2

関連 ドキュメント

スタック削除時の動作の確認

試しに cdk destroy を実行してみると CloudForamtion スタックは消えるが S3 バケットの削除がスキップされているのがコンソール画面で確認できます.

cdk destroy                             
Are you sure you want to delete: Mks3Stack (y/n)? y
Mks3Stack: destroying...

 ✅  Mks3Stack: destroyed

コンソール画面 f:id:sadayoshi_tada:20200128222326p:plain

スタック削除時にバケットを削除したい時

スタック削除時にバケットを削除したい時は removalPolicy で定義します.

import * as cdk from '@aws-cdk/core';
import s3 = require('@aws-cdk/aws-s3');

export class Mks3Stack extends cdk.Stack {
  
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    const cdkS3TestBucket = new s3.Bucket(this, 'CdkS3TestBucket',{
      removalPolicy: cdk.RemovalPolicy.DESTROY
    });
  }
}

cdk synth で CloudFormation テンプレートを出してみると,UpdateReplacePolicyDeletionPolicy の値が Delete に変更されました.

Resources:
  CdkS3TestBucketD2F17ADE:
    Type: AWS::S3::Bucket
    UpdateReplacePolicy: Delete <= 変化
    DeletionPolicy: Delete <= 変化
    Metadata:
      aws:cdk:path: Mks3Stack/CdkS3TestBucket/Resource
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Modules: aws-cdk=1.22.0,@aws-cdk/aws-events=1.21.1,@aws-cdk/aws-iam=1.21.1,@aws-cdk/aws-kms=1.21.1,@aws-cdk/aws-s3=1.21.1,@aws-cdk/core=1.21.1,@aws-cdk/cx-api=1.21.1,@aws-cdk/region-info=1.21.1,jsii-runtime=node.js/v13.2.0
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
    Fn::Or:
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ca-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-northwest-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-central-1
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-2
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-3
          - Fn::Equals:
              - Ref: AWS::Region
              - me-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - sa-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-2
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-2

関連ドキュメント

docs.aws.amazon.com

docs.aws.amazon.com

スタック削除時の動作の確認

cdk destroy を実行してみると今度は CloudForamtion スタックも S3 バケットも削除されたのをコンソールで確認できました.

cdk destroy
Are you sure you want to delete: Mks3Stack (y/n)? y
Mks3Stack: destroying...
   0 | 22:27:27 | DELETE_IN_PROGRESS   | AWS::CloudFormation::Stack | Mks3Stack User Initiated
   0 | 22:27:30 | DELETE_IN_PROGRESS   | AWS::S3::Bucket    | CdkS3TestBucket (CdkS3TestBucketD2F17ADE) 
   0 | 22:27:30 | DELETE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata 
   1 | 22:27:31 | DELETE_COMPLETE      | AWS::S3::Bucket    | CdkS3TestBucket (CdkS3TestBucketD2F17ADE) 
   2 | 22:27:32 | DELETE_COMPLETE      | AWS::CDK::Metadata | CDKMetadata 

 ✅  Mks3Stack: destroyed

コンソール画面 f:id:sadayoshi_tada:20200128222858p:plain

まとめ

CDK で S3 の振る舞いについて書きました.ツールの振る舞いを理解して開発スピードをあげることに繋げられるようにしていきたいですね.この他にも CDK での理解したことはブログに書いていきます!