web-dev-qa-db-ja.com

AWS Lambdaでnpmモジュールをロードする方法は?

Webベースのエディターを使用して、いくつかのLambda関数を作成しました。ここまでは順調ですね。モジュール(promiseのQなど)を使用して、これらの拡張を開始したいと思います。モジュールをLambdaに送信する方法がわからないため、モジュールを自分の関数で使用できます。

this を読みましたが、EC2をセットアップし、そこからLambda関数を実行する必要があるようです。関数を作成するときにZipをアップロードするメカニズムがありますが、ローカルで開発された関数を送信する必要があるようです。私はWebベースのエディターで作業しているので、奇妙なワークフローのようです。

Lambda関数で使用するためにいくつかのモジュールを単純にデプロイするにはどうすればよいですか?

86
Fook

.ZipファイルをアップロードせずにNPMモジュールをロードすることはできませんが、実際にはこのプロセスを2つのクイックコマンドラインにまで減らすことができます。

方法は次のとおりです。

  1. Lambda関数ファイルを別のディレクトリに配置します。これは、Lambda用にnpmパッケージをローカルにインストールし、Lambdaにアップロードするものを分離してテストできるようにするためです。

  2. 手順1で作成した別のLambdaディレクトリにいる間に、npm install packageNameを使用してNPMパッケージをローカルにインストールします。

  3. ローカルで実行するときに関数が機能することを確認します:node lambdaFunc.js(コード内の2つのexport.handler行をコメントアウトして、ローカルでNodeで実行するようにコードを調整できます)。

  4. Lambdaのディレクトリに移動し、contentsを圧縮します。ディレクトリ自体を含めるにはnotを確認してください。

    Zip -r lambdaFunc.Zip .
    
  5. aws-cliがインストールされている場合、あなたの生活をもっと楽にしたいなら持っていることをお勧めします。次のコマンドを入力できます。

    aws lambda update-function-code --function-name lambdaFunc \
    --Zip-file fileb://~/path/to/your/lambdaFunc.Zip
    

    (あなたが私がしたように疑問に思った場合のために、上記のlambdaFunc部分の周りに引用符はありません)

  6. これで、Lambdaコンソールでtestをクリックできます。

  7. 上記のコマンドの両方に短いエイリアスを追加することをお勧めします。はるかに長いLambda更新コマンドのために私が持っているものは次のとおりです。

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --Zip-file fileb://~/path/to/your/lambdaFunc.Zip"
    
150
JohnAllen

Lambdaにnpmモジュールを含めるには、.Zipファイルが必要です。そして、実際にはLambda Webエディターをほとんど何にも使用すべきではありません。実動コードと同様に、ローカルで開発し、gitにコミットするなどしてください。

私の流れ:

1)私のLambda関数は通常、より大きなプロジェクトのヘルパーユーティリティであるため、その中に/ aws/lambdasディレクトリを作成して格納します。

2)各ラムダディレクトリには、関数コードを含むindex.jsファイル、package.json依存関係を定義するファイル、および/ node_modulesサブディレクトリ。 (package.jsonファイルはLambdaによって使用されません。ローカルでnpm installコマンドを実行できるようにするためです。)

package.json:

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

3)npmのインストールと圧縮から生成されたファイルがリポジトリを乱雑にしないように、すべてのnode_modulesディレクトリと.Zipファイルを.gitignoreします。

。gitignore:

# Ignore node_modules
**/node_modules

# Ignore any Zip files
*.Zip

4)モジュールをインストールし、ローカルで開発およびテストする

5)ラムダディレクトリを.Zipし、コンソールからアップロードします。

重要:FinderからMacの「圧縮」ユーティリティを使用してファイルを圧縮しないでください!ディレクトリのルート内からCLIからZipを実行する必要があります- こちら を参照

Zip -r ../yourfilename.Zip * 

Node.jsのAWS Lambda Deployment Package-AWS Lambda も参照してください。


注:

PhantomJSなどのモジュールがOS固有のバイナリをビルドするため、OSXでローカルにビルドされたノードパッケージがLambdaで失敗するという問題が発生する場合があります。

私が見つけた答えは here を使用して これらのスクリプト をDockerコンテナ内に構築することでした。

12
Yarin

サーバーレスフレームワークを使用すると、次のようなことができるようになります。

  1. Serverless.ymlファイルに次のものを追加します。

plugins: - serverless-webpack custom: webpackIncludeModules: forceInclude: - <your package name> (for example: node-fetch) 2.次にLambda関数を作成し、serverless deployでデプロイします。serverless.ymlに含まれるパッケージがそこにあります。

サーバーレスの詳細: https://serverless.com/framework/docs/providers/aws/guide/quick-start/

6
Toai

これでLambdaレイヤーを使用できるようになりました。必要なパッケージを含むレイヤーを追加するだけで、完全に実行されます。

この投稿に従ってください: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e

1
Eldad Hauzman