使用 Learner Lab - 在 Lambda 建立 Pillow 层,进行 S3 的图片镜相操作

Posted Yehchitsai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Learner Lab - 在 Lambda 建立 Pillow 层,进行 S3 的图片镜相操作相关的知识,希望对你有一定的参考价值。

使用 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.7Python 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

以上是关于使用 Learner Lab - 在 Lambda 建立 Pillow 层,进行 S3 的图片镜相操作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda

使用 Learner Lab - 使用 API Gateway 与 Lambda 上传图片到 S3

使用 Learner Lab - 在 Lambda 建立 Pillow 层,进行 S3 的图片镜相操作

使用 Learner Lab - 使用 CloudWatch 进行排错,搭配 API Gateway 与 Lambda

使用 Learner Lab - 使用 S3 静态网页上传图片,搭配 API Gateway 与 Lambda

使用 Learner Lab - 学生