- 普通にLambdaをアップロードしただけではAWSにデフォルトでインストールされているライブラリ(AWS SDKとか)以外は使用できないみたい
-
Cannot find module
と言われてしまいます
-
- 言語はNode.js
- AWS CDKを使っている
方法① LambdaのZipファイルに外部モジュールを含める
- AWSコンソールを使えば、LambdaファイルをZip圧縮したものをアップロードすることができるため、このZip内にnode_moduleディレクトリを含めて外部モジュールごとアップロードしてしまえば良いです
- ただし、AWS CDKを使用してアップロードする場合、この方法は使えません(/_;)
方法② 外部モジュールのZipファイルをLambda Layersへ登録する
- node_modulesディレクトリをZip圧縮して、AWSコンソールからLambda Layersにアップロードすれば良いです
- ただし、せっかくLambdaのアップロードをAWS CDKで自動化しているのに、別の手作業が発生してしまうのは悲しいです
方法③ AWS CDKを使ってLambda Layersに登録する
- これがやりたい
やり方
- CDKプロジェクトフォルダ内に「layer」というフォルダを作成します
- 「layer」フォルダ内に「nodejs」というフォルダを作成します
- 「nodejs」フォルダ内で
npm init
を行い、必要なライブラリをインストールします - stackファイルに以下を追加します
const nodeModulesLayer = new lambda.LayerVersion(this, 'NodeModulesLayer', {
code: lambda.AssetCode.fromAsset('layer'),
compatibleRuntimes: [lambda.Runtime.NODEJS_10_X, lambda.Runtime.NODEJS_12_X]
});
- lambda呼び出しのコードにも一行追加します
const myFunction = new lambda.Function(this, 'MyHandler', {
functionName: 'SalesforceSample',
runtime: lambda.Runtime.NODEJS_12_X,
code: lambda.Code.fromAsset('lambda'),
handler: 'salesforceSample.handler',
layers: [nodeModulesLayer] // これ
});
問題点
- これだとコード作成時のnode_modulesと、アップロードされるnode_modulesを別々に管理する必要があるのがナンセンス
- node_modulesをnodejsフォルダ以下に自動的にコピーするような処理があると完璧なのかなあ・・・