AWS CDKを使ってTypeScriptで書いたLambdaをデプロイする + SAM Localで動かす

LambdaのコードをTypeScriptで書いてCDKでデプロイしようとすると、CDKによるデプロイの外でトランスパイルしなければいかんよなぁ。。と思っていたんですが、今はそんなことしなくても良くなってるんですね。

前提

CDKとSAMがインストールされていること。

cdk --version
2.2.0 (build 4f5c27c)

sam --version
SAM CLI, version 1.40.1

やりたいこと

Getting started with AWS SAM and the AWS CDK でやってる内容を、デプロイするLambdaのコードをTypeScriptに変更して書く。

やったこと

プロジェクトの作成

まずプロジェクトを作っておきます。

mkdir lambda-local-sam
cd lambda-local-sam
cdk init app --language typescript

リソースの作成

あとはStackを書いて行きます。

Lambda Functionは、 aws-lambda モジュールを使用し、実行環境とコードのエントリーポイント、ハンドラを設定して作成します。Pythonの場合は以下。

import { Stack, StackProps } from 'aws-cdk-lib'
import { Construct } from 'constructs'
import * as path from "path"
import * as lambda from 'aws-cdk-lib/aws-lambda'

export class LambdaLocalSamStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props)

    new lambda.Function(this, 'MyFunction', {
      runtime: lambda.Runtime.PYTHON_3_7,
      handler: 'app.lambda_handler',
      code: lambda.Code.fromAsset('./lambda'),
    })
  }
}
def lambda_handler(event, context):
    return "Hello from SAM and the CDK!"

これに対してTypeScriptの場合は、実行環境をNode.jsにすることに加え、冒頭にも書きましたが、TypeScript -> JavaScript にトランスパイルする必要があります。
愚直にスクリプトを組むという方法もありますが、言語固有モジュールを利用するとそれらの処理を暗黙的に行ってくれます。Node.jsの言語固有モジュールは aws-lambda-nodejs です。

実際のコードは以下の通りです。

import { Stack, StackProps } from 'aws-cdk-lib'
import { Construct } from 'constructs'
import * as path from "path";
import * as nodeLambda from 'aws-cdk-lib/aws-lambda-nodejs'

export class LambdaLocalSamStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props)

    new nodeLambda.NodejsFunction(this, 'MyFunction', {
      entry: path.join(__dirname, '../lambda/index.ts'),
      handler: 'handler',
    })
  }
}
import { Handler } from 'aws-cdk-lib/aws-lambda'

export const handler: Handler = async function () {
    return "Hello from SAM and the CDK!";
}

CloudFormation templateの出力 & SAMでローカル実行

cdk synthコマンドでCloudFormationのtemplateを出力します (出力先は cdk.out)。

cdk synth --no-staging

出力されたtemplateを参照するようにsam localコマンドを実行します。

sam local invoke MyFunction --no-event -t ./cdk.out/LambdaLocalSamStack.template.json
(略)
"Hello from SAM and the CDK!"

Lambdaが実行されたことが確認出来ました。

参考

AWS CDK による AWS Lambda コードの管理
https://aws.amazon.com/jp/blogs/news/lambda-managed-by-cdk/

タイトルとURLをコピーしました