TL;DR
bundling.commandHooks.beforeBundling
を定義して、その中でcp
でコピーしてあげればOK!
new NodejsFunction(this, 'lambda', {
runtime: Runtime.NODEJS_18_X,
architecture: Architecture.ARM_64,
functionName: 'my-nodejs-function',
handler: 'handler',
entry: 'lambda/index.ts',
bundling: {
commandHooks: {
beforeBundling(inputDir: string, outputDir: string): string[] {
return [`cp ${inputDir}/lambda/hoge.txt ${outputDir}`];
},
afterBundling(): string[] {
return [];
},
beforeInstall(): string[] {
return [];
},
},
},
});
解説
CDKでNode.jsのLambda関数を作る場合、NodejsFunction
クラスを使うことで、TypeScriptのビルドなど含めて、いい感じに行うことができます。
一方、js|tsに関係ないファイルは無視してバンドルしてくれるので、プログラム内でreadFileSync('hoge.txt')
とかやってる場合、そのテキストファイルがLambdaにアップロードされず、ちゃんと動いてくれません。
そういうとき、最初に書いた方法を使えば、任意のファイルをアップロードしてあげることができます。UNIXコマンドを何でも実行できるオプションなので、ファイルコピー以外にもかなり応用が効きそうですね!
ちなみにafterBundling
とbeforeInstall
は今回は使わないんですが、commandHooks
の中には必ず3点セットで関数を定義しないとエラーになるので、[]
だけを返す関数を書いておく必要があります。
参考サイト
- Command hooks: AWS CDK公式ドキュメント
- node.js - How can I bundle additional files with
NodejsFunction
? - Stack Overflow - NodeJsFunctionのビルド時に依存関係を解決する3つの方法
ではまた!