将 pytz 导入 AWS lambda 函数

Posted

技术标签:

【中文标题】将 pytz 导入 AWS lambda 函数【英文标题】:Import pytz into AWS lambda function 【发布时间】:2016-04-26 16:26:52 【问题描述】:

我正在编写一个适用于日期时间的 lambda 函数并尝试导入 pytz,以便在比较时考虑时区。

import boto3
import pytz
from datetime import timedelta, date, datetime
from boto3.dynamodb.conditions import Key, Attr

导致显示

errorMessage=Unable to import module 'lambda_function'

但是当我删除 import pytz 时,函数会触发(如果没有时区信息,它就无法正常工作)

【问题讨论】:

【参考方案1】:

要跟进@cheframzi 对“以 python/pytz/... 格式打包 pytz zip 文件”作为 Lambda 层的回答,这里有一种方法。

mkdir python
pip3 install -t python pytz=='2019.2'
zip -r pytz.zip python
rm -rf python

然后您可以使用aws lambda publish-layer-version --layer-name <layer_name> --zip-file fileb://./pytz.zip 部署新版本的层。

只要库安装在压缩文件的python/pytz 级别,AWS Lambda 应该能够找到它。您也可以将它放在 python/lib/python3.8/site-packages\pytz 中,但对于您的特定 python 运行时版本,请参见此处:https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

【讨论】:

【参考方案2】:

我今天遇到了这个问题。我解决的方法是

以 python/pytz/... 库文件格式打包一个 pytz zip 文件 创建了一个 Lambda 层 在我的 lambda 中使用了上面的层

【讨论】:

【参考方案3】:

如果您在您的环境中无权访问pytz,也许您可​​以访问python-dateutil。在这种情况下,您可以这样做:

import datetime
import dateutil.tz

eastern = dateutil.tz.gettz('US/Eastern')
datetime.datetime.now(tz=eastern)

参考。 How to get current time in Pacific Timezone when import pytz fails?

【讨论】:

完美答案。很高兴在没有外部库的情况下使用此功能。【参考方案4】:

您需要安装 pytz 包,以便它可用于您的 lambda。您执行此操作的方法是将 pip 安装到您要压缩并上传到 AWS 的目录中(即与包含您的 lambda 函数的文件对等)。

pip install -t path/to/your/lambda pytz

然后当你把它压缩并上传时,它就可以使用了。

编辑添加我创建了一个工具来为你做很多事情 - 你可以在这里找到它:https://github.com/jimjkelly/lambda-deploy

【讨论】:

我希望避免这种情况,但我感觉您可能是正确的。我将尝试找到另一种方法来实现我的最终目标,但现在标记为正确答案。非常感谢。 我实际上一直在开发一种工具来自动执行此操作(以及为您处理将其推送到 AWS),但我还没有将它推送到 github。当您使用带有编译位的库时,会遇到很大的痛苦。 ://

以上是关于将 pytz 导入 AWS lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda Python3.7 函数 - numpy:无法导入名称“WinDLL”

aws lambda 无法导入模块“lambda_function”:没有名为“requests”的模块

AWS Lambda NodeJS导入返回空模块,但仅在AWS中

AWS Lambda 到 Firestore 错误:无法导入名称“cygrpc”

Lambda - 将 CSV 从 S3 导入 RDS MySQL

需要 SOAP - Node JS 包失败并在 AWS Lambda 中出现导入错误