AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务,让学生可以在 100 USD的金额下,自行练习所要使用的 AWS 服务,如何进入 Learner Lab 请参考 使用 Learner Lab - 学生,而这篇文章是在 Lambda 建立 Pillow 层,进行 S3 的图片镜相操作,Lambda 的 Python 代码会引入 Pillow,载入 S3 存储桶中的图片,进行镜相操作后再存回 S3 存储桶。
在 AWS 网页控制台 上方的搜寻图示中输入 S3 ,单击 S3 服务,如下图所示。
图 1. AWS 网页控制台中找寻 S3 服务
单击创建存储桶
图 2. 创建一个存储桶
创建存储桶的配置如下:
常规配置
对象所有权
图 3. 存储桶名称与区域
此存储桶的“阻止公有访问”设置
图 4. 存储桶公有访问”设置
其馀选项保留预设值,完成后单击 创建存储桶 按钮。
上传一个图片档案到 S3 存储桶
图 5. 上传一个图片档案到 S3 存储桶
在 AWS 网页控制台 上方的搜寻图示中输入 Lambda ,单击 Lambda 服务,如下图所示。
图 6. AWS 网页控制台中找寻 Lambda 服务
单击 创建函数 服务,如下图所示。
图 7. 创建 Lambda 函数
设定 Lambda 函数如下
图 8. 设定 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 (布署),必须要先布署才算是将代码布署到云计算中。
单击 Test 按钮,会出现配置测试事件弹窗,配置如下:
设定好后存档即可。
图 9. 配置测试事件
配置完成后再单击 Test 按钮即可运行,运行结果会出现在 Execution result 视窗,可以看到出现错误,主要的原因为没有 PIL 模块:
Unable to import module 'lambda_function': No module named 'PIL'
图 10. 进行测试事件,检验代码执行结果
根据 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,如下图所示。
层配置
图 13、建立 Layer 设定画面
进入 mirrorImage 函数的设定画面,在画面的最底端,为本函数添加层 (Layer),如下图所示。
图 14、为 Lambda 函数添加层 (Layer)
进入添加层 (Layer) 画面后,选择层来源为 自订 Layer,接着选择先前建立的 pillow8_3_2 函式库层,如下图所示。
选择一个层
图 14、添加层 (Layer) 配置
重新单击 Test 观看运行结果,没有出现任何错误,并打印出运行过程。
图 15. 使用 Lambda 测试观看运行结果
打开浏览器比对结果,左手边是步骤 1. 上传的图片,右手边是处理后的结果。
图 16. 使用浏览器观看运行结果
感谢亚马逊云科技王向炜 Alan Wang 提供的协助。