8
9

AWS SAM CLI と AWS CDK のローカルテスト連携

Last updated at Posted at 2023-08-22

AWS SAM とは

AWS のサーバーレスアプリケーション開発に特化した AWS CloudFromation の拡張機能です。サーバーレスアプリケーション開発を支援する AWS SAM CLI が提供されており Lambda 関数をローカル実行できます。

インストール方法

AWS SAM CLI のインストール (macOS)

brew tap aws/tap
brew install aws-sam-cli
sam --version

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 を使いたい、かつ ローカルでテストしたい ときにこの方法が選択肢になります。

sam+cdk.png

CDK with SAM: ローカルテスト

アーキテクチャは次のようになります。cdk synth コマンドで生成した Cfn テンプレートファイルを SAM CLI に食わせて実行してあげることでローカル実行を実現します。

sam+cdk_flow.png

開発の流れ

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_ACCOUNTCDK_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 されているので、削除しておく。

cdk.json
{
  "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 テンプレートを指定。

詳細 https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-sync.html

参考資料

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9