无服务器Python烧瓶API,带有AWS Amplify和AWS Lambda和Amazon DynamodB
#aws #python #serverless #dynamodb

无服务器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”

上指定可能要使用的软件包

功能文件夹

https://media.licdn.com/dms/image/D4D12AQH3NMO-2DXxVw/article-inline_image-shrink_1500_2232/0/1687293367457?e=1693440000&v=beta&t=sw826aAv6oaqGK8ABTewtvvyV61qciQ0gJDnCjVvfx8

pipfile

https://media.licdn.com/dms/image/D4D12AQGY834pqF5sDg/article-inline_image-shrink_1500_2232/0/1687293419487?e=1693440000&v=beta&t=nOOGluQkKMuoK8zl5sMgtg6tfcxw8DPq-lcxuZmy29Q

在我的情况下,我正在使用此软件包,在功能中设置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,带有三列:idnameprice。它还将使用存储配置更新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软件包。)