web-dev-qa-db-ja.com

サーバーレス-Lambdaレイヤー「モジュール 'リクエスト'が見つかりません」

サーバーレスAPIを使用してデプロイする場合:

serverless deploy

ラムダレイヤーが作成されますが、関数を実行すると、次のエラーが発生します。

"Cannot find module 'request'"

しかし、.Zipファイルをコンソールから手動でアップロードした場合(デプロイ時にアップロードされたのとまったく同じファイル)、問題なく動作します。

なぜこれが起こっているのか誰にも何か考えがありますか?

environment:
SLS_DEBUG: "*"

provider:
name: aws
runtime: nodejs8.10
stage: ${opt:api-type, 'uat'}-${opt:api, 'payment'}
region: ca-central-1
timeout: 30
memorySize: 128
role: ${file(config/prod.env.json):ROLE}
vpc:
    securityGroupIds:
    - ${file(config/prod.env.json):SECURITY_GROUP}
    subnetIds:
    - ${file(config/prod.env.json):SUBNET}
apiGateway:
    apiKeySourceType: HEADER
apiKeys:
    - ${file(config/${opt:api-type, 'uat'}.env.json):${opt:api, "payment"}-APIKEY}

functions:
- '${file(src/handlers/${opt:api, "payment"}.serverless.yml)}'

package:
# individually: true
exclude:
    - node_modules/**
    - nodejs/**

plugins:
- serverless-offline
- serverless-plugin-warmup
- serverless-content-encoding

custom:
contentEncoding:
    minimumCompressionSize: 0 # Minimum body size required for compression in bytes

layers:
nodejs:
    package:
    artifact: nodejs.Zip
    compatibleRuntimes:
    - nodejs8.10
    allowedAccounts:
    - "*"

それが私のサーバーレスyamlスクリプトです。

4
Mikerizzo

ラムダレイヤーの定義に使用している明示的なlayersキーを使用しているときに、同様のエラーが発生しました。

私のエラー(Web検索のため)は次のとおりです。

Runtime.ImportModuleError: Error: Cannot find module <package name>

これは一時的な解決策だと思います。あなたのようにレイヤーを明示的に定義したかったのですが、機能していなかったため、バグのように見えました。

この問題について、サーバーレスで バグレポート を作成しました。他の誰かがこの同じ問題を抱えている場合、そこで追跡できます。

[〜#〜]ソリューション[〜#〜]

私は this この投稿をAWSの the docs に基づくサーバーレスフォーラムでフォローしました。

nodejsフォルダの下にnode_modulesを圧縮したので、解凍するとnodejs/node_modules/<various packages>のようになります。

次に、レイヤーの明示的な定義を使用する代わりに、packageおよびartifactキーを次のように使用しました。

layers:
  test:
    package:
      artifact: test.Zip

関数層では、次のように呼ばれます。

functions:
  function1:
    handler: index.handler
    layers:
      - { Ref: TestLambdaLayer }

TestLambdaLayer<your name of layer>LambdaLayerの規約です ここ

1
codeinaire

デプロイする前に、レイヤー内でnpm installを実行してください。つまり、

cd ~/repos/repo-name/layers/utilityLayer/nodejs && npm install

それ以外の場合、レイヤーはnode_modulesフォルダーなしでデプロイされます。 Lambda UIからレイヤーの.Zipをダウンロードして、そのレイヤーのコンテンツを確認できます。

1
Elon Zito