はじめに
TypeScriptで書いたコードをLambdaで動かす場合JavaScriptへのトランスパイルとパッケージのバンドルが必要です。
CDKでLambdaを作る方法はいくつかあるのですが、TypeScriptに適した書き方を見つけるのに少し戸惑ったので残しておきます。
結論
aws-cdk-lib/aws-lambda-nodejs
パッケージの NodejsFunction を使うと良いです。
JavaScriptで書いたコードも同様の書き方でバンドルしてくれます。
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
new lambda.NodejsFunction(
this,
'TypeScriptLambdaFunction',
{
functionName: `lambdaFunction`,
entry: 'src/handler.ts',
handler: 'handlerFunction',
runtime: lambda.Runtime.NODEJS_20_X,
}
);
余談
簡潔に書きすぎたので余談をします。
CDKでLambdaを作る時の他の書き方を紹介します。
コードを直書きする方法
短いコードであればこの方法が良さそうですね。
import * as lambda from 'aws-cdk-lib/aws-lambda';
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromInline('exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'),
deadLetterQueueEnabled: true,
});
ローカルファイルを指定する方法
指定したディレクトリをzip化してアップロードするだけです。
バンドルが不要だったり別途バンドルする場合はこれが良いのかもしれません。
import * as lambda from 'aws-cdk-lib/aws-lambda';
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_18_X,
handler: 'index.handler',
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
});
S3上のzipファイルを使う方法
CI/CDの都合上S3にコードを置きたい場合に使えそうですね。
もしくは複数チームで共通のコードを使う時とか。
import * as lambda from 'aws-cdk-lib/aws-lambda';
const cfnFunction = new lambda.CfnFunction(this, 'MyCfnFunction', {
code: {
s3Bucket: 's3Bucket',
s3Key: 's3Key',
}
})
ECRのイメージを使う方法
CI/CDの都合上ECRにイメージを置きたい場合に使えそうですね。
もしくは複数チームで共通のイメージを使う時とか。
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as ecr from 'aws-cdk-lib/aws-ecr';
const repo = new ecr.Repository(this, 'Repository');
new lambda.DockerImageFunction(this, 'ECRFunction', {
code: lambda.DockerImageCode.fromEcr(repo),
});
fromDockerBuild
多分コンテナでビルドしたコードを指定できる。
正直ちゃんと理解できてないです
コンテナ上でビルドしたい場合には良いのかもしれません。
おわりに
余談が長くなりましたね笑
知らない書き方もあって個人的にも勉強になりました。
それでは良いLambdaライフを!
参考