簡體   English   中英

使用 AWS lambda 內部有 package.json 層和 Z04A7DA3C5B04CAD85DA1EEBBB8Z5 層

[英]Using an AWS lambda that has a package.json inside with a Lambda layer

我有一個 AWS Lambda,其文件夾結構如下:

src-ts
│   app.js
│   package.json    
│
└───

在我的 Lambda 的 package.json 內部,我將依賴項列表和type設置為module

然后我有一個 Lambda 層,其文件夾結構是這樣的

nodejs
│   node_modules
│   package.json   
│   package-lock.json
└──────

我的層 package.json 與我的 Lambda 內部的一層相同。

當我嘗試運行 lambda 時,我收到從 /var/task/src-ts/app.js 導入的"Cannot find module '/opt/nodejs/node14/node_modules/@aws-sdk/credential-provider-node' imported from /var/task/src-ts/app.js",錯誤。 我假設這個錯誤與我的 Lambdas 本地 package.json 有關。

我試圖將我的導入更改為使用/opt/nodejs/node14/node_modules/@aws-sdk/credential-provider-node'而只是/opt/@aws-sdk/credential-provider-node ,這些嘗試都沒有成功。

I finally changed module setting in my tsconfig.json to commonjs , redeployed my transpiled JS to the Lambda a different time, this time without a package.json inside, and my Lambda worked as expected.

有沒有辦法讓 package.json 在與部署的 Lambda 相同的文件夾中,並使用來自 AWS Lambda 的依賴項?

感謝您的幫助!

我在 lambda 和層中多次使用了這樣的設置和 package.json。 The code in the lambda can import libraries from the layer's package.json the same way that it would if the dependency were listed in its own package.json.

因此,根據您使用的是 commonjs 還是模塊,您可以使用

const aws = require("@aws-sdk/credential-provider-node");

或者

import aws from "@aws-sdk/credential-provider-node";

當您導入您在層的文件中定義的模塊時,您只需要使用 /opt/... 路徑。

編輯:我還應該注意,我沒有嘗試在兩個 package.json 文件中列出相同的依賴項。 我不確定這是否會引起沖突。

EDIT2:當我自己研究解決問題時,我遇到了許多關於在 lambda 層和 AWS SDK 中使用 ES 模塊的問題報告。 因此,既然您提到它在切換到 commonjs 時有效,這可能是您問題的根源。 這些 Github 問題中提到了多種潛在的解決方法。

請參見:

使用 ES Module 和 Lambda 層時找不到 package

使 AWS SDK JS v2 和 v3 在 AWS Lambda 中與 ESM 一起可用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM