🎃
CDK v2 の始め方 ~API リファレンスを読みながら作成~
初めに
AWSが提供しているIaCツールであるCDKについて、初期構築の手順をまとめる。
本ページでは、「CDKとは」の詳細な説明は省く。気になる方は以下を参照。
事前準備
- 以下を参考にnode.jsをインストール
https://qiita.com/ryome/items/eec08b28aff294e8c3d6 - cdkをインストール
$ npm install cdk
- cdkがインストールされていることを確認
$ cdk -v
- awsの認証情報を設定
$ aws configure
手順
アプリの作成
- 空のフォルダを作成し、移動。(cdkは必ず空フォルダ内でcdk init )
$ mkdir myapp
$ cd myapp
- 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)にコンパイルするための設定ファイル。
- cdk bootstrapを実行。アカウント、リージョン毎に1回実行すればよい。CloudFormation(以後、CFn)にcdkToolKitというスタックがデプロイされ、cdk用のバケットやIAMが作成される。
$ cdk bootstrap
AWSリソース(S3)を作成してみる
- 作成されたばかりの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)
// });
}
}
- コメントを削除し、リソースを定義する場所を見やすくする。
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リソースを定義
}
}
- ここから、S3を作成する場合の作成手順を少し丁寧に説明する。
- まず、CDK(v2) APIリファレンスにアクセスする。
- アクセスし、ブラウザ検索(ctrl+F or ⌘+f)で「s3」を検索。
- 以下のように、S3を選択するとタブが展開される。すると、「Consturcts」「Classes」「Structs」という見出しが確認できる。リソースを作成する場合、とりあえず「Consturcts」のみを参照すればよい。
- 「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」で確認できる。
- 上の「ページトップの表」と「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" //追加
}) //追加
}
}
- 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:
(以下、省略)
- 以下を実行し、デプロイするとS3 Bucketが作成される。
$ cdk deploy
- 以上が、AWSリソースの作成方法である。AWSリソースを削除したい場合は以下を実行。
$ cdk destroy
Discussion