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/