AWS Cloud9:在本地引用 Lambda 层

Posted

技术标签:

【中文标题】AWS Cloud9:在本地引用 Lambda 层【英文标题】:AWS Cloud9: Referencing Lambda Layer Locally 【发布时间】:2019-07-25 08:31:32 【问题描述】:

我已经设置了一个 Cloud9 环境来开发和测试 lambda 函数。为了使环境“更干净”,我选择使用 lambda 层来指定函数的依赖项。通过这样做,我已经从环境中删除了依赖文件夹,但我现在无法在本地进行测试。

例如,我有一个用于 Stripe 的 python 库的 lambda 层。我能够在 Cloud9 中编写一个引用条带的 lambda 函数,部署该函数,并成功地远程测试该函数。但我无法在本地运行该功能,因为我得到“无法导入条带”

有没有办法通过在 Cloud9 中指定层 ARN 在本地测试依赖于 lambda 层的 lambda 函数?

【问题讨论】:

您是否查看过 AWS 论坛或直接与 aws 支持人员交谈? 【参考方案1】:

很遗憾,AWS Cloud9 目前不支持 Lambda 层。

【讨论】:

是否有替代方法来放置依赖项,以便 lambda 可以在本地运行,同时避免环境混乱?例如——我可以使用自动创建的 venv 目录来保存条带依赖项并允许 lambda 在那里本地引用它吗?【参考方案2】:

AWS Cloud9 documentation 表示不支持从 AWS 资源 窗口执行具有层的函数。但是您可以在 Cloud9 终端窗口上使用sam local invokeaws 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

【讨论】:

【参考方案3】:

对于从 Lambda 工作的层的问题,有一个简单的解决方法,但本地测试失败:

在您导入层中包含的模块之前,将文件夹添加到您的 python 路径,并将您的层包(解压缩)放在该路径中。

这是一个示例,其中“nltk”包来自层。此项目中的所有层都存储在 Lambda 文件夹本身的父目录中的“Layers”文件夹中,但您可以从任何级别执行此操作:

import sys
import os
sys.path.append(os.path.abspath("../Layers/custom_NLTK/python"))
import nltk

希望这会有所帮助!

【讨论】:

“本地测试”是指“Cloud9 上的本地”还是“个人计算机上的本地”。也许我不明白你的解释。 这应该可以在任何“本地”终端、cloud 9 或您自己的机器上运行。它只是一种引用包的方法,这些包一旦部署就来自层,但在部署之前无法访问。【参考方案4】:

我也遇到了同样的问题,最终找到了解决方法。可能对其他人有用。

我的用例相当简单,我需要在应用程序的多个功能之间共享一些通用代码。 Lambda 层是完美的解决方案,但我无法让集成以我在 cloud-9 中所需的方式工作。

我最终没有使用 lambda 层。我在应用程序级别创建了一个名为 common-code 的新文件夹(不是函数)。

然后,我在每个函数的公共区域中为我需要的每个文件创建了一个硬链接(非符号链接)

ln ../common-code/some-helper-functions.js some-helper-functions.js

然后文件在部署时被cloud-9正确打包。

【讨论】:

以上是关于AWS Cloud9:在本地引用 Lambda 层的主要内容,如果未能解决你的问题,请参考以下文章

Python3/cloud9/lambda - 使导入的模块可用于 lambda

如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

如何将 Cloud9 (python) 连接到 VPC 中的 Redshift?

如何在 Docker 容器中运行 AWS Lambda 层?

SSH 进入 AWS Cloud9 环境

Python - 在 cloud9 AWS (boto3) 上查找文件的路径