AWS SAM とは
AWS のサーバーレスアプリケーション開発に特化した AWS CloudFromation の拡張機能です。サーバーレスアプリケーション開発を支援する AWS SAM CLI が提供されており Lambda 関数をローカル実行できます。
AWS CDK とは
AWS SAM はサーバーレスに特化かつ JSON や YAML で定義します。対して AWS CDK は Python や TypeScript など一般のプログラミング言語で記述でき、 ほとんどの AWSサービス をカバーしている CloudFormation の拡張機能です。
CloudFormation よりも一般に少ないコード量で記述ができます。
インストール方法
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
https://aws.amazon.com/jp/getting-started/guides/setup-cdk/module-two/
AWS SAM CLI と CDK の連携とは
CDK は AWS リソースを構築するためだけのツールであるため、CDK がカバーしない、サーバーレスアプリケーションの「ローカルテスト」の機能を SAM で補完してあげる、といったイメージです。
IaC は CDK を使いたい、かつ ローカルでテストしたい ときにこの方法が選択肢になります。
CDK with SAM: ローカルテスト
アーキテクチャは次のようになります。cdk synth
コマンドで生成した Cfn テンプレートファイルを SAM CLI
に食わせて実行してあげることでローカル実行を実現します。
開発の流れ
CDK + SAM を使った開発の流れです。
事前準備
cdk init app --language=typescript
# サンプルコード付き
cdk init sample-app --language=typescript
# CDKがデプロイのために使用するS3バケットを作成(対象アカウント、リージョンにつき1回だけ実施)
cdk bootstrap
CDK 実装
CDK はたくさんのサンプルコードが github に公開されています。こちらを見ながら CDK を実装してみると良いでしょう。
CloudFormation テンプレートの出力
cdk synth
--profile オプションで AWSプロファイル を指定するとCDK_DEFAULT_ACCOUNT
とCDK_DEFAULT_REGION
が利用できるようになります。(config、credentialsに設定されている値が参照されます。)
サーバレスアプリケーションの作成
次のコマンドでインタラクティブにアプリケーションの作成ができます。
sam init
ローカル環境で実行
AWS にデプロイ
ローカルの CDK アプリケーションを AWS 環境にデプロイします。
cdk deploy --require-approval never --hotswap
- --require-approval 承認が必要な場合の変更レベル。never 指定で承認不要になる
- --hotswap CloudFormation を介さずに直接 AWSリソース が更新される。AWSリソースに変更がなく、ソースコードのみに変更がある場合は、このオプションを付けることでソースコードのみをAWSに反映できる。(Lambda 関数、Step Functions ステート マシン、および Amazon ECS コンテナ イメージをサポート)
Lambda をローカル実行する
ローカルテストでテンプレートファイルを指定する場合、cdk.out に出力されたリソースを参照しにいきます。ローカルのソースコードの変更を反映するには再度、cdk synth を実行する必要があります。また、この方法は毎回 sam build をする必要があります。
sam build --cached # --cached を付けておくとビルド時間を短縮できます
sam local invoke MyFunction --no-event --template ./cdk.out/CdkSamExampleStack.template.json
CDKを使ったホットリロード
ローカルテストではないのですが、実際の AWS 環境にデプロイした開発手法も紹介します。
AWS 環境にデプロイし、ローカルのソースコードの変更だけをデプロイしてテストする場合は以下のコマンドを試すことで素早い開発を実現できます。
cdk watch --hotswap
cdk.json
もしも js ファイルを watch 対象にする場合は js が exclude されているので、削除しておく。
{
"app": "npx ts-node --prefer-ts-exts bin/server.ts",
"watch": {
"include": [
"**"
],
"exclude": [
"README.md",
"cdk*.json",
"**/*.d.ts",
- "**/*.js",
"tsconfig.json",
"package*.json",
"yarn.lock",
"node_modules",
"test"
]
},
:
SAM を使ったホットリロード
sam sync --stack-name CdkStack --watch --template ./cdk.out/CdkSamExampleStack.template.json
- --stack-name 必須。アプリケーションの AWS CloudFormation スタックの名前。
- --watch ローカルの変更を監視し、変更分を AWS と同期する。
- --template CDK テンプレートを指定。
参考資料