🎃

CDK v2 の始め方 ~API リファレンスを読みながら作成~

2024/01/22に公開

初めに

AWSが提供しているIaCツールであるCDKについて、初期構築の手順をまとめる。
本ページでは、「CDKとは」の詳細な説明は省く。気になる方は以下を参照。
https://aws.amazon.com/jp/cdk/

事前準備

  1. 以下を参考にnode.jsをインストール
    https://qiita.com/ryome/items/eec08b28aff294e8c3d6
  2. cdkをインストール
    $ npm install cdk
  3. cdkがインストールされていることを確認
    $ cdk -v
  4. awsの認証情報を設定
    $ aws configure

手順

アプリの作成

  1. 空のフォルダを作成し、移動。(cdkは必ず空フォルダ内でcdk init )
    $ mkdir myapp
    $ cd myapp
  2. cdk init を使用して、アプリを初期化。(Typescriptを指定)
    $ cdk init app --language typescript
    すると、以下のようなファイル群が作成される。それぞれの役割を簡単に記載する。
.
|-- README.md
|-- bin // stackを管理。stack同士の依存関係なども管理。
|   `-- myapp.ts
|-- cdk.json // cdkのconfigファイル。"app"にはcdkが実行する場所が記載されている。
|-- jest.config.js
|-- lib // 作成するAWSリソースを定義。binから呼び出される。
|   `-- myapp-stack.ts
|-- node_modules
|   `-- (省略)
|-- package-lock.json
|-- package.json // ライブラリのバージョンを管理。
|-- test // テストコードを管理。assertionsテストやsnapshotテストが実施可能。
|   `-- myapp.test.ts
`-- tsconfig.json // javascriptファイル(.js)にコンパイルするための設定ファイル。
  1. cdk bootstrapを実行。アカウント、リージョン毎に1回実行すればよい。CloudFormation(以後、CFn)にcdkToolKitというスタックがデプロイされ、cdk用のバケットやIAMが作成される。
    $ cdk bootstrap

AWSリソース(S3)を作成してみる

  1. 作成されたばかりのlib/myapp-stack.tsファイルを確認。コメント部分は削除してよい。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';

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

    // The code that defines your stack goes here

    // example resource
    // const queue = new sqs.Queue(this, 'MyappQueue', {
    //   visibilityTimeout: cdk.Duration.seconds(300)
    // });
  }
}
  1. コメントを削除し、リソースを定義する場所を見やすくする。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class MyappStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // ここにawsリソースを定義
  }
}
  1. ここから、S3を作成する場合の作成手順を少し丁寧に説明する。
  2. まず、CDK(v2) APIリファレンスにアクセスする。
  3. アクセスし、ブラウザ検索(ctrl+F or ⌘+f)で「s3」を検索。
  4. 以下のように、S3を選択するとタブが展開される。すると、「Consturcts」「Classes」「Structs」という見出しが確認できる。リソースを作成する場合、とりあえず「Consturcts」のみを参照すればよい。
  5. 「Consturcts」>「Bucket」を選択すると、S3のリファレンスが表示される。本ページでは、最低限必要な情報である「ページトップの表」と「Initializer」について説明する。
  • ページトップの表
    この表(下図)はS3 Bucketのmoduleのimport先を示している。
    TypeScriptの場合、以下のようにimportする。(import方法は複数あるが本ページでは表に寄せた記述とする)
import { Bucket } from 'aws-cdk-lib/aws-s3';

  • Initializer
    Intializerは、上でimportしたclassの定義を示す。
new Bucket(scope: Construct, id: string, props?: BucketProps)
  • scope: 親のConstruct。thisを指定。
  • id: 一意のID。CFnの論理IDに対応。
  • props: 設定値。S3 Bucketの場合、bucketNameなどを設定する。ここで設定しなかった値は全てdefault値となる。default値の詳細はリファレンスページの「Construct Props」で確認できる。
  1. 上の「ページトップの表」と「Initializer」を参考に、Bucketを定義する。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Bucket } from 'aws-cdk-lib/aws-s3'; //追加

export class MyappStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    new Bucket(this, "Bucket", {        //追加
      bucketName: "test-proyogram-2024"     //追加
    })                                       //追加
  }
}
  1. cdkからCFnテンプレートを作成する。以下を実行すると、cdk.outフォルダが作成され、CFnテンプレートが格納される。また、出力結果から作成されるAWSリソースを確認する。
    $ cdk synth
出力結果
Resources:
  Bucket83908E77:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: test-proyogram-2024
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Metadata:
      aws:cdk:path: MyappStack/Bucket/Resource
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Analytics: v2:deflate64:H4sIAAAAAAAA/yXGQQ5AMBAAwLe4t0v5AT/gAVLtSlbZJrbVg/i7iNNMC6bpwFS2iHY+6J0WuKdkXVC2yCwd3H12AZMaVv73fB1RYj4dfh8ie0oU+VEcPcIm9dUaMNBUmxDpM3OiA2H8fQFVkZcIcwAAAA==  
    Metadata:
      aws:cdk:path: MyappStack/CDKMetadata/Default
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
(以下、省略)
  1. 以下を実行し、デプロイするとS3 Bucketが作成される。
    $ cdk deploy
  2. 以上が、AWSリソースの作成方法である。AWSリソースを削除したい場合は以下を実行。
    $ cdk destroy

参考

Discussion