指南:AWS lambda +枕头用于复杂图像处理
#aws #python #devops #cloudcomputing

在当今的数字景观中,图像传达了信息,唤起情绪并推动参与度。从社交媒体平台到电子商务网站,企业在很大程度上依赖着吸引图像以确保其目标受众的关注。但是,管理和处理这些图像可能具有挑战性,要求技术专长和计算资源。

想象一下这种情况:一个快速增长的在线市场每天都在涌入新产品。该平台需要高质量的产品图像以进行显示,但遇到尺寸不一致和不同供应商的文件格式的斗争。该公司寻求一种自动解决方案,以调整上传图像大小,同时保持高质量的分辨率以简化流程并减少手动干预。

输入AWS lambda功能,加上功能强大的python库!

在本教程中,我们将引导您通过集成枕头 - 著名的图像处理库中的AWS lambda函数,以创建优化的图像调整解决方案,以有效地解决您的复杂问题。

  • *注意:本教程对AWS lambda函数和Python编程语言具有基本理解。

步骤1:使用共享库(枕头)准备Python环境

通过将枕头模块安装到特定文件夹./python/lib/python3.10/site-packages/中,我们确保AWS Lambda可以在运行时快速找到和访问库。这也有助于我们维持一个干净有条理的项目结构,因为AWS Lambda期望库在Python 3.10运行时的此文件夹中(检查您的运行时版本)。

现在您了解了为什么我们针对这个特定文件夹,让我们继续使用AWS lambda和枕头创建图像调整解决方案:

1a。打开您的终端或命令提示符并导航到所需的项目目录。


cd /path/to/your/project-folder

1B。在您的项目目录中创建一个名为Python的新文件夹:


mkdir python

1c。在Python文件夹中,创建另一个名为lib的文件夹。在其中,创建另一个称为Python3.10的。最后,最后一个文件夹在上一个中的一个名为site-takages:


mkdir -p python/lib/python3.10/site-packages/

1d。现在,您已经为Python库创建了适当的目录结构,请执行此命令:


pip3 install pillow -t ./python/lib/python3.10/site-packages/

此命令将枕头模块安装到项目目录结构中的指定路径(k​​oude0)中。

在步骤4中,您必须将该文件夹汇编以创建lambda函数的图层。

步骤2:实现图像调整大小功能

2a。与您的python文件夹并行,创建一个名为lambda_function.py的新python文件:


touch lambda_function.py

2b。使用您喜欢的代码编辑器打开lambda_function.py文件,并添加以下代码段:


import os
import boto3
from PIL import Image

def resize_image(image_path, resized_path):
    with Image.open(image_path) as image:
        image.thumbnail((800, 800))
        image.save(resized_path)

def lambda_handler(event, context):
    s3_client = boto3.client('s3')

    for record in event['Records']:
        bucket_name = record['s3']['bucket']['name']
        key_name = record['s3']['object']['key']

        download_path = '/tmp/{}'.format(os.path.basename(key_name))
        upload_path = '/tmp/resized-{}'.format(os.path.basename(key_name))

        s3_client.download_file(bucket_name, key_name, download_path)

        resize_image(download_path, upload_path)

        s3_client.upload_file(upload_path, bucket_name, 'resized-{}'.format(key_name))

此代码定义了一个AWS lambda处理程序,该处理程序会听取上传到所需S3存储桶的新图像的聆听。对于检测到的每个图像,它将自动下载文件到临时lambda环境存储(/tmp ),使用枕头的缩略图方法对其进行调整大小(达到 800的最大宽度或高度像素),并保存本地/tmp的评估大小版本,然后用“ 调整大小”重新上传到同一S3 bucket- prefix。

步骤3:为枕头创建AWS lambda层

现在,我们的Python功能已经准备好,让我们的枕头库包装到AWS lambda层中。

创建./python/lib/python3.10/site-packages/文件夹的邮政编码:


zip -r pillow_layer.zip python

此命令压缩枕头所在的整个Python文件夹的内容(./python/lib/python3.10/site-packages/)到一个pillow_layer.zip文件中。

步骤4:部署AWS lambda功能和层

4a。登录到您的AWS管理控制台,然后导航到Lambda console

4b。单击左菜单中的图层,然后单击“创建图层”。

4C。输入您的新层的名称(例如,枕套),提供描述,上传pillow_layer.zip ,选择python 3.10作为兼容运行时,然后单击创建。

4d。接下来,导航到“功能”选项卡并创建一个新的lambda函数。选择Python 3.10作为运行时环境。

添加一个具有适当访问权限的S3 trigger,将您首选的存储桶用于图像上传。

4e.Add通过单击功能设计器窗格中的添加图层。

上传或编写内联代码 lambda_function.py - 在函数创建过程中提示并配置适当的权利,以通过IAM角色管理访问S3资源。

完成后保存设置。

共享库对象

枕头库需要一个共享的库才能正常工作。您可能会遇到这样的问题:

[ERROR] ImportError: /lib64/libz.so.1: version ZLIB_1.2.9' not found (required by /opt/python/lib/python3.10/site-packages/PIL/../Pillow.libs/libpng16-cb42a3c6.so.16.39.0) Traceback (most recent call last): File "/var/task/lambda_function.py", line 37, in lambda_handler render.render(output_file) File "/var/task/render.py", line 59, in render font = ImageFont.truetype("arial.ttf", int(obj['fontSize'])) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 996, in truetype return freetype(font) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 993, in freetype return FreeTypeFont(font, size, index, encoding, layout_engine) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 220, in __init__ if core.HAVE_RAQM: File "/opt/python/lib/python3.10/site-packages/PIL/_util.py", line 19, in __getattr__ raise self.ex File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 58, in <module> from . import _imagingft as core [ERROR] ImportError: /lib64/libz.so.1: version ZLIB_1.2.9' not found (required by /opt/python/lib/python3.10/site-packages/PIL/../Pillow.libs/libpng16-cb42a3c6.so.16.39.0) Traceback (most recent call last): File "/var/task/lambda_function.py", line 37, in lambda_handler render.render(output_file) File "/var/task/render.py", line 59, in render font = ImageFont.truetype("arial.ttf", int(obj['fontSize'])) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 996, in truetype return freetype(font) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 993, in freetype return FreeTypeFont(font, size, index, encoding, layout_engine) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 220, in init if core.HAVE_RAQM: File "/opt/python/lib/python3.10/site-packages/PIL/_util.py", line 19, in getattr raise self.ex File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 58, in <module> from . import _imagingft as core

[ERROR] ImportError: /lib64/libz.so.1: version ZLIB_1.2.9' not found (required by /opt/python/lib/python3.10/site-packages/PIL/../Pillow.libs/libpng16-cb42a3c6.so.16.39.0) Traceback (most recent call last): File "/var/task/lambda_function.py", line 37, in lambda_handler render.render(output_file) File "/var/task/render.py", line 59, in render font = ImageFont.truetype("arial.ttf", int(obj['fontSize'])) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 996, in truetype return freetype(font) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 993, in freetype return FreeTypeFont(font, size, index, encoding, layout_engine) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 220, in __init__ if core.HAVE_RAQM: File "/opt/python/lib/python3.10/site-packages/PIL/_util.py", line 19, in __getattr__ raise self.ex File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 58, in <module> from . import _imagingft as core [ERROR] ImportError: /lib64/libz.so.1: version ZLIB_1.2.9' not found (required by /opt/python/lib/python3.10/site-packages/PIL/../Pillow.libs/libpng16-cb42a3c6.so.16.39.0) Traceback (most recent call last): File "/var/task/lambda_function.py", line 37, in lambda_handler render.render(output_file) File "/var/task/render.py", line 59, in render font = ImageFont.truetype("arial.ttf", int(obj['fontSize'])) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 996, in truetype return freetype(font) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 993, in freetype return FreeTypeFont(font, size, index, encoding, layout_engine) File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 220, in init if core.HAVE_RAQM: File "/opt/python/lib/python3.10/site-packages/PIL/_util.py", line 19, in getattr raise self.ex File "/opt/python/lib/python3.10/site-packages/PIL/ImageFont.py", line 58, in <module> from . import _imagingft as core
错误:缺少枕头依赖性

此错误之所以发生,是因为枕头对特定的共享库有依赖性,这些库与AWS lambda环境不可用或不兼容。在这种情况下,Pillow需要具有特定版本的libz.so.1库(ZLIB_1.2.9),该版本与AWS Lambda的默认环境丢失或不兼容。

要解决此问题,我们需要为枕头加载必要的共享库并配置环境变量,以便我们的Python代码可以正确找到它们。

步骤5a:包括缺少共享库

5a-1)在lambda函数的根部创建一个新的 lib


mkdir lib

5a-2)下载或编译所需的 zlib 库(libz.so.1)与 Amazon Linux 2 环境兼容。获得它后,将其放入您的项目新创建的文件夹中。

添加一个新的环境变量。

您必须添加一个称为LD_LIBRARY_PATH的新变量以包括/var/task/lib。它确保Python知道在执行AWS lambda函数期间检查依赖项时在哪里找到任何提供的共享对象。

步骤5:测试图像处理解决方案

最后,根据lambda中设置的事件触发配置,将图像文件上传到指定的S3存储桶中。

aws lambda将使用由枕头提供动力的实现的调整功能自动处理并调整它!

您可以通过检查调整大小的图像成功地上传了一个调整大小的大小 - 在同一S3桶中的文件名中验证其性能。

就是这样!您成功利用了AWS Lambda功能和枕头的功能来克服复杂的图像处理挑战。

ð£有抱负的云专业人士! ð£

我们有一个完美的工具来增强您的云知识之旅 - 介绍我们的AWS Learning Kit。它是免费的,旨在提供对世界上的亚马逊网络服务(AWS)的全面了解S领先的云平台。

这是您成为未来一部分的机会。随着越来越多的企业每天迁移到云,对这些数字环境进行导航和优化的专业人员的需求飙升。这就是AWS的来源。掌握AWS可以获得的技能对于将您的职业推向这个以云的为中心的世界至关重要。

AWS Learning Kit - VPC Mind Map
aws学习套件vpc思维图

我们的AWS Learning Kit是资源的宝库,包括20个详细的思维图,在视觉上将AWS的复杂世界组织成可理解且易于消化的格式。但是我们不停在那里!该套件还提供了260个精心制作的问题,并具有深入的答案,旨在测试您的知识并为现实世界的挑战做好准备。

不要让这个机会溜走!抓住AWS学习套件,启动您成为云专家的旅程。没有比现在要投资未来更好的时间。

ð今天下载免费的AWS Learning Kit,并迈向云中有希望的未来。 ð

您的未来自我会感谢您。

Download AWS Learning Kit Here

让您的云梦想在一起。

Guide: AWS Lambda + Pillow for Complex Image Processing帖子首先出现在Bits Lovers