zoukankan      html  css  js  c++  java
  • 使用AWS Lambda,API Gateway和S3 Storage快速调整图片大小

    https://www.obytes.com/blog/2019/image-resizing-on-the-fly-with-aws-lambda,-api-gateway,-and-s3-storage/

    在本文中,我们将讨论在从AWS S3存储请求具有大小参数(宽度/高度)的原始图像大小之后创建不同的图像大小。

    图像对于创建引人入胜的用户体验至关重要,可能需要更多努力将大型和高分辨率图像集成到用户界面中,但问题在于它们会降低整个网页的下载速度。想象一下,你有一个博客网站,大多数读者都在手机上查看你的网站,在这种情况下,他们不需要高分辨率的图片,这可能会减慢下载整个内容,这对你的读者不利,并且他们中的一些人正在阅读他们的笔记本电脑,他们有更好的连接和更好的屏幕,因此将欣赏更高质量的图像。

    本文的主要目的是向您展示如何仅使用AWS lambda函数,这意味着不需要服务器(EC2实例)来创建图像大小调整任务。当通过API网关端点从s3存储桶加载图像时,将触发lambda函数,该函数将根据指定的大小调整图像大小(如果存储桶中不存在指定大小的图像),它将返回已调整大小的图片网址。

    目录

    1. 建筑
    2. Lambda函数配置
    3. 上传源代码
    4. API网关配置
    5. 测试

    建筑

    因此,本教程将指导我们如何使用AWS Lambda,API Gateway和S3实现简单的图像大小调整任务。

    建筑图建筑图
    1. 用户将使用图像大小参数(宽度/高度)向API网关发送请求,以便接收已调整大小的图像的s3 URL,
    2. API网关请求将触发lambda函数,
    3. 这将检查具有给定大小的图像是否存在,
    4. 如果它这样做,将返回图像s3 URL,
    5. 否则它将从s3获取原始图像,使用给定大小调整大小并返回图像s3 URL。

    Lambda函数配置

    首先,我们假设您已经创建了一个s3存储桶和API网关实例,因此调整lambda函数的图像将至少需要这些配置:

    • 执行角色:AWS S3完全访问权限和AWS基本执行角色

    Lambda函数配置执行角色Lambda函数配置执行角色

    • 基本设置:超时20秒
    • 使用现有API向lambda函数添加API网关触发器

    Lambda函数配置Lambda触发器Lambda函数配置Lambda触发器

    上传源代码

    我们将使用Python编程语言来构建调整lambda函数的图像,

    消息代码:https://github.com/obytes/resize_s3_imageshttps :// github com obytes resize s3 images

    让我们从解释源代码开始:

            def lambda_handler(event, context):
                key = event['queryStringParameters'].get('key', None)
                size = event['queryStringParameters'].get('size', None)
    
                image_s3_url = resize_image(os.environ['BUCKET'], key, size)
    
                return {
                    'statusCode': 301,
                    'body': image_s3_url
                }
        

    lambda_handler当我们的lambda函数被要调整大小的图像的新传入请求触发时将调用它。从请求路径获取keysize参数,然后它resize_image使用前面的参数和s3存储桶名称调用该函数,以便获得新调整大小的图像的位置。

    现在让我们深入了解我们的resize_image功能,首先它从给定的s3存储桶中获取原始数据(如果存在):

            def resize_image(bucket_name, key, size):
                size_split = size.split('x')
                s3 = boto3.resource('s3')
                obj = s3.Object(
                    bucket_name=bucket_name,
                    key=key,
                )
                obj_body = obj.get()['Body'].read()
        

    其次,它使用PILLOW调整图像大小

            img = Image.open(BytesIO(obj_body))
            img = img.resize((int(size_split[0]), int(size_split[1])), PIL.Image.ANTIALIAS)
            buffer = BytesIO()
            img.save(buffer, 'JPEG')
            buffer.seek(0)
        

    最后,它将调整大小的图像上传回s3,并返回其URL:

            resized_key="{size}_{key}".format(size=size, key=key)
            obj = s3.Object(
                bucket_name=bucket_name,
                key=resized_key
            )
            obj.put(Body=buffer, ContentType='image/jpeg')
    
            return "https://{bucket}.s3.amazonaws.com/{resized_key}".format(bucket=bucket_name, resized_key=resized_key)
        

    如果我们试图创建部署包,并把它上传到拉姆达就像是在AWS记录在这里,它不会工作,因为我们可以看到,它依赖于  PIL,用于处理图像库,它不是拉姆达环境也不是标准的Python库。我们该如何解决这个问题?使用Python车轮! 轮子  是python发行的新标准。它创建了随时可以运行的Wheels包。由于Lambda在Amazon Linux Distribution上运行,我们可以尝试  这个  版本。下载后,在与resize_s3_images.py 文件相同的目录中解  压缩并将其全部压缩!

    $ ls
    Pillow-6.1.0-cp36-cp36m-manylinux1_x86_64.whl resize_s3_images.py
    $ unzip Pillow-6.1.0-cp36-cp36m-manylinux1_x86_64.whl && rm Pillow-6.1.0-cp36-cp36m-manylinux1_x86_64.whl
    $ zip -r resize_s3_images.zip .
    

    在AWS Lambda仪表板上载压缩文件 resize_s3_images.zip

    上传源代码上传源代码

    API网关配置

    接下来,是时候设置api网关端点了:

    • 根路径 /
    • 称为根路径中的资源 /resize
    • 上一个资源中的GET方法应该与我们之前创建的lambda函数集成
    • 为先前的http GET方法启用CORS

    API网关配置API网关配置

    您应该部署API以使整个更改生效

    测试

    现在我们已经为我们的图像调整lambda函数构建了所需的一切,让我们使用cURL测试它

    测试gif测试...

  • 相关阅读:
    【面积并】 Atlantis
    【动态前k大 贪心】 Gone Fishing
    【复杂枚举】 library
    【双端队列bfs 网格图建图】拯救大兵瑞恩
    【奇偶传递关系 边带权】 奇偶游戏
    【权值并查集】 supermarket
    CF w4d3 A. Pythagorean Theorem II
    CF w4d2 C. Purification
    CF w4d2 B. Road Construction
    CF w4d2 A. Cakeminator
  • 原文地址:https://www.cnblogs.com/rxbook/p/11377872.html
Copyright © 2011-2022 走看看