AWS Lambda + Flask 应用示例

news2024/11/26 17:42:06

前言

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_template

app = 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/bash

PATH=$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.coloradmin.cn/o/1833581.html

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

相关文章

SpringBoot配置第三方专业缓存技术jetcache远程缓存方案和本地缓存方案

JetCache 是一个基于 Java 的分布式缓存解决方案&#xff0c;旨在提供高性能和可扩展性。它支持多种后端存储&#xff0c;如 Redis、Hazelcast、Tair 等&#xff0c;可以作为应用程序的缓存层&#xff0c;有效地提升数据访问性能和响应速度。 JetCache 的主要特点包括&#x…

Elasticsearch过滤器(filter):原理及使用

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

AWS——01篇(AWS入门 以及 AWS之EC2实例及简单实用)AWS

AWS——01篇&#xff08;AWS入门 以及 AWS之EC2实例及简单实用&#xff09; 1. 前言 2. 创建AWS账户 3. EC2 3.1 启动 EC2 新实例 3.1.1 入口 3.1.2 设置名称 选择服务 3.1.3 创建密钥对 3.1.4 网络设置——安全组 3.1.4.1 初始设置 3.1.4.2 添加安全组规则&#xff08;开放新…

【数据库编程-SQLite3(三)】Ubuntu下sqlite3的使用

学习分享 1、安装sqlite3命令2、sqlite3点命令3、在Linux命令行下&#xff0c;启动sqlite33.1、编写sql脚本3.2、脚本编写--DDL3.3、进入xxx.db数据库&#xff0c;读取脚本。3.4、再次查看数据库中的表。证明表创建成功。3.5、查看数据表中用户内容3.6、查看表结构3.7、在数据库…

Golang | Leetcode Golang题解之第164题最大间距

题目&#xff1a; 题解&#xff1a; type pair struct{ min, max int }func maximumGap(nums []int) (ans int) {n : len(nums)if n < 2 {return}minVal : min(nums...)maxVal : max(nums...)d : max(1, (maxVal-minVal)/(n-1))bucketSize : (maxVal-minVal)/d 1// 存储 (…

C#(C Sharp)学习笔记_多态【十九】

前言 个人觉得多态在面向对象编程中还比较重要的&#xff0c;而且不容易理解。也是学了一个下午&#xff0c;才把笔记写得相对比较完善&#xff0c;但仍欠缺一些内容。慢慢来吧…… 什么是多态&#xff1f; 基本概念 在编程语言和类型论中&#xff0c;多态&#xff08;Poly…

DAY3-力扣刷题

1.罗马数字转整数 13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L …

MySQL常见的命令

MySQL常见的命令 查看数据库&#xff08;注意添加分号&#xff09; show databases;进入到某个库 use 库; 例如&#xff1a;进入test use test;显示表格 show tables;直接展示某个库里面的表 show tables from 库&#xff1b; 例如&#xff1a;展示mysql中的表格 show tabl…

无广告、简单、实用的高性能 PDF 处理工具

一、简介 1、无广告、简单、实用的高性能 PDF 处理工具。它安装包大小在 240MB 左右&#xff0c;目前仅支持 Windows 平台。 二、下载 1、文末有下载链接,不明白可以私聊我哈&#xff08;麻烦咚咚咚&#xff0c;动动小手给个关注收藏小三连&#xff0c;我将继续努力为大家寻找以…

【Linux】进程_8

文章目录 五、进程10. 进程等待阻塞等待和非阻塞等待 11. 进程程序替换 未完待续 五、进程 10. 进程等待 上一篇我们知道了 wait 和 waitpid 函数都有一个 status 参数&#xff0c;这个参数是什么呢&#xff1f;这个参数其实就是进程的返回结果&#xff0c;当子进程结束的时候…

银行数仓项目实战(一)--什么是数据仓库

文章目录 数据仓库特点目的&#xff1a;监管报送监管报送的系统主要有&#xff1f;监管报送报送的数据 OLTP和OLAP 架构 数据仓库 数据仓库是一个面向主题的&#xff0c;集成的&#xff0c;非易失的且随时间变化的数据集合&#xff0c;用来支持管理人员的决策。 数据仓库是一个…

Nuxt快速学习开发 - Nuxt3静态资源Assets

Nuxt 使用两个目录来处理样式表、字体或图像等资产。 public/目录内容按原样在服务器根目录中提供。 assets/目录包含您希望构建工具&#xff08;Vite 或 webpack&#xff09;处理的所有资产。 public/目录 public目录用作静态资产的公共服务器&#xff0c;可在您的应用程序定…

CEM美国培安消解罐内管 CEM40位 55ML 微波消解罐

内罐采用高纯实验级进口增强改性处理TFM材料或PFA材料&#xff0c;我厂加工的微波罐能与原厂仪器匹配&#xff0c;而且是盖、体通配&#xff0c;无尺寸误差。精选材质&#xff0c;未添加回料&#xff0c;洁净的加工环境&#xff0c;优化了加工工艺&#xff0c;确保低本底&#…

Java多线程设计模式之不可变对象(Immutable Object)模式

简介 多线程共享变量的情况下&#xff0c;为了保证数据一致性&#xff0c;往往需要对这些变量的访问进行加锁。而锁本身又会带来一些问题和开销。Immutable Object模式使得我们可以在不加锁的情况下&#xff0c;既保证共享变量访问的线程安全&#xff0c;又能避免引入锁可能带…

图书管理系统代码(Java)

1、运行演示 QQ2024528-205028-HD 详细讲解在这篇博客&#xff1a;JavaSE&#xff1a;图书管理系统-CSDN博客 2、所建的包 3、Java代码 3.1 book包 3.1.1 Book类代码 package book;/*** Created with IntelliJ IDEA.* Description:* User: dings* Date: 2024-05-13* Time:…

CentOS 7.9检测硬盘坏区、实物定位(三)

系列文章目录 CentOS 7.9上创建JBOD&#xff08;一&#xff09; CentOS 7.9上创建的JBOD阵列恢复&#xff08;二&#xff09; 文章目录 系列文章目录前言一、在系统中找到硬盘对应的盘符二、使用命令定位实物1.badblocks检测坏块2.对2T以上的硬盘检测&#xff08;对本篇非必要…

【Mongodb-01】Mongodb亿级数据性能测试和压测

mongodb数据性能测试 一&#xff0c;mongodb数据性能测试1&#xff0c;mongodb数据库创建和索引设置2&#xff0c;线程池批量方式插入数据3&#xff0c;一千万数据性能测试4&#xff0c;两千万数据性能测试5&#xff0c;五千万数据性能测试6&#xff0c;一亿条数据性能测试7&am…

力扣每日一题 6/17 枚举+双指针

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 522.最长特殊序列II【中等】 题目&#xff1a; 给定字符串列表 strs &…

.Net OpenCVSharp生成灰度图和二值图

文章目录 前言一、灰度图二、二值图 前言 使用OpenCVSharp生成图片的灰度图和二值图 .Net 8.0版本&#xff0c;依赖OpenCvSharp4和OpenCvSharp4.runtime.win组件。 原图&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、灰度图 /// &…

亚马逊跟卖ERP系统,怎样提升新手卖家选品的质量与效率!

今天给新手卖家推荐一款实用ERP系统&#xff0c;相信新手卖家在碰到最难的问题应该就是选品了吧&#xff0c;那我们该如何快速解决我们找品难找品慢的问题呢&#xff0c;现在有一套专门为跟卖打造的一款全功能erp系统&#xff0c;从我们选品上传&#xff0c;到我们采购&#xf…