サーバーレス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スクリプトです。
ラムダレイヤーの定義に使用している明示的な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
の規約です ここ
デプロイする前に、レイヤー内でnpm install
を実行してください。つまり、
cd ~/repos/repo-name/layers/utilityLayer/nodejs && npm install
それ以外の場合、レイヤーはnode_modules
フォルダーなしでデプロイされます。 Lambda UIからレイヤーの.Zipをダウンロードして、そのレイヤーのコンテンツを確認できます。