我找不到很好的资源来帮助我理解如何将Flask和sqlalchemy应用程序迁移到AWS lambda和API网关并使之无服务器。像下面这样的示例是从flask_sqlalchemy文档中获取的示例代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username


现在,我如何将该代码迁移到AWS lambda。可能吗。例如,行app = Flask(__name__)应该不正确吗?如果没有应用程序变量,我该如何初始化db变量?

请有人可以给我一些介绍或指向可以清除这些概念的优秀教程的链接吗?

提前谢谢了。

最佳答案

首先,在AWS Lambda中,您不再使用Flask进行路由。而是使用AWS API Gateway进行路由。路由示例如下所示,来自https://apievangelist.com/2017/10/23/a-simple-api-with-aws-dynamodb-lambda-and-api-gateway/

python - 在AWS Lambda和API网关中部署Flask sqlalchemy应用程序-LMLPHP

如您在图片的右端看到的,“ Lambda”框显示了您已上传的Lambda函数的名称。有关Python中的Lambda,请参见https://docs.aws.amazon.com/lambda/latest/dg/python-programming-model-handler-types.html

基本上,Python lambda的主要功能是:

def handler_name(event, context):
   ...
   return some_value


从事件和上下文中,您可以获得所有信息:路径,HTTP方法,标头,参数,正文等(例如flask.request)。您可能还需要知道执行Lambda LAMBDA和LAMBDA_PROXY的两种方法(请参见第一张图片中的Integration Request框)。

简短的版本差异是:


LAMBDA模式将自动预处理请求正文,并在event中为Lambda函数提供一个Python对象。
LAMBDA_PROXY将给您原始的HTTP请求,您需要在Lambda函数内部自己转换内容。


对于SQL Alchemy,您所需要做的就是将所有SQL Alchemy库代码及其依赖项与Lambda函数一起压缩,然后将其上传到Lambda控制台,它无需任何修改即可工作。

请注意,SQLite将无法在Lambda中使用,因为Lambda函数无法访问文件系统。您应该将数据放在其他地方,例如Amazon RDS(使用MySQL,PostgreSQL,随您喜欢),然后确保Lambda与RDS数据库连接到同一VPC(Amazon内部路由器)。

10-07 18:27
查看更多