无服务器Python烧瓶API带有AWS Amplify和AWS lambda和Amazon Dynamodb
无服务器计算是一个云计算模型,云提供商负责所有基础架构管理,因此您可以专注于代码。这使其成为构建和部署API的绝佳选择,因为您不必担心配置和管理服务器。
在本文中,我们将向您展示如何使用 aws amplify,aws lambda和Amazon dynamodb 来创建无服务的Python烧瓶API。 P>
先决条件
- 您将需要一个AWS帐户。
- 您需要安装AWS Amplifie CLI。
- 您将需要安装Python。
体系结构概述
在深入了解实施细节之前,让我们概述我们将要构建的体系结构:
- AWS Amplify:一个综合开发平台,通过提供前端和后端开发工具,包括身份验证,数据存储和API来简化无服务器应用程序。
- aws lambda:一种无服务器计算服务,可以启用无需提供或管理服务器而无需提供代码。我们将利用lambda功能来处理API请求和响应。
- 烧瓶:轻巧而灵活的Python Web框架,是我们API开发的基础。
- Amazon DynamoDB:AWS提供的全面管理的NOSQL数据库服务。 DynamoDB将存储和检索我们的API的数据。
设置AWS放大
要开始AWS Amplify,我们需要在本地计算机上安装放大CLI(命令行界面)。放大CLI将帮助我们在AWS上配置和部署我们的后端资源。要安装放大CLI,请在终端中运行以下命令:
npm install -g @aws-amplify/cli
接下来,我们需要在我们的工作目录中初始化一个放大项目。为此,请运行以下命令:
amplify init
这将提示您输入有关项目的一些信息,例如名称,环境,默认编辑器等。您可以选择默认选项或根据需要自定义它们。您还需要提供您的AWS凭据以允许Amplify访问您的帐户。
使用AWS lambda和烧瓶创建REST API
现在我们已经设置了放大项目,我们可以使用AWS lambda和烧瓶创建REST API。为此,请运行以下命令:
amplify add api
这将提示您选择要创建的API类型。选择休息作为选项,然后按Enter。然后,您将被要求提供有关您的API的一些信息,例如名称,路径,授权类型等。对于本教程,我们将使用以下值:
? Provide a friendly name for your resource to be used as a label for this category in the project: flaskapi
? Provide a path (e.g., /items) /items
? Choose a Lambda source Create a new Lambda function
? Provide a friendly name for your resource to be used as a label for this category in the project: flaskapifunction
? Provide the AWS Lambda function name: flaskapifunction
? Do you want to access other resources created in this project from your Lambda function? No
? Do you want to invoke this function on a recurring schedule? No
? Do you want to configure Lambda layers for this function? No
? Do you want to edit the local lambda function now? Yes
? Restrict API access No
? Do you want to add another path? No
这将创建一个名为Amplify/backend/api/blaskapi的新文件夹,其中包含一些文件和文件夹。最重要的文件是lambda/index.js文件,其中包含我们lambda函数的代码。
放大使用VENV构建功能,因此您可以在此文件“ pipfile”
上指定可能要使用的软件包功能文件夹
pipfile
在我的情况下,我正在使用此软件包,在功能中设置AWS-WSGI处理程序,Boto3使用AWS服务和API烧瓶。另请记住要编辑CloudFormation-Template.json文件,因为您可能需要更改Python版本并在功能中添加更多权限。
配置所有内容后,您可以编辑该功能并添加这样的代码:
import boto
import awsgi
import os
from flask_cors import CORS
from flask import Flask, jsonify
client = boto3.client('dynamodb')
BASE_ROUTE = "/clients"
TABLE_NAME = os.environ.get('TABLE_NAME_CLIENTS')
app = Flask(__name__)
CORS(app)
@app.route(BASE_ROUTE + '/<id>', methods=['GET'])
def getInfo(id):
account = client.get_item(TableName=TABLE_NAME, Key={
'id': {'S': id}})
return jsonify(data=account)
def handler(event, context):
return awsgi.response(app, event, context)
在这里,我们正在设置boto3客户端,以使ITENS从Dynamo DB表中过滤(您可以先前创建一个端,也可以继续进行教程以稍后创建一个)。除了将处理程序定义为AWSGI,它将通过您的“ getInfo”方法的请求。
添加DynamoDB作为API的数据源
接下来,我们将添加DynamoDB作为API的数据源。 DynamoDB是一种快速且灵活的NOSQL数据库服务,可以存储和检索任何延迟且可用性高的数据。
要添加DynamoDB作为API的数据源,我们将使用放大CLI的存储类别。该存储类别允许我们为无服务器应用程序创建和管理数据源。要向我们的项目添加存储类别,请在您的终端中运行以下命令:
amplify add storage
这将询问您有关数据源的一些问题,例如名称,类型,模式等。您可以选择默认选项或根据需要自定义它们。例如,我选择了以下选项:
? Please select from one of the below mentioned services: NoSQL Databas
? Provide a friendly name for your resource that will be used to label this category in
the project: flaskapidb
? Please provide table name: Item
? What would you like to name this column: id
? Please choose the data type: string
? Would you like to add another column? Yes
? What would you like to name this column: name
? Please choose the data type: string
? Would you like to add another column? Yes
? What would you like to name this column: price
? Please choose the data type: number
? Would you like to add another column? No
? Please choose partition key for the table: id
? Do you want to add a sort key to your table? No
? Do you want to add global secondary indexes to your table? No
? Do you want to add a Lambda Trigger for your Table? Noe
回答了这些问题后,Amplify CLI将创建一个名为amplify/backend/storage/flaskapidb
的新目录,并添加一个DynamoDB表,称为Item
,带有三列:id
,name
和price
。它还将使用存储配置更新amplify/backend/backend-config.json
文件。
在本地测试API并将其部署到云中
最后,我们可以在本地测试我们的API并将其部署到云中。要在本地测试我们的API,我们需要安装放大CLI的模拟功能。模拟功能使我们能够在本地运行无服务器应用程序,而无需连接到任何云资源。要安装模拟功能,请在终端中运行以下命令:
amplify mock api
这将启动一台本地服务器,该服务器模拟我们的休息端点和lambda功能。它还将创建一个模仿我们云表的DynamoDB的局部实例。我们可以在http://localhost:3000/items访问本地API。
要将我们的API部署到云中,我们需要推动更改以放大CLI。推动命令将根据我们的本地配置创建或更新云中的所有后端资源。为了推动您可以运行以下命令:
amplify push -y
(obs:请注意,您将需要VENV和其他一些软件包来发布您的功能,因此,如果您遇到错误,则可能是由于缺少Python软件包。)