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测试...

  • 相关阅读:
    程序猿也爱学英语(上),有图有真相
    时间&物质&效率
    20130722
    Java数组操作工具
    小学课文《挑山工》
    字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)
    String[]转化暴露“思维误区”
    2017.9.17 小测试小整理
    Noip2016 提高组 Day1
    luogu P2585 [ZJOI2006]三色二叉树
  • 原文地址:https://www.cnblogs.com/rxbook/p/11377872.html
Copyright © 2011-2022 走看看