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

API定義から実装まで全部TypeScriptでやっちゃおうというやつです。 Serverless FWやAWS SAMなどでは、TypeScriptをビルドするためのツール・プラグインなどを追加する必要がありました。 […]

広告ここから
広告ここまで

目次

    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で実装・デプロイできるようになりました。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark