• 使用 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'})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    修改完毕后单击 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
  • 相关阅读:
    Avalon总线协议汇总
    二叉树相关OJ - C++
    STM32 裸机编程 04 - Makefile 构建自动化
    分布式架构设计思路和要点
    预测宝可梦武力值、分类宝可梦
    鸿蒙笔记--Socket
    redis缓存恢复-2022新项目
    软考中的嵌入式系统设计师为什么考的人少?
    【Python】【应用】Python应用之一行命令搭建HTTP、FTP服务器
    打造炫酷效果:用Java优雅地制作Excel迷你图
  • 原文地址:https://blog.csdn.net/m0_50614038/article/details/128177184