使用AWS Lambda,API Gateway和S3 Storage快速调整图片大小
在本文中,我们将讨论在从AWS S3存储请求具有大小参数(宽度/高度)的原始图像大小之后创建不同的图像大小。
图像对于创建引人入胜的用户体验至关重要,可能需要更多努力将大型和高分辨率图像集成到用户界面中,但问题在于它们会降低整个网页的下载速度。想象一下,你有一个博客网站,大多数读者都在手机上查看你的网站,在这种情况下,他们不需要高分辨率的图片,这可能会减慢下载整个内容,这对你的读者不利,并且他们中的一些人正在阅读他们的笔记本电脑,他们有更好的连接和更好的屏幕,因此将欣赏更高质量的图像。
本文的主要目的是向您展示如何仅使用AWS lambda函数,这意味着不需要服务器(EC2实例)来创建图像大小调整任务。当通过API网关端点从s3存储桶加载图像时,将触发lambda函数,该函数将根据指定的大小调整图像大小(如果存储桶中不存在指定大小的图像),它将返回已调整大小的图片网址。
目录
- 建筑
- Lambda函数配置
- 上传源代码
- API网关配置
- 测试
建筑
因此,本教程将指导我们如何使用AWS Lambda,API Gateway和S3实现简单的图像大小调整任务。

- 用户将使用图像大小参数(宽度/高度)向API网关发送请求,以便接收已调整大小的图像的s3 URL,
- API网关请求将触发lambda函数,
- 这将检查具有给定大小的图像是否存在,
- 如果它这样做,将返回图像s3 URL,
- 否则它将从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
让我们从解释源代码开始:
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函数被要调整大小的图像的新传入请求触发时,将调用它。它从请求路径获取key
和size
参数,然后它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以使整个更改生效
测试
现在我们已经为我们的图像调整lambda函数构建了所需的一切,让我们使用cURL测试它。
测试...
使用AWS Lambda,API Gateway和S3 Storage快速调整图片大小的更多相关文章
- 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 ...
- 基于aws api gateway的asp.net core验证
本文是介绍aws 作为api gateway,用asp.net core用web应用,.net core作为aws lambda function. api gateway和asp.net core的 ...
- [AWS] Lambda by Python
当前统治数据分析的语言还是Python,还是暂时走:Python + GPU的常规路线好了. numba, pyculib (分装了cublas) Ref: 使用 Python 构建 Lambda 函 ...
- Qwiklab'实验-API Gateway, AWS Lambda'
title: AWS之Qwiklab subtitle: 2. Qwiklab'实验-API Gateway, AWS Lambda' date: 2018-09-20 17:29:20 --- In ...
- AWS lambda DynamoDB api gateway之间的连接
创建角色 附加策略 AmazonDynamoDBFullAccess AWSLambdaDynamoDBExecutionRole 创建DynamoDB表 在表的项目中创建内容 this pipi 打 ...
- AWS API Gateway Swagger定义
导出Swagger接口定义文件 在AWS API Gateway界面上,可以导出swagger接口定义文件. 而后利用Node js swagger-ui 依赖,生成swagger接口地址 Cloud ...
- 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 ...
- AWS Lambda
AWS Lambda 知识点总结 参考资料:Amazon 名词解释: 事件驱动型计算服务:通过事件来触发的计算服务 Amazon S3存储桶:一项面向Internet的存储服务,可以通过S3 随时在W ...
- AWS Lambda 借助 Serverless Framework,迅速起飞
前言 微服务架构有别于传统的单体式应用方案,我们可将单体应用拆分成多个核心功能.每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作时不会互相影响 这种设计理念被进一步应用,就变成了无 ...
随机推荐
- ASP.NET Core 2.2 项目升级至 3.0 备忘录
将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要注意的地方记录在这篇随笔中. TargetFramework 改为 netcoreapp3.0 <Target ...
- Spring+WebSocket+SockJS实现实时聊天
设计初衷是通过websocket实现网页实时通讯聊天. 工程环境:tomcat8+jdk1.7+maven+eclipse 设计思路:客户端登录网页建立socket连接,后台记录用户连接信息并做标识: ...
- 使用BERT模型生成句子序列向量
之前我写过一篇文章,利用bert来生成token级向量(对于中文语料来说就是字级别向量),参考我的文章:<使用BERT模型生成token级向量>.但是这样做有一个致命的缺点就是字符序列长度 ...
- Maven01-maven打包Web项目成war文件-tomcat脱机运行启动项目
1 执行package 2 复制 3 catalina run ,打开cmd窗口 4 输入网址 5注意要配置tomcat的 Application context为工程名字
- java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.Integer
mybatis配置的jdbaType类型要是大写的,否则就会出现此种异常 原因是在xml中配置的 jdbcType中有小写字母
- pycharm 代码跟进以跳回/返回
方法1 View-->Toolbar-->左上方的左右箭头,可以跳转光标位置,左箭头可以放回 方法2 设置快捷键 setting-->keymap-->Main menu--& ...
- matlab的正则表达式
第一部分——单个字符的匹配1 句点符号 '.' ——匹配任意一个(只有一个)字符(包括空格).例如:t.n,它匹配tan. ten.tin和ton,还匹配t#n.tpn甚至t nMatlab例子程序: ...
- 2019ICPC徐州网络赛 A.Who is better?——斐波那契博弈&&扩展中国剩余定理
题意 有一堆石子,两个顶尖聪明的人玩游戏,先取者可以取走任意多个,但不能全取完,以后每人取的石子数不能超过上个人的两倍.石子的个数是通过模方程组给出的. 题目链接 分析 斐波那契博弈有结论:当且仅当石 ...
- Fzu-java1
Fzu-趣考网-java1 标签(空格分隔): java 序列 题目 代码 示例 思考 题目: -制作一个Java控制台程序,让他可以随机生成四则运算,并针对用户的输入判断对错.之后在Github新建 ...
- Oracle substr() 字符截取函数
1.substr函数格式 (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...