この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
注意: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!'}%