AWS CDK とは
AWS CDK は Python や TypeScript など一般のプログラミング言語で記述でき、ほとんどの AWSサービス をカバーしている CloudFormation の拡張機能です。CloudFormation よりも一般に少ないコード量で記述ができます。
事前準備
前提
- cdk version 2.39.0
- npm version 8.18.0
AWS CDK CLI のインストール
npm install -g aws-cdk
cdk --version
AWSアカウントのブートストラップ
CDK はデプロイ中、 S3 にファイルアップロードをするためブートストラップという作業します。この作業は 初回のみ です。
# Get the account ID
aws sts get-caller-identity
# Bootstrap the account
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
異なるアカウントとリージョンを使用したい場合は、必ずそれぞれをブートストラップしてください。
CDK で 実装 ( AWS リソースの定義)
TypeScript で進めます。次のコマンドで空プロジェクトを作成します。
mkdir hogehoge && cd hogehoge
cdk init app --language=typescript
# CDKがデプロイのために使用するS3バケットを作成(対象アカウント、リージョンにつき1回だけ実施)
cdk bootstrap
.
├── README.md
├── bin
│ └── hogehoge.ts # 最初に読まれるファイル。環境変数やタグはここで定義
├── cdk.json
├── jest.config.js
├── lib
│ └── hogehoge-stack.ts # ここでさまざまな AWS リソースを定義していく
├── node_modules
├── package-lock.json
├── package.json
├── test
│ └── hogehoge.test.ts
└── tsconfig.json
実装する上での参考資料
空プロジェクトが作れたら、いざ、実装! なのですが、どうしたら良いか 分からないという方、ご安心を!
AWS が公式にサンプルコードを公開しています。ほぼコピペで AWS を定義できてしまいます。
例えば、。
- S3の静的ホスティングを構築したい場合
- API Gateway + Lambda + DynamoDB でサーバレスアプリケーション環境を構築したい場合
みたいな感じです。
CloudFormataion テンプレートの出力
定義したリソースは、次のコマンドで CloudFormation テンプレートを出力できます。実行結果は cdk.out/HogeHogeStack.template.json
に出力されます。
cdk synth
CDK では、下記の環境変数を参照することで AWS アカウント ID と リージョン を取得できます。
CDK_DEFAULT_ACCOUNT
CDK_DEFAULT_REGION
--profile オプションで AWSプロファイル を指定すれば切り替えることができます。
AWS にデプロイ
作成した CDK は AWS にデプロイしてみましょう。全部が完成していなくても少しずつデプロイしながら実装してみましょう。
cdk deploy --require-approval never --hotswap
--require-approval
承認が必要な場合の変更レベルで never を指定すれば承認不要になります。
--hotswap
CloudFormation を介さずに直接 AWSリソース が更新される。AWSリソースに変更がなく、ソースコードのみに変更がある場合は、このオプションを付けることで ソースコードのみをAWSに反映できます。便利です。(Lambda 関数、Step Functions ステート マシン、および Amazon ECS コンテナ イメージをサポートしています。)
アプリケーション開発
ローカルでソースコードを変更したら 次のコマンドで AWS に自動デプロイが可能です。watch しておくと CloudWatch ログの内容がリアルタイムに出力されるため、こちらも開発する上でとても便利です。
cdk watch
cdk.json
watch 対象は cdk.json で定義されています。例えば、js ファイルを watch 対象にする場合はデフォルトだと js が exclude されているため、削除すれば良いです。
{
"app": "npx ts-node --prefer-ts-exts bin/hogehoge.ts",
"watch": {
"include": [
"**"
],
"exclude": [
"README.md",
"cdk*.json",
"**/*.d.ts",
- "**/*.js",
"tsconfig.json",
"package*.json",
"yarn.lock",
"node_modules",
"test"
]
},
: