AWS CDKでnode_modulesを含めてLambda(node.js)デプロイする方法
前提
CDKプロジェクト作成は「AWS CDKでLambda(node.js)をデプロイする」参照してください。
node_modulesを含める
AWS CDKはすごい便利っぽいけども、node_modules(外部ライブラリ)や共通のjsはどうするんだろうと思ってとりあえずnode_modulesの含め方です。
npm i --save-dev esbuild@0
bundleするesbuildモジュールというのを追加する必要があるようです。webpackみたいなものだと思います。
その後に、ここではmoment-timezoneを外部依存として追加します。
npm i --save moment-timezone
moment-timezoneを追加してpackage.jsonに含めておきます。
lib配下のts修正
tsファイルを修正します。
import { Stack, StackProps, aws_lambda_nodejs as lambda, Duration } from 'aws-cdk-lib'; import { Runtime } from 'aws-cdk-lib/aws-lambda'; import { Construct } from 'constructs'; export class Sample001Stack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const index = new lambda.NodejsFunction(this, 'IndexHandler', { entry: "lambda/index.js", runtime: Runtime.NODEJS_16_X, timeout: Duration.minutes(10), bundling: { nodeModules: ['moment-timezone'] } }) } }
buildingオプションでモジュールを配列で指定します。
building: { nodeModules: ['追加するモジュール','追加するモジュール',...] }
という感じで指定が必要なようです。
これでデプロイします。
cdk deploy
node_modules入ってます。
top level awaitがサポートされていない
AWS CDKでデプロイしたLambdaに関して、現時点では、esbuildでtop level awaitがサポートされていないようです。
support for top level await · Issue #253 · evanw/esbuild
I am currently working with deno which has top level support, is there any way to use esbuild with top level await?
参考サイト
@aws-cdk/aws-lambda-nodejs module · AWS CDK
Language | Package
CDKを使ったLambdaデプロイの最適解を考える
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント