AWS Cloud9:在本地引用 Lambda 层
AWS Cloud9: Referencing Lambda Layer Locally
我已经设置了 Cloud9 环境来开发和测试 lambda 函数。为了使环境 "cleaner" 我选择使用 lambda 层来指定函数的依赖项。通过这样做,我已经从环境中删除了依赖文件夹,但我现在无法在本地进行测试。
例如,我有一个用于 Stripe 的 python 库的 lambda 层。我能够在 Cloud9 中编写一个 lambda 函数引用 stripe,部署该函数,并成功地远程测试该函数。但是我无法 运行 在本地运行,因为我得到 "unable to import stripe"
有没有办法通过在 Cloud9 中指定层 ARN 在本地测试依赖于 lambda 层的 lambda 函数?
很遗憾,AWS Cloud9 目前不支持 Lambda 层。
AWS Cloud9 documentation 表示不支持使用 AWS 资源 window 中的层执行函数。但是你可以在Cloud9终端window上使用sam local invoke
或者aws lambda
。例如
sam local invoke --event input.json --template ../template.yml <function_name>
将创建一个新的 docker 图像,其中包含将用于执行 lambda 函数的图层依赖项。 The TAG name is explained here
master:~/environment/ahdv (master) $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
samcli/lambda nodejs8.10-03eb754e9966a1a2f789d500d 6b52bcffdc2e About an hour ago 968MB
lambci/lambda python3.6 420212d009b3 3 weeks ago 1.03GB
lambci/lambda python2.7 7a436931435e 3 weeks ago 901MB
lambci/lambda nodejs4.3 c0914066d9a8 3 weeks ago 931MB
lambci/lambda nodejs6.10 74b405a65ed4 3 weeks ago 946MB
lambci/lambda nodejs8.10 edf1f613772c 3 weeks ago 960MB
有一个简单的解决方法可以解决从 Lambda 工作的层问题,但本地测试失败:
在导入层中包含的模块之前,将文件夹添加到 python 路径,然后只需将层包(解压缩)放在该路径中即可。
这是一个示例,其中 "nltk" 包来自图层。此项目中的所有层都存储在 Lambda 文件夹本身的父目录中的 "Layers" 文件夹中,但您可以从任何级别执行此操作:
import sys
import os
sys.path.append(os.path.abspath("../Layers/custom_NLTK/python"))
import nltk
希望对您有所帮助!
我也 运行 遇到了同样的问题,最后找到了解决方法。可能对其他人有用。
我的用例相当简单,我需要在应用程序的多个功能之间共享一些通用代码。 Lambda 层是完美的解决方案,但我无法让集成以我在 cloud-9 中需要的方式工作。
我最终没有使用 lambda 层。我在应用程序级别创建了一个名为 common-code 的新文件夹(不是函数)。
然后我为每个函数在公共区域中需要的每个文件创建了一个硬 link(非符号)
ln ../common-code/some-helper-functions.js some-helper-functions.js
然后文件在部署时由 cloud-9 正确打包。
我已经设置了 Cloud9 环境来开发和测试 lambda 函数。为了使环境 "cleaner" 我选择使用 lambda 层来指定函数的依赖项。通过这样做,我已经从环境中删除了依赖文件夹,但我现在无法在本地进行测试。
例如,我有一个用于 Stripe 的 python 库的 lambda 层。我能够在 Cloud9 中编写一个 lambda 函数引用 stripe,部署该函数,并成功地远程测试该函数。但是我无法 运行 在本地运行,因为我得到 "unable to import stripe"
有没有办法通过在 Cloud9 中指定层 ARN 在本地测试依赖于 lambda 层的 lambda 函数?
很遗憾,AWS Cloud9 目前不支持 Lambda 层。
AWS Cloud9 documentation 表示不支持使用 AWS 资源 window 中的层执行函数。但是你可以在Cloud9终端window上使用sam local invoke
或者aws lambda
。例如
sam local invoke --event input.json --template ../template.yml <function_name>
将创建一个新的 docker 图像,其中包含将用于执行 lambda 函数的图层依赖项。 The TAG name is explained here
master:~/environment/ahdv (master) $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
samcli/lambda nodejs8.10-03eb754e9966a1a2f789d500d 6b52bcffdc2e About an hour ago 968MB
lambci/lambda python3.6 420212d009b3 3 weeks ago 1.03GB
lambci/lambda python2.7 7a436931435e 3 weeks ago 901MB
lambci/lambda nodejs4.3 c0914066d9a8 3 weeks ago 931MB
lambci/lambda nodejs6.10 74b405a65ed4 3 weeks ago 946MB
lambci/lambda nodejs8.10 edf1f613772c 3 weeks ago 960MB
有一个简单的解决方法可以解决从 Lambda 工作的层问题,但本地测试失败:
在导入层中包含的模块之前,将文件夹添加到 python 路径,然后只需将层包(解压缩)放在该路径中即可。
这是一个示例,其中 "nltk" 包来自图层。此项目中的所有层都存储在 Lambda 文件夹本身的父目录中的 "Layers" 文件夹中,但您可以从任何级别执行此操作:
import sys
import os
sys.path.append(os.path.abspath("../Layers/custom_NLTK/python"))
import nltk
希望对您有所帮助!
我也 运行 遇到了同样的问题,最后找到了解决方法。可能对其他人有用。
我的用例相当简单,我需要在应用程序的多个功能之间共享一些通用代码。 Lambda 层是完美的解决方案,但我无法让集成以我在 cloud-9 中需要的方式工作。
我最终没有使用 lambda 层。我在应用程序级别创建了一个名为 common-code 的新文件夹(不是函数)。
然后我为每个函数在公共区域中需要的每个文件创建了一个硬 link(非符号)
ln ../common-code/some-helper-functions.js some-helper-functions.js
然后文件在部署时由 cloud-9 正确打包。