✍️

AWS CDK v2 事始め(1):S3バケットを作る

2023/01/02に公開

CDK(の勉強)はじめました

AWS CDKを使えるようになりたく勉強はじめました。
CDKでS3バケットを作れたのでその備忘録です。

== 2023-09-09 追記 CDK勉強まとめ ==

==================================

環境

Cloud9(t3.micro)

iam0001:~/environment $ cdk --version
2.55.1 (build 30f1ae4)
iam0001:~/environment $ npm --version
9.2.0
iam0001:~/environment $ aws --version
aws-cli/2.9.6 Python/3.9.11 Linux/4.14.301-224.520.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

S3バケット作成①

できるだけ簡易な方法でCDKでS3バケットを作成してみます。

新規プロジェクト用にディレクトリを作成し、カレントディレクトリにします。

PJ_NAME=CdkWorkshopStack
mkdir ${PJ_NAME}
cd ${PJ_NAME}

TypeScript CDKプロジェクトを作成します。

cdk init app --language typescript

TypeScriptをJavaScritpにコンパイルします。

npm run build

lib/CdkWorkshopStack.ts を更新し、S3バケットを作成する処理を追記します。

lib/CdkWorkshopStack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

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

    const bucket = new s3.Bucket(this, 'CreateBucket', {
      bucketName: "test-bucket-20221231",
      versioned: true
    });
  }
}

デプロイします。

cdk depoly

S3バケットが作成されました。

iam0001:~/environment/cdk-workshop (master) $ aws s3 ls | grep test-bucket
2023-01-02 00:47:02 test-bucket-20221231

S3バケット作成②

"S3バケット作成①"の続きで進めます。"S3バケット作成①"ではバケット名をスクリプトに直接記載していました。今回は、コンテキストを使用しS3バケット名を指定します。今回はcdk.jsonを使用します。

cdk.jsonに変数BucketName01を設定します。

cdk.json
{
  "app": "npx ts-node --prefer-ts-exts bin/cdk-workshop.ts",
  "watch": {
        : (省略)
  },
  "context": {
    "@aws-cdk/aws-lambda:recognizeLayerVersion": true,
    "@aws-cdk/core:checkSecretUsage": true,
    "@aws-cdk/core:target-partitions": [
      "aws",
      "aws-cn"
    ],
    "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
        : (省略)
    "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true,
    "BucketName01": "test-bucket-20230101-01"
  }
}

lib/cdk-workshop-stack.tsを更新し変数BucketName01でS3バケット名を指定するようにします。S3バケット名も変えておきます。

lib/cdk-workshop-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

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

    const BucketName01 = this.node.tryGetContext("BucketName01")

    const bucket = new s3.Bucket(this, 'CreateBucket', {
      bucketName: BucketName01,
      versioned: true
    });
  }
}

cdk diffで、想定通りに変更できたか確認します。

iam0001:~/environment/cdk-workshop (master) $ cdk diff
Stack CdkWorkshopStack
Resources
[~] AWS::S3::Bucket CreateBucket CreateBucketEFE7EF15 replace
 └─ [~] BucketName (requires replacement)
     ├─ [-] test-bucket-20230102
     └─ [+] test-bucket-20230101-01

バケット名が変更することがちゃんと判定されました。cdk deployを実行しS3バケットが作成されたことを確認します。

iam0001:~/environment/cdk-workshop (master) $ aws s3 ls | grep test-bucket
2023-01-02 01:01:42 test-bucket-20230101-01
2023-01-02 00:53:08 test-bucket-20230102

S3バケット作成③

"S3バケット作成②"の続きで進めます。"S3バケット作成②"ではコンテキストをcdk.jsonを使用しました。今回は、デプロイ時にコンテキスト・バリューを上書き設定します。

cdk deploy --context BucketName01=test-bucket-20230102-01

S3バケットが作成されたことを確認します。

iam0001:~/environment/cdk-workshop (master) $ aws s3 ls | grep test-bucket
2023-01-02 01:01:42 test-bucket-20230101-01
2023-01-02 00:53:08 test-bucket-20230102
2023-01-02 01:19:20 test-bucket-20230102-01

S3バケット作成④

"S3バケット作成③"の続きで進めます。
bin/cdk-workshop.tsを更新しコンテキストを設定します。

bin/cdk-workshop.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { CdkWorkshopStack } from '../lib/cdk-workshop-stack';

const app = new cdk.App({
  context: {
    BucketName02: 'test-bucket-20230102-02',
  },
})

new CdkWorkshopStack(app, 'CdkWorkshopStack', {});

lib/cdk-workshop.tsを更新し変数BucketName02でS3バケット名を指定します。

lib/cdk-workshop.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

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

    //const BucketName01 = this.node.tryGetContext("BucketName01")
    const BucketName02 = this.node.tryGetContext("BucketName02")

    const bucket = new s3.Bucket(this, 'CreateBucket', {
      bucketName: BucketName02,
      versioned: true
    });
  }
}

cdk diffで、想定通りに変更できたか確認します。

iam0001:~/environment/cdk-workshop (master) $ cdk diff
Stack CdkWorkshopStack
Resources
[~] AWS::S3::Bucket CreateBucket CreateBucketEFE7EF15 replace
 └─ [~] BucketName (requires replacement)
     ├─ [-] test-bucket-20230102-01
     └─ [+] test-bucket-20230102-02

バケット名が変更することがちゃんと判定されました。cdk deployを実行しS3バケットが作成されたことを確認します。

iam0001:~/environment/cdk-workshop (master) $ aws s3 ls | grep test-bucket
2023-01-02 01:01:42 test-bucket-20230101-01
2023-01-02 00:53:08 test-bucket-20230102
2023-01-02 01:19:20 test-bucket-20230102-01
2023-01-02 01:47:29 test-bucket-20230102-02

今回はここまで。
とりあえずCDKのコンテキスト(context)で変数を扱うことができました。

Discussion