我正在编写一个与日期时间一起使用的 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 时,该函数会触发(如果没有时区信息,它就无法正常工作)
如果您在您的环境中无法访问
pytz
,也许您可以访问 python-dateutil
。在这种情况下你可以这样做:
import datetime
import dateutil.tz
eastern = dateutil.tz.gettz('US/Eastern')
datetime.datetime.now(tz=eastern)
您需要安装 pytz 软件包,以便它可用于您的 lambda。 执行此操作的方法是让 pip 将其安装到您要压缩并上传到 AWS 的目录中(即与包含 lambda 函数的文件进行对等)。
pip install -t path/to/your/lambda pytz
然后当你将其压缩并上传时,就可以使用了。
编辑添加,我创建了一个工具来为您做很多事情 - 您可以在这里找到它:https://github.com/jimjkelly/lambda-deploy
为了跟进 @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
部署该层的新版本。
只要该库安装在 zip 文件的
python/pytz
级别,AWS Lambda 就应该能够找到它。您也可以将其放入 python/lib/python3.8/site-packages\pytz
中,但对于此处的特定 python 运行时版本:https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
我花了几个小时来解决这个 pytz 问题。 使用 AWS,您可以尝试使用“dateutil.tz”中的 gettz 方法。 这样你就可以获得 pytz 所期望的结果。 就我而言,我需要 isoformat 时间(采用 (+00:00) 时区的 utc)。
from datetime import datetime
from dateutil.tz import gettz
datetime.now(gettz('UTC')).isoformat() # same result as datetime.now(pytz.utc).isoformat()
您还可以添加公共 ARN 作为 Lambda 层,我使用了这个 https://dev.to/vumdao/create-cron-jobs-on-aws-lambda-with-cloudwatch-event-3e07
import datetime as dt
import dateutil.tz
aesttime = dateutil.tz.gettz('Australia/Brisbane')
print(dt.datetime.now(tz=aesttime).strftime(format="%Y-%m-%d %H:%M:%S"))