How to install external modules in a Python Lambda Function created by AWS CDK?(如何在AWS CDK创建的Python Lambda函数中安装外部模块?)
问题描述
我在Cloud9中使用的是Python AWS CDK,我正在部署一个简单的Lambda函数,该函数应在对象上载到S3 Bucket(也是由CDK创建)时发送API请求到Atlassian的API。以下是我的CDK堆栈代码:
from aws_cdk import core
from aws_cdk import aws_s3
from aws_cdk import aws_lambda
from aws_cdk.aws_lambda_event_sources import S3EventSource
class JiraPythonStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
# The code that defines your stack goes here
jira_bucket = aws_s3.Bucket(self,
"JiraBucket",
encryption=aws_s3.BucketEncryption.KMS)
event_lambda = aws_lambda.Function(
self,
"JiraFileLambda",
code=aws_lambda.Code.asset("lambda"),
handler='JiraFileLambda.handler',
runtime=aws_lambda.Runtime.PYTHON_3_6,
function_name="JiraPythonFromCDK")
event_lambda.add_event_source(
S3EventSource(jira_bucket,
events=[aws_s3.EventType.OBJECT_CREATED]))
lambda函数代码使用我导入的requests
模块。但是,当我检查CloudWatch日志并测试lambda函数时-我得到:
无法导入模块"JiraFileLambda":没有名为"Requests"的模块
我的问题是:如何通过Python CDK安装请求模块?
I've already looked around online and found this。但是它似乎直接修改了lambda函数,这将导致堆栈漂移(我被告知这对IaaS不好)。我还查看了AWS CDK文档,但没有发现任何提及外部模块/库的内容(我现在正在对其进行全面检查),有人知道我如何解决此问题吗?
编辑:It would appear I'm not the only one looking for this。
Here's another GitHub issue that's been raised.
推荐答案
更新:
现在看起来CDK中似乎有一种新类型的(实验性)Lambda函数,称为PythonFunction。Python docs for it are here。这包括支持添加requirements.txt文件,该文件使用停靠容器将它们添加到您的函数中。See more details on that here。具体:
如果条目路径中存在Requirements.txt或Pipfile,则该构造将根据运行时处理在Lambda兼容的Docker容器中安装所有必需的模块。
原始答案:
这是我的经理写的我们现在使用的令人敬畏的代码:
def create_dependencies_layer(self, project_name, function_name: str) -> aws_lambda.LayerVersion:
requirements_file = "lambda_dependencies/" + function_name + ".txt"
output_dir = ".lambda_dependencies/" + function_name
# Install requirements for layer in the output_dir
if not os.environ.get("SKIP_PIP"):
# Note: Pip will create the output dir if it does not exist
subprocess.check_call(
f"pip install -r {requirements_file} -t {output_dir}/python".split()
)
return aws_lambda.LayerVersion(
self,
project_name + "-" + function_name + "-dependencies",
code=aws_lambda.Code.from_asset(output_dir)
)
它实际上是作为方法的Stack类的一部分(不在init内)。我们在这里设置它的方式是,我们有一个名为lambda_dependencies
的文件夹,其中包含我们正在部署的每个lambda函数的文本文件,该文件只有一个依赖项列表,如requirements.txt
。
要利用此代码,我们在lambda函数定义中包含如下内容:
get_data_lambda = aws_lambda.Function(
self,
.....
layers=[self.create_dependencies_layer(PROJECT_NAME, GET_DATA_LAMBDA_NAME)]
)
这篇关于如何在AWS CDK创建的Python Lambda函数中安装外部模块?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在AWS CDK创建的Python Lambda函数中安装外部模块?
- 使用Heroku上托管的Selenium登录Instagram时,找不到元素';用户名'; 2022-01-01
- 如何在 Python 的元组列表中对每个元组中的第一个值求和? 2022-01-01
- 沿轴计算直方图 2022-01-01
- 如何在 python3 中将 OrderedDict 转换为常规字典 2022-01-01
- padding='same' 转换为 PyTorch padding=# 2022-01-01
- python-m http.server 443--使用SSL? 2022-01-01
- 如何将一个类的函数分成多个文件? 2022-01-01
- 分析异常:路径不存在:dbfs:/databricks/python/lib/python3.7/site-packages/sampleFolder/data; 2022-01-01
- pytorch 中的自适应池是如何工作的? 2022-07-12
- python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令 2022-01-01