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函数配置执行角色

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

Lambda函数配置Lambda触发器

上传源代码

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

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

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

  1. def lambda_handler(event, context):
  2. key = event['queryStringParameters'].get('key', None)
  3. size = event['queryStringParameters'].get('size', None)
  4. image_s3_url = resize_image(os.environ['BUCKET'], key, size)
  5. return {
  6. 'statusCode': 301,
  7. 'body': image_s3_url
  8. }

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

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

  1. def resize_image(bucket_name, key, size):
  2. size_split = size.split('x')
  3. s3 = boto3.resource('s3')
  4. obj = s3.Object(
  5. bucket_name=bucket_name,
  6. key=key,
  7. )
  8. obj_body = obj.get()['Body'].read()

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

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

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

  1. resized_key="{size}_{key}".format(size=size, key=key)
  2. obj = s3.Object(
  3. bucket_name=bucket_name,
  4. key=resized_key
  5. )
  6. obj.put(Body=buffer, ContentType='image/jpeg')
  7. 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 文件相同的目录中解  压缩并将其全部压缩!

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

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

上传源代码

API网关配置

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

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

API网关配置

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

测试

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

测试...

使用AWS Lambda,API Gateway和S3 Storage快速调整图片大小的更多相关文章

  1. How to return plain text from AWS Lambda & API Gateway

    With limited experience in AWS Lambda & API Gateway, it's struggling to find the correct way to ...

  2. 基于aws api gateway的asp.net core验证

    本文是介绍aws 作为api gateway,用asp.net core用web应用,.net core作为aws lambda function. api gateway和asp.net core的 ...

  3. [AWS] Lambda by Python

    当前统治数据分析的语言还是Python,还是暂时走:Python + GPU的常规路线好了. numba, pyculib (分装了cublas) Ref: 使用 Python 构建 Lambda 函 ...

  4. Qwiklab'实验-API Gateway, AWS Lambda'

    title: AWS之Qwiklab subtitle: 2. Qwiklab'实验-API Gateway, AWS Lambda' date: 2018-09-20 17:29:20 --- In ...

  5. AWS lambda DynamoDB api gateway之间的连接

    创建角色 附加策略 AmazonDynamoDBFullAccess AWSLambdaDynamoDBExecutionRole 创建DynamoDB表 在表的项目中创建内容 this pipi 打 ...

  6. AWS API Gateway Swagger定义

    导出Swagger接口定义文件 在AWS API Gateway界面上,可以导出swagger接口定义文件. 而后利用Node js swagger-ui 依赖,生成swagger接口地址 Cloud ...

  7. Aws api gateway Domain name

    Set Up a Custom Domain Name for an API Gateway API The following procedure describes how to set up a ...

  8. AWS Lambda

    AWS Lambda 知识点总结 参考资料:Amazon 名词解释: 事件驱动型计算服务:通过事件来触发的计算服务 Amazon S3存储桶:一项面向Internet的存储服务,可以通过S3 随时在W ...

  9. AWS Lambda 借助 Serverless Framework,迅速起飞

    前言 微服务架构有别于传统的单体式应用方案,我们可将单体应用拆分成多个核心功能.每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作时不会互相影响 这种设计理念被进一步应用,就变成了无 ...

随机推荐

  1. android在主线程下载文件

    android在主线程下载文件 加入以下代码即可if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy polic ...

  2. linux系统编程之文件与io(四)

    今天继续学习文件与io,主要是学习文件共享及文件.复制文件描述符,有点抽象,主要是概念上的理解,但是很重要,下面一一来分解: 文件共享: 回顾一下,在linux系统调用中,是通过文件描述符来访问文件的 ...

  3. linux系统编程之管道(二)

    今天继续研究管道,话不多说,言归正传: 对于管道,有一定的读写规则,所以这里主要是对它的规则进行探讨,具体规则如下: 规则一: 下面用程序来验证下,还是用上节学的子进程写数据,父进程读取数据的例子,只 ...

  4. IntelliJ IDEA12的解决占用C盘C:\Users\Administrator

    在安装完IntelliJ IDEA之后,默认会在windows的系统盘用户文件夹中创建配置等文件.在我只有32G的SSD盘中,怎么能让它如此,不爽呀..占用到现在都快1G了.好吧.今天把她解决了. 找 ...

  5. Linux iftop 安装与参数详解

    介绍 iftop是一款实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能.必须以root身份才能运行. .编译安装如果采用编译安装可以到iftop官网下载最新的源码包. 安装前需要已经安装好 ...

  6. Tensorflow细节-P84-梯度下降与批量梯度下降

    1.批量梯度下降 批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新.从数学上理解如下: 对应的目标函数(代价函数)即为: (1)对目标函数求偏导: (2)每次迭代对参数进 ...

  7. php 文件包含函数

    在实际开发中,常常需要把程序中的公用代码放到一个文件中,使用这些代码的文件只需要包含这个文件即可.这种方法有助于提高代码的重用性,给代码的编写与维护带来很大的便利.在PHP中, 有require.re ...

  8. Kylin 1 背景、历史与使命

    1.1 背景和历史 今天,大数据领域的发展如火如荼,各种新技术层出不穷,整个生态欣欣向荣.作为大数据领域最重要的技术——Apache Hadoop,从诞生至今已有10周年.它最初只是致力于简单的分布式 ...

  9. javascript之大文件分段上传、断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  10. flask入门脚本解释

    创建一个最小的flask应用, 稍做编辑如下, 开启debug调试模式后, 服务器自动加载服务器的修改. 如何自己构建一个优雅的url呢 http方法介绍 http访问urls的方法有get, pos ...