如何在15分钟内搭建一个无服务器服务

整个网站将使用以下AWS服务:

至于API服务器的开发和部署,我们使用Python+Flask的组合来开发服务,然后使用Zappa()作为无服务器部署工具。

设置AWS环境

首先,您需要设置AWS环境,以便可以从代码和zappa访问AWS。需要两个步骤:

创建AWS用户

登录AWS并选择“IAM”服务来管理用户。

创建一个名为“myservice-admin”的用户(或任何您喜欢的用户名)并选中“编程访问”选项。

在下一步中,单击“直接附加现有策略”按钮并向用户添加“AdministratorAccess”。

从安全角度来看,这种方法并不好。不过,出于演示目的,本文不会详细介绍如何查找部署无服务器架构所需的权限。

点击“下一步”按钮,最后点击“创建用户”按钮,myservice-admin用户就创建完成了。请注意,创建成功的屏幕上将显示AccessKeyID和Secret访问密钥值。请务必保存这两个副本,因为稍后您将使用它们来设置本地环境。

此屏幕是您可以看到秘密访问密钥的唯一地方!如果您忘记复制并关闭页面,则只能前往用户的详细信息屏幕生成新的访问密钥和秘密。

设置本地AWS环境

为了在本地使用AWS,我们需要创建一个本地环境。

首先安装awscli工具,并用它来帮助我们配置环境:

1$sudoaptinstallawscli

安装完成后,可以使用awsconfigure命令进行设置:

1$awsconfigure2AWSAccessKeyID[None]:******3AWSSecretAccessKey[None]:******4Defaultregionname[None]:us-east-15Defaultoutputformat[None]:json

这里需要输入上一步保存的AccessKeyID和SecretAccessKey值。至于区域,我使用的是us-east-1。其他区域也应该没问题,但如果您像我一样使用CloudFront,则可能会遇到一些问题。

在DynamoDB中创建表

我们的后端API需要实现一个计数器。为了保存计数器值,我们需要使用DynamoDB。DynamoDB是AWS提供的键值数据库。首先我们需要在DynamoDB中创建一个表并设置我们需要的计数器的初始值。

在AWS控制台中选择DynamoDB服务,然后单击“创建表”按钮。在“创建DynamoDB表”屏幕中,在表名称中填写myservice-dev,在主键字段中填写id,然后单击创建表按钮。

几秒钟后,表格就建好了。选择刚刚创建的表,然后选择右侧的Items选项卡,点击Createitem按钮创建一个item,item内容为id=counter且counter_value=0。

创建值时,需要点击左侧的加号按钮添加counter_value属性,并且不要忘记将counter_value属性的类型设置为Number。

创建API服务

接下来我们需要创建一个API服务。此API将提供一个计数器API,每次调用都会将计数器值加一。计数器值保存在DynamoDB中。API的端点如下:

使用Python和Flask编写API服务

首先我们需要创建一个Python虚拟环境并安装必要的包:

1$mkdirmyservicecdmyservice2$python3-mvenv.env3$source.env/bin/active4(.env)$pipinstallflaskboto3simplejson

Flask是一个Web框架,boto3是访问DynamoDB的必备包。simplejson可以解决转换JSON时遇到的一些问题。接下来创建myservice.py并包含以下内容:

1importboto32fromflaskimportFlask,jsonify3app=Flask(__name__)4#Initializedynamodbaccess5dynamodb=boto3.resource(dynamodb)6db=dynamodb.Table(myservice-dev)7

app.route(/counter,methods=[GET])8defcounter_get():9res=db.get_item(Key={id:counter})10returnjsonify({counter:res[Item][counter_value]})11

app.route(/counter/increase,methods=[POST])12defcounter_increase():13res=db.get_item(Key={id:counter})14value=res[Item][counter_value]+res=db.update_item(16Key={id:counter},17UpdateExpression=setcounter_value=:value,18ExpressionAttributeValues={:value:value},19)20returnjsonify({counter:value})

创建另一个run.py在本地测试服务:

1frommyserviceimportapp2if__name__==__main__:3app.run(debug=True,host=.0.0.1,port=)

运行服务:

1(.env)$pythonrun.py

这样你就可以在命令行上测试服务(打开另一个终端并输入以下命令):

1$curllocalhost:/counter2{3"counter":04}5$curl-XPOSTlocalhost:/counter/increase6{7"counter":18}9$curl-XPOSTlocalhost:/counter/increase10{11"counter":}13$curllocalhost:/counter14{15"counter":}

我们可以看到计数器的值增加了,说明该服务可用了!

将服务部署到Lambda

要将API部署到Lambda,您可以使用Zappa包。Zappa包使微服务的部署变得极其简单。首先安装Zappa:

1(.env)$pipinstallzappa

然后执行Zappainit命令来初始化Zappa环境。它会问你几个问题,但你基本上可以使用默认值回答它们:

1(.env)$zappainit2...3Whatdoyouwanttocallthisenvironment(defaultdev):4...5Whatdoyouwanttocallyourbucket?(defaultzappa-ab7dd70x5):6ItlookslikethisisaFlaskapplication.7Whatsthemodularpathtoyourappsfunction?8Thiswilllikelybesomethinglikeyour_module.app.9Wediscovered:myservice.app10Whereisyourappsfunction?(defaultmyservice.app):11...12Wouldyouliketodeploythisapplicationglobally?(defaultn)[y/n/(p)rimary]:13Okay,heresyourzappa_settings.json:14{15"dev":{16"app_function":"myservice.app",17"aws_region":"us-east-1",18"profile_name":"default",19"project_name":"myservice",20"runtime":"python3.6",21"s3_bucket":"zappa-ab7dd70x5"22}23}24Doesthislookokay?(defaulty)[y/n]:25...

初始化完成后,目录下会生成zappa_settings.json文件。然后您可以部署该服务:

1(.env)$zappadeploydev2Callingdeployforstagedev..3...4Deployment


转载请注明:http://www.xbkqw.com/rcbj/95197.html

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 当前时间: