如何使【AWS】【Lambda】能够加载外部模块
-
- 普通にLambdaをアップロードしただけではAWSにデフォルトでインストールされているライブラリ(AWS SDKとか)以外は使用できないみたい
Cannot find moduleと言われてしまいます
言語はNode.js
AWS CDKを使っている
在Lambda的Zip文件中包含外部模块的方法1
-
- AWSコンソールを使えば、LambdaファイルをZip圧縮したものをアップロードすることができるため、このZip内にnode_moduleディレクトリを含めて外部モジュールごとアップロードしてしまえば良いです
- ただし、AWS CDKを使用してアップロードする場合、この方法は使えません(/_;)
Option 1: 将外部模块的Zip文件注册到Lambda Layers中。
-
- node_modulesディレクトリをZip圧縮して、AWSコンソールからLambda Layersにアップロードすれば良いです
- ただし、せっかくLambdaのアップロードをAWS CDKで自動化しているのに、別の手作業が発生してしまうのは悲しいです
使用AWS CDK将Lambda Layers注册到方法3的过程中。
- これがやりたい
做法 (yì fǎ)
-
- 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フォルダ以下に自動的にコピーするような処理があると完璧なのかなあ・・・