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


147

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

私はを通じて読んだが、EC2を設定し、そこからラムダ関数を実行している関与しているようです。関数を作成するときにzipをアップロードするメカニズムがありますが、ローカルで開発された関数を送信する必要があるようです。私は奇妙なワークフローのように思えるWebベースのエディターで作業しているので。

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


7
それはすべてここのドキュメントで説明されて- docs.aws.amazon.com/lambda/latest/dg/...を
arcseldon

回答:


196

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

方法は次のとおりです。

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

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

  3. ローカルで実行するときに関数が機能することを確認しますnode lambdaFunc.jsexport.handlerコードの2 行をコメント化して、コードをノードでローカルで実行するように調整できます)。

  4. ラムダのディレクトリに移動し、圧縮した内容を確認して、ないディレクトリ自体を含めること。

    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コンソールでテストをクリックできます。

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

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

10
ターゲットとする地域を明示する必要がある場合があります: aws lambda update-function-code --function-name lambdaFunc --region eu-west-1 --zip-file fileb://~/path/to/your/lambdaFunc.zip
GreensterRox

2
大変な作業のようですが、これを実行することは、これらのラムダ式を作成するより良い方法です...どうもありがとう!
Mike Perrenoud 2017年

9
これらの手順を使用する場合--zip-file fileb://と使用しない場合の比較--zip-file file://
McLovin

2
必ずディレクトリの内容のみを圧縮し、CLIから圧縮してください(Macのファインダーから「compress」コマンドを使用しても機能しません)。
Yarin、

2
これは非常に便利でした。私にとってこの作業を行うには、少なくとも2つのものが欠けていました... 1)それは私--zip-file fileb:fileためではありませんでした。2)MacOSの上では3つのスラッシュなどなどであると思われるfileb:///Users/wio/Documents
トビ

29

.zipファイルを含めるために必要とされるNPMラムダのモジュールを。そして、実際に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)すべてのnode_modulesディレクトリと.zipファイルを.gitignoreして、npmのインストールと圧縮から生成されたファイルがリポジトリを乱雑にしないようにします。

.gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4)npm installディレクトリ内から実行してモジュールをインストールし、ローカルで関数を開発/テストします。

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

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

zip -r ../yourfilename.zip * 

注意:

LambdaのLinuxベースの環境にデプロイしたときに一部のプラットフォーム固有のモジュールが失敗する可能性があるため、ノードモジュールをMacにローカルにインストールすると、問題が発生する可能性があります。(https://stackoverflow.com/a/29994851/165673を参照)

解決策は、使用しているLambda Node.jsランタイムに対応するAMIから起動されたEC2インスタンスでモジュールをコンパイルすることです(このLambdaランタイムとそれぞれのAMIのリストを参照)。


Node.jsのAWS Lambdaデプロイメントパッケージもご覧ください-AWS Lambda



9

これが役に立てば幸いです。サーバーレスフレームワークを使用すると、次のようなことができます。

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

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

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


最初にインストールする必要がありますserverless plugin install --name pluginName
Liad Livnat

1

npmモジュールをnodejsパッケージ内にバンドルし、zipとしてAWS Lambdaレイヤーにアップロードする必要があります。次に、以下のようにmodule / jsを参照し、そこから使用可能なメソッドを使用する必要があります。const mymodule = require( '/ opt / nodejs / MyLogger');

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.