CDK で記述した Serverless API をローカル環境でテストする

sam localでCDKがテストできるよ
2022.02.04

この記事は公開されてから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!'}%

参考