使用 Learner Lab - 在 Lambda 建立 Pillow 层,进行 S3 的图片镜相操作
AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务,让学生可以在 100 USD的金额下,自行练习所要使用的 AWS 服务,如何进入 Learner Lab 请参考 使用 Learner Lab - 学生,而这篇文章是在 Lambda 建立 Pillow 层,进行 S3 的图片镜相操作,Lambda 的 Python 代码会引入 Pillow,载入 S3 存储桶中的图片,进行镜相操作后再存回 S3 存储桶。
步骤 1. 创建 S3 存储桶
在 AWS 网页控制台 上方的搜寻图示中输入 S3 ,单击 S3 服务,如下图所示。
图 1. AWS 网页控制台中找寻 S3 服务
单击创建存储桶
图 2. 创建一个存储桶
创建存储桶的配置如下:
常规配置
- 存储桶名称: lambda2s3image
- AWS 区域: us-east-1
对象所有权
- ACL 已启用
图 3. 存储桶名称与区域
此存储桶的“阻止公有访问”设置
- 清除勾选 阻止所有公开访问
- 勾选 我了解,当前设置可能会导致此存储桶及其中的对象被公开。
图 4. 存储桶公有访问”设置
其馀选项保留预设值,完成后单击 创建存储桶 按钮。
上传一个图片档案到 S3 存储桶
图 5. 上传一个图片档案到 S3 存储桶
步骤 2. 创建 Lambda 函数
在 AWS 网页控制台 上方的搜寻图示中输入 Lambda ,单击 Lambda 服务,如下图所示。
图 6. AWS 网页控制台中找寻 Lambda 服务
单击 创建函数 服务,如下图所示。
图 7. 创建 Lambda 函数
设定 Lambda 函数如下
- 从头开始创作
基本信息 - 函数名称: mirrorImage
- 运行时: Python 3.8
- 架构: x86_64
权限 - 执行角色: 使用现有角色 LabRole (很重要、很重要、很重要)
图 8. 设定 Lambda 函数
步骤 3. 布署 Lambda 函数
因为这次代码的功能为读取 S3 存储桶(lambda2s3image)中的图档(CSDN_Logo.jpg),进行镜相操作后再回存到 S3,代码如下:
import boto3
from PIL import Image, ImageOps
s3_client = boto3.client('s3')
inputbucket = 'lambda2s3image'
outputbucket = 'lambda2s3image'
key = 'CSDN_Logo.jpg'
mirror_key = 'mirror_CSDN_Logo.jpg'
download_path = '/tmp/{}'.format(key)
upload_path = '/tmp/mirror-{}'.format(key)
# 进行镜像操作函数
def mirror_image(image_path, mirror_path):
with Image.open(image_path) as image:
im_mirror = ImageOps.mirror(image)
im_mirror.save(mirror_path)
print('mirror the image {} to {}'.format(image_path, mirror_path))
def lambda_handler(event, context):
# 从 s3 下载文件
s3_client.download_file(inputbucket, key, download_path)
mirror_image(download_path, upload_path) # 进行镜像操作函数
# 上传文件到 s3
s3_client.upload_file(upload_path, outputbucket, mirror_key,ExtraArgs={'ACL': 'public-read','ContentType':'image/jpeg'})
修改完毕后单击 Deploy (布署),必须要先布署才算是将代码布署到云计算中。
步骤 4. 测试 AWS Lambda
单击 Test 按钮,会出现配置测试事件弹窗,配置如下:
- 测试事件操作: 创建新事件
- 事件名称: hello
- 事件共享设置: 私有
设定好后存档即可。
图 9. 配置测试事件
配置完成后再单击 Test 按钮即可运行,运行结果会出现在 Execution result 视窗,可以看到出现错误,主要的原因为没有 PIL 模块:
Unable to import module 'lambda_function': No module named 'PIL'
图 10. 进行测试事件,检验代码执行结果
步骤 5. 下载 PIL 模块
根据 AWS 的官方教程 建立和共用 Lambda 层,所建立的 pillow 函式库会出现 cannot import name ‘_imaging’ from ‘PIL’ 的错误讯息,解决方法就是直接去官方网站下载套件安装包。可以在国内清华镜像站中下载 Pillow-8.3.2,如下图所示。
图 11. 至国内清华镜像站找寻安装包
下载后直接用 zip 工具解压缩,会得到 3 个文件夹,将这三个文件夹放在 python 的文件夹中,在进行压缩即可,如下图所示。
图 12、压缩至 python 文件夹中
进入 AWS Lambda 管理控制台,选择建立 Layer,输入 Layer 名称,并上传先前建立的压缩档,在选择相容架构 x86_64,而相容的执行时间指的是希望可以在哪些版本的 python 中执行,确定后按下 建立 键即完成建立 Layer,如下图所示。
层配置
- 名称: pillow-8-3-2
- 描述: Pillow-8.3.2.dist-info
- 上传 .zip 文件
- 兼容架构: x86_64
- 兼容运行时: Python 3.7、Python 3.8
图 13、建立 Layer 设定画面
步骤 6. 在 Lambda 函数中添加 PIL 模块
进入 mirrorImage 函数的设定画面,在画面的最底端,为本函数添加层 (Layer),如下图所示。
图 14、为 Lambda 函数添加层 (Layer)
进入添加层 (Layer) 画面后,选择层来源为 自订 Layer,接着选择先前建立的 pillow8_3_2 函式库层,如下图所示。
选择一个层
- 层源:自定义层
- 自定义层: pillow-8-3-2
- 版本: 1
图 14、添加层 (Layer) 配置
步骤 7. 重新运行并检视结果
重新单击 Test 观看运行结果,没有出现任何错误,并打印出运行过程。
图 15. 使用 Lambda 测试观看运行结果
打开浏览器比对结果,左手边是步骤 1. 上传的图片,右手边是处理后的结果。
图 16. 使用浏览器观看运行结果
感谢亚马逊云科技王向炜 Alan Wang 提供的协助。
参考资料
- 使用 Learner Lab - 使用 Lambda 转换图片为 base64 格式, https://blog.csdn.net/m0_50614038/article/details/128075734
- 使用 Learner Lab - 使用 AWS Lambda 将图片写入 S3, https://blog.csdn.net/m0_50614038/article/details/128122934
- 使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda, https://blog.csdn.net/m0_50614038/article/details/128155030
- Day 33 - 实作 S3 驱动 Lambda 函数进行镜像,https://blog.csdn.net/m0_50614038/article/details/121060724
- 建立和共用 Lambda 层,https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/configuration-layers.html