AWS Lambda + Flask 应用示例

前言

AWS Lambda 本身是一个以事件驱动的 Serverless 服务, 最简单的应用就是在入口函数中对接收到的事件/请求进行处理并返回响应. 对于像 Flask 这样的 Web 框架, 并不能直接在 Lambda 上提供服务, 不过我们可以借助 AWS Lambda Web Adapter 实现一个基于 Flask 框架的 Web 后端服务. Lambda 前面再放上一个 API Gateway 即可完成一套完整的 Serverless Web 应用服务.

  • 官方文档
    https://github.com/awslabs/aws-lambda-web-adapter/tree/main
  • 官方 Flask Demo
    https://github.com/awslabs/aws-lambda-web-adapter/tree/main/examples/flask-zip
  • 架构实例
    在这里插入图片描述

随便写个 Flask 应用

requirements.txt

Flask==3.0.3
gunicorn==22.0.0

app.py

from flask import Flask, render_templateapp = Flask(__name__)@app.get("/<username>")
def index(username):return render_template("index.html", username=username)

templates/index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>My Flask</title>
</head><body><h1>Hello {{username}}!</h1>
</body></html>

继续添加个 Shell 脚本用于 Lambda 启动 Flask 应用
run.sh

#!/bin/bashPATH=$PATH:$LAMBDA_TASK_ROOT/bin \PYTHONPATH=$PYTHONPATH:/opt/python:$LAMBDA_RUNTIME_DIR \exec python -m gunicorn -b=:$PORT -w=1 app:app

手动在本地跑一下测试 OK

gunicorn -b=:8080 -w=1 app:app

在这里插入图片描述

部署到 Lambda

先将本地开发好的 Flask 应用包含依赖一并打包成 ZIP 文件:

lpwm@Beijing:/mnt/c/Users/lpwm/Desktop/flask-demo$ mkdir package
lpwm@Beijing:/mnt/c/Users/lpwm/Desktop/flask-demo$ pip install --target ./package/ -r requirements.txt
lpwm@Beijing:/mnt/c/Users/lpwm/Desktop/flask-demo$ cd package/
lpwm@Beijing:/mnt/c/Users/lpwm/Desktop/flask-demo/package$ zip -r ../flask-demo.zip .
lpwm@Beijing:/mnt/c/Users/lpwm/Desktop/flask-demo/package$ cd ..
lpwm@Beijing:/mnt/c/Users/lpwm/Desktop/flask-demo$ zip -ur flask-demo.zip app.py run.sh templates/

打包完成后的 ZIP 压缩包内部长这样, 即所有的依赖会放在项目的根路径(app.py所在位置)中:
在这里插入图片描述

在 Lambda 控制台创建一个新的 Function, Runtime 选择 Python, Architecture 注意选择 x86_64, 目前中国区的 AWS Lambda Web Adapter 还不支持 arm64 架构.
在这里插入图片描述
创建好的 Function 点击 Upload from > .zip file 选择本地准备好的 ZIP 压缩包进行上传.
在这里插入图片描述
划重点 添加 Layer. 中国区 AWS 对应的 Layer ARN 目前还仅支持 x86_64 架构的环境

  • cn-north-1 (Beijing)
    x86_64: arn:aws-cn:lambda:cn-north-1:041581134020:layer:LambdaAdapterLayerX86:22
  • cn-northwest-1 (Ningxia)
    x86_64: arn:aws-cn:lambda:cn-northwest-1:069767869989:layer:LambdaAdapterLayerX86:22
    在这里插入图片描述
    在这里插入图片描述
    配置两个环境变量:

AWS_LAMBDA_EXEC_WRAPPER: /opt/bootstrap 固定内容, 用于初始化 AWS Lambda Web Adapter Layer
PORT: 8080 gunicorn 启动内部 Flask server 时监听的端口, 也是 AWS Lambda Web Adapter 用来访问内部 Web 服务的端口, 可以修改为其他.
在这里插入图片描述
修改 Function 的入口函数
在这里插入图片描述
在这里插入图片描述
测试 Function 没有报错:
在这里插入图片描述

配置 API Gateway

在 Function overview 界面点击 + Add trigger
在这里插入图片描述
建议使用 REST API
在这里插入图片描述
点击 API endpoint 访问测试
在这里插入图片描述
在这里插入图片描述

填坑

直接测试访问是成功了, 但是当修改 URL 中的 flask-demo 为其他内容时, 会出现 Missing Authentication Token 错误:
在这里插入图片描述
打开 API Gateway 控制台检查自动创建的 API Resources
在这里插入图片描述
通过 Lambda 添加 Trigger 创建的 API 会默认添加和 Lambda function 相同名称的一个路由, 接受 ANY 方法请求集成给 Lambda, 结合上面测试的情况来看, 后端的 Flask 会将这个 flask-demo 判定为是要接收的参数. 这种情况显然不是我们想要的.

手动将 /flask-demo 这个路由删掉, 我们手动重新创建
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试一下
在这里插入图片描述
在这里插入图片描述
重新 Deploy
在这里插入图片描述
在这里插入图片描述

再次从浏览器访问
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA、PyCharm等基于IntelliJ平台的IDE汉化方式

PyCharm 或者 IDEA 等编辑器是比较常用的&#xff0c;默认是英文界面&#xff0c;有些同学用着不方便&#xff0c;想要汉化版本的&#xff0c;但官方没有这个设置项&#xff0c;不过可以通过插件的方式进行设置。 方式1&#xff1a;插件安装 1、打开设置 File->Settings&a…

python基础大全【13万字】

python基础大全【13万字】 Day011、Python概述2、Python解释器和pycharmIDE工具3、Python中的注释4、变量5、标识符的命名规范 ★6、变量的使用7、Python中的数据类型 ★8、Python中的bug和调试9、字符串的格式化及输出 ★10、转译字符 day021、转译字符2、f-string ★3、数据类…

iptables(4)规则匹配条件

简介 前面我们已经介绍了iptables的基本原理,表、链,数据包处理流程。如何查询各种表的信息。还有基本的增、删、改、保存的基础操作。 经过前文介绍,我们已经能够熟练的管理规则了,但是我们只使用过一种匹配条件,就是将”源地址”作为匹配条件。那么这篇文章中,我们就来…

【Java】已解决java.net.MalformedURLException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.net.MalformedURLException异常 在Java的网络编程中&#xff0c;java.net.MalformedURLException是一个常见的异常&#xff0c;它通常表明URL&#xff08;统一资源定位符…

「五度易链」企业大数据API接口开放平台上线啦!

“五度易链”企业大数据API接口开放平台现已正式上线&#xff0c;旨在为广大企业、开发者及个人提供标准、安全、高效、便捷的企业数据API接口服务&#xff0c;帮您更轻松地构建应用、扩展功能&#xff0c;并基于用户应用场景提供专属接口定制服务&#xff0c;助力企业提升研发…

数据分析必备:一步步教你如何用matplotlib做数据可视化(8)

1、Matplotlib 条形图 条形图或条状图是一种图表或图形&#xff0c;它显示带有矩形条的分类数据&#xff0c;其高度或长度与它们所代表的值成比例。可以垂直或水平绘制条形。 条形图显示了离散类别之间的比较。图表的一个轴显示要比较的特定类别&#xff0c;另一个轴表示测量值…

Stable Diffusion WebUI 使用ControlNet:IP-Adapter保持生图的角色一致性

IP-Adapter-FaceID可以在保持人脸一致的条件下生成各种风格的图像。 下载 IP Adapter 需要的 Face ID 模型和 Lora 下载地址&#xff1a;https://huggingface.co/h94/IP-Adapter-FaceID/ 下载 ip-adapter-faceid-plusv2_sd15.bin 和 ip-adapter-faceid-plusv2_sd15_lora.saf…

【MySQL进阶之路 | 高级篇】常见索引(聚簇索引, 二级索引)

1. 常见索引概念 索引按照物理实现方式&#xff0c;可以分为两种&#xff0c;聚簇索引和非聚簇索引.我们也把非聚簇索引称为二级索引或辅助索引. (1). 聚簇索引 聚簇索引并不是一种单独的索引类型&#xff0c;而是一种数据存储方式(所有的数据记录都存储在了叶子节点)&#…

js如何使得四舍五入的百分比之和为100%

在JavaScript中&#xff0c;如果你想要确保一组四舍五入后的百分比之和严格等于100%&#xff0c;那么你不能直接对每个百分比进行四舍五入&#xff0c;因为四舍五入会引入误差。但是&#xff0c;你可以采用一种策略&#xff0c;即先对所有的百分比进行常规的四舍五入&#xff0…

C# WPF入门学习主线篇(二十九)—— 绑定到对象和集合

C# WPF入门学习主线篇&#xff08;二十九&#xff09;—— 绑定到对象和集合 在WPF中&#xff0c;数据绑定是开发动态和交互性用户界面的核心技术。通过数据绑定&#xff0c;我们可以轻松地将UI控件与后台的数据源连接起来&#xff0c;实现数据的自动更新和显示。在本篇文章中&…

深度学习跨平台环境问题

在深度学习过程中&#xff0c;不可避免的是在win上跑不通的代码在ubuntu中就可以跑通&#xff0c;这里建议使用autodl。 首先在ubuntu上导出环境&#xff08;如果你的环境是base的话使用base&#xff09; conda env export --name base --no-builds > environment.yaml 这…

wordpress 导航主题 有批量从源码导入功能

下载地址&#xff1a;wordpress导航主题 可以批量导入

ardupilot开发 --- Jetson Orin Nano 后篇

我拼命加速&#xff0c;但贫穷始终快我一步 0~1920. visp-d455&#xff1a;基于IBVS的Pixhawk无人机视觉伺服20.1 基础关于连接、通讯、UDP forward服务&#xff1a;一些相关的、有用的例程Linux C程序的gdb断点调试搭建仿真解决【testPixhawkDroneTakeoff.cpp例程能解锁但起飞…

物联网LORA技术-SX1276/SX1277/SX1278-137MHz至1020MHz低功耗远距离收发器

概述&#xff1a; SX1276/SX1277/SX1278 收发器主要采用LORATM 远程调制解调器&#xff0c;用于超长距离扩频通信&#xff0c;抗干扰性强&#xff0c;能够最大限度降低电流消耗。借助升特的LoRaTM 专利调制技术&#xff0c;SX1276/SX1277/SX1278 采用低成本的晶体和物料即可获得…

SHELL脚本学习(十)初识 sed编辑器

一、sed 编辑器 sed 编辑器被称作流编辑器&#xff0c;根据命令来处理数据流中的数据。 这些数据要么从命令行输入&#xff0c;要么保存在命令文本文件中。 sed编辑器可以执行下列操作&#xff1a; 从输入中读取一行数据根据所提供的命令匹配数据按照命令修改数据流中的数据将…

WIFI6E中的MESH组网功能

什么是WIFI6E和MESH组网&#xff1f; WIFI 6E 是扩展到6GHz 频段的WIFI 6无线通信技术&#xff0c;而“WIFI 6E”中的“6”是指WIFI技术的“第6代”&#xff0c;“E”则是指使用新频段的标准的最新扩展。WIFI 6E通过增加6GHz频段&#xff0c;提供更高的带宽、更低的延迟和更大…

VMware虚拟机下载安装Windows Server 2016

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

从新手小白到红酒大咖:解锁红酒品鉴的终极秘籍,升级之路全攻略

在五彩斑斓的饮品世界中&#xff0c;红酒以其深邃的色泽、丰富的口感和悠久的历史&#xff0c;吸引了无数人的目光。对于红酒的初学者来说&#xff0c;从小白到品鉴师的道路或许充满了未知与挑战&#xff0c;但只要掌握了正确的知识和方法&#xff0c;就能够轻松踏入这个美妙的…

用群辉NAS打造影视墙(Jellyfin篇)

目录 1、安装Jellyfin媒体服务器 2、配置 (1)语言 (2)管理员账户 (3)添加媒体库 (4)指定元数据语言 (5)远程访问设置 (6)修改文件夹权限 (7)刷新电影 (8)启用硬件加速 3、PC浏览器访问 4、手机客户端 5、智能TV客户端 6、解决演员不能显示中文的问…

Android SurfaceFlinger——注册监听调用流程(七)

这一篇我们介绍一下 IComposer 中的另一个比较重要的方法&#xff0c;通过注册监听 Hal 层实现监听驱动的关键动作。 一、注册监听 在前面文章 SurfaceFlinger 的 init() 方法中&#xff0c;我们注册了一个 Callback 到 Hal 层中。最终通过 HIDL 调用到 Hal 层。 1、SurfaceF…