说明
(文档主要说的是python语言)
关于AWS的Lambda之前采用的方式是将python的主程序和所需的第三方库都放到一个zip中,然后上传到lambda中使用。
后来发现代码中使用到了crypto这个库,一运行就报错。去网上搜索了一段时间,花了比较久的时间才搞定。
这里记录一下操作(之前的方式不推荐使用,主要是使用层)。
(均是自己摸索出来的,可能存在更好的方法)
一、层的功能和
主要是将所需要的第三方库打包成zip编辑到自定义层中,在主函数需要使用时,会自动添加这个自定义层,也就是加载这个库的信息。
(python的自带库不用新建层,可直接使用)
二、新建并保存层
1. 进入到终端
右上角这个标识就是终端
2. 下载第三方库
首先新建个python文件夹, 然后将需要的库下载到这个文件夹内:
命令如下:
mkdir python
python3 -m pip install pycryptodome -t python/ # 如果是python2环境 则改成python2
3. 打包python文件夹
命令行:
zip -r crypto.zip python # 这里的zip名建议使用库名,方便作为区分
4. 将zip发布给指定AWS区的Lambda 层
命令行:
aws lambda publish-layer-version --layer-name crypto_layer --zip-file fileb://crypto.zip --compatible-runtimes python3.8 --region us-west-2
# 这条命令的解释详情见上图
至此,层就创建好了。这里也可以将多个库放到一个zip中,分开主要是为了给多个函数共同使用。
三、应用层
最后就是应用:
版本号设置为1就可以, 最后选择添加即可。
四、其他注意事项
- 使用层后,主函数中只保留一个主文件即可,其他库均可以删除。
- 关于使用这个时间的坑(在终端改时区没有用):将字符串转时间戳时,会以AWS区的所在地的时区为准,这个时候跟本地转时间戳会有不小的差异,基本是为28800s(8小时),这里可以将时间戳减去这个时间即可。这里附上计算时区差的函数:
# 计算时区差
def TimeOne():
utc_now = datetime.utcnow().replace(tzinfo=timezone.utc)
SHA_TZ = timezone(timedelta(hours=8), name='Asia/Shanghai')
beijing_now = utc_now.astimezone(SHA_TZ)
local_now = utc_now.astimezone()
return int(time.mktime(beijing_now.timetuple())) - int(time.mktime(local_now.timetuple())) # 上海时间 - 标准时间
- 参考连接(官方文档描述会更清楚点):
链接: 如何解决在 Python 中运行 Lambda 代码时收到的“Unable to import module”错误?
链接: 使用AWS Lambda 的“层 (Layer) ”功能实现依赖包管理