AWS CDKを触ってみる
AWS CDK とは
AWS Cloud Development Kit (AWS CDK) は、使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースを定義するためのオープンソースのソフトウェア開発フレームワークです。
https://docs.aws.amazon.com/cdk/latest/guide/hello_world.html)
Getting Startedをやっていく(まずCDK Toolkitをインストールする。
npm install -g aws-cdk
基本的な使い方は以下のよう。
cdk init
cdk ls
cdk deploy
etc...
その他のコマンドはdocument参照。
Bootstrapping
順番が上下しちゃったけどBootstrapingをやる。
Bootstrappingとは
- CDKがデプロイを実行するためには必要なリソースをプロビジョニングしなければならないことがある。
- ローカルのファイル、Dockerイメージを使う場合
- CloudFormationのテンプレートが50kbを超える場合
- もう一つはまだ理解できなかったのでdocument参照 mm
- リソースとは、ファイルを保存するためのS3バケットやIAMロールなどがある。
- これらをプロビジョニングすることをBootstrappingという。
- これらのリソースはCDKToolkitという名前でCloudFormationスタックで定義される。
やってみる
次を実行。
$ cdk bootstrap aws://<ACCOUNT-NUMBER>/<REGION>
⏳ Bootstrapping environment aws://<ACCOUNT-NUMBER>/<REGION>
CDKToolkit: creating CloudFormation changeset...
[██████████████████████████████████████████████████████████] (3/3)
✅ Environment aws://<ACCOUNT-NUMBER>/<REGION> bootstrapped.
awsのprofileが設定されているなら
cdk bootstrap --profile <PROFILE_NAME>
でもOK
ちなみにcdk bootstrap --show-template > bootstrap-template.yaml
をするとCloudFormationのテンプレートを見ることができる。
また、現時点ではlegacyバージョンのテンプレートが使用されるらしい。modernバージョンのテンプレートを使うにはexport CDK_NEW_BOOTSTRAP=1
する。違いはdocument参照。
Getting Started続き
まず、cdk init
でプロジェクトの雛形を作成。
$ cdk init app --language typescript
すると、いくつかのファイルが生成される。
$ tree -a -L 1
.
├── .git
├── .gitignore
├── .npmignore
├── README.md
├── bin
├── cdk.json
├── cdk.out
├── jest.config.js
├── lib
├── node_modules
├── package-lock.json
├── package.json
├── test
└── tsconfig.json
6 directories, 8 files
ビルドしてみる。
$ npm run build
> getting-started@0.1.0 build
> tsc
$ cdk ls
GettingStartedStack
初期状態ではGettingStartedStackが生成されてるみたい。
s3を追加してみる
まずライブラリを追加。
npm install @aws-cdk/aws-s3
次にlib/getting-started-stack.ts
を書き換える。
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
export class GettingStartedStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
}
}
s3.Bucket()はscope, id, propsの3つの引数を取る。
- scope
- scopeを理解するにはApp, Stack, Constructを理解する必要がある。
- これはDevelopersIOのAWS CDK の3種類の Construct を使ってデプロイしてみたが詳しい
- 簡単にいうとリソースを木構造で表すことができる。
- ここではBucketの親がGettingStartedStackであることを示している。
- id
- AWSのリソースを一意に表すもの(名前は後述のbucketNameプロパティで指定できる)
- props
- バケットのプロパティ
synth
cdk synth
を実行することでCloudFormationのテンプレートが合成される。
また、同じものがcdk.outに書き込まれる。
$ cdk synth
Resources:
MyFirstBucketB8884501:
Type: AWS::S3::Bucket
Properties:
VersioningConfiguration:
Status: Enabled
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
Metadata:
aws:cdk:path: GettingStartedStack/MyFirstBucket/Resource
CDKMetadata:
Type: AWS::CDK::Metadata
Properties:
Analytics: v2:deflate64:H4sIAAAAAAAAEyWNSwrDMAxEz9K9o8T0sy7NDdITBFkFx1QCS24XxnfPbzUP5g3jwQ93GC7P+a8dhtRXlExQ3zZjcqOwWi5obvzwRColI+28FSFaFG5uH+oV6qtgokM8qTXHEggW7X/+Bv6xvSwaY5cLW/wSTGeuOl0jXIIAAAA=
Metadata:
aws:cdk:path: GettingStartedStack/CDKMetadata/Default
Condition: CDKMetadataAvailable
Conditions:
CDKMetadataAvailable:
Fn::Or:
- Fn::Or:
- Fn::Equals:
- Ref: AWS::Region
- af-south-1
- Fn::Equals:
- Ref: AWS::Region
- ap-east-1
- Fn::Equals:
- Ref: AWS::Region
- ap-northeast-1
/* ... */
ここで生成されるCloudFormaition テンプレートは適用可能なもの。
問題があればエラーがでる。
deploy
cdk deploy
コマンドを打つと、実際にAWS上にリソースが作成される。
$ cdk deploy
GettingStartedStack: deploying...
GettingStartedStack: creating CloudFormation changeset...
[██████████████████████████████████████████████████████████] (3/3)
✅ GettingStartedStack
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789123:stack/GettingStartedStack/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
正常終了していればCloudFormationとS3が作成されているはずである。