AWS CDKでTypeScriptで書かれたLambdaにLambda ProxyなREST APIを追加する

API定義から実装まで全部TypeScriptでやっちゃおうというやつです。

Serverless FWやAWS SAMなどでは、TypeScriptをビルドするためのツール・プラグインなどを追加する必要がありました。

が、AWS CDKを使えばwebpack.config.jsなどを書かずにTypeScriptで実装できます。

Lambda関数を作成する

1: Setup project

$ mkdir ts-api
$ cd ts-api
$ npx aws-cdk init app --language typescript

2: ライブラリを追加

$ yarn add @aws-cdk/aws-lambda-nodejs
$ yarn add -D @types/aws-lambda

3: TypeScriptでLambdaのコードを書く

$ vim lambda/entry.ts
import {
    APIGatewayProxyHandler
} from 'aws-lambda'

export const handler: APIGatewayProxyHandler = async (event) => {
    console.log(event)
    return {
        statusCode: 200,
        body: JSON.stringify(event)
    }
}

4: AWSリソースを定義する

$ vim lib/ts-api-stack.ts
import * as cdk from '@aws-cdk/core';
import { NodejsFunction } from '@aws-cdk/aws-lambda-nodejs'

export class DeployToS3Stack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const lambdaFunction = new NodejsFunction(this, 'LambdaFunction', {
      entry: 'lambda/entry.ts',
      handler: 'handler',
    })
  }
}

5: deploy

$ yarn build
$ yarn cdk bootstrap
$ yarn cdk deploy

REST API endpoint (Lambda proxy)を追加する

AWS API Gatewayとの連携もかなり簡単です。

1: Install a construct library

$ yarn add @aws-cdk/aws-apigateway

2: Define AWS resource

import * as cdk from '@aws-cdk/core';
import { LambdaRestApi } from '@aws-cdk/aws-apigateway';
import { NodejsFunction } from '@aws-cdk/aws-lambda-nodejs'

export class DeployToS3Stack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const lambdaFunction = new NodejsFunction(this, 'Function', {
      entry: 'lambda/entry.ts',
      handler: 'handler'
    })

    const api = new LambdaRestApi(this, 'API', {
      handler: lambdaFunction,
      proxy: true,
    })
  }
}

これでLambda ProxyなREST APIをALL TypeSciprtで実装・デプロイできるようになりました。

Comment