LoginSignup
3
1

More than 3 years have passed since last update.

【AWS】【Lambda】 外部モジュールを読み込めるようにする方法

Last updated at Posted at 2020-08-14
  • 普通に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フォルダ以下に自動的にコピーするような処理があると完璧なのかなあ・・・
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1