CDK で記述した Serverless API をローカル環境でテストする
注意:AWS SAM を使った CDK のローカル環境での利用は 2022.02.4 現在パブリックプレビュー中なので今後後方互換性の無い変更が加えられる可能性があることにご注意ください。
やりたいこと
CDK で記述した API Gateway + Lambda で構成された Serverless API をデプロイなしでテストできるローカルエンドポイントを立ち上げます。
使うもの
- AWS SAM CLI
- AWS CDK
- Docker
- Typescript
CDK をローカルでテストするには AWS CDK、パブリックプレビューバージョンの AWS SAM CLI, Docker が必要です。
インストールされていないものがあればこちらの記事を参考にインストールしてください。
検証環境
本記事で利用した環境は以下です。
CDK
# CDK cdk --version 2.10.0 (build e5b301f)
SAM CLI
# SAM CLI sam --version SAM CLI, version 1.37.0
Typescript
# Typescript tsc --version Version 4.4.3
CDK プロジェクトの作成
mkdir cdk-sam-example cd cdk-sam-example cdk init app --language typescript
Lambda のリソースを追加
lib/cdk-sam-example-stack.ts
を以下のコードに置き換えます。
import {Stack, StackProps} from "aws-cdk-lib"; import {Construct} from "constructs"; import * as lambda from "aws-cdk-lib/aws-lambda-nodejs"; export class CdkSamExampleStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new lambda.NodejsFunction(this, "MyFunction", { entry: "lambda/hello.ts", // accepts .js, .jsx, .ts, .tsx and .mjs files handler: "handler", // defaults to 'handler' }); } }
Lambda を記述
mkdir lambda cd lambda touch hello.ts
Hello を返すだけの Lambda を作成します。
hello.ts
export const handler = async function (event, context) { return return { statusCode: 200, headers: {}, body: { message: 'Hello from Lambda!' } }; };
API Gateway を追加
lib/cdk-sam-example-stack.ts
に API Gateway のリソースを追加します。
import {Stack, StackProps} from "aws-cdk-lib"; import {Construct} from "constructs"; import * as lambda from "aws-cdk-lib/aws-lambda-nodejs"; import * as apigateway from "aws-cdk-lib/aws-apigateway"; export class CdkSamExampleStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const backend = new lambda.NodejsFunction(this, "MyFunction", { entry: "lambda/hello.ts", // accepts .js, .jsx, .ts, .tsx and .mjs files handler: "handler", // defaults to 'handler' }); // API Gatewayを追加 new apigateway.LambdaRestApi(this, "myApi", { handler: backend, }); } }
CDK をビルドする
CDK プロジェクトの Root ディレクトリにビルドした CloudFormation テンプレートを出力します。ローカルエンドポイントを立ち上げる際にこのテンプレートを参照します。
cdk synth --no-staging > template.yml ... asset-output/index.js 1.4kb ⚡ Done in 88ms
sam local コマンドでローカルエンドポイントを立ち上げる
sam local start-api 2022-02-04 12:14:44 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit) Invoking index.handler (nodejs14.x)
http://127.0.0.1:3000/
でローカル環境でサーバーが起動しました。
curl でエンドポイントを呼び出すと、以下のレスポンスが確認できます。
curl http://127.0.0.1:3000/ {'message': 'Hello from Lambda!'}%