AWS服务
service
就像一个项目。您可以在这里定义AWS Lambda函数,events
触发它们以及resources
它们需要的任何AWS基础结构,所有这些都在一个名为的文件中serverless.yml
。
要开始构建您的第一个无服务器框架项目,请创建一个service
。
组织
在应用程序的开头,许多人使用单个服务来定义该项目的所有功能,事件和资源。这是我们在开始时推荐的。
myService/
serverless.yml //包含所有功能和基础设施资源
但是,随着应用程序的增长,您可以将其分解为多个服务。许多人通过工作流或数据模型组织他们的服务,并将与这些工作流和数据模型相关的功能组合在一起。
users/
serverless.yml #包含4个执行用户CRUD操作和Users数据库的功能
posts/
serverless.yml #包含4个执行Posts CRUD操作和Posts数据库的函数
comments/
serverless.yml #包含4个功能,用于执行注释CRUD操作和注释数据库
这是有道理的,因为相关功能通常使用通用基础架构资源,并且您希望将这些功能和资源作为单个部署单元保持在一起,以便更好地组织和分离关注点。
注意:目前,每个服务都将在AWS API Gateway上创建单独的REST API。由于AWS API Gateway的限制,每个REST API只能有一个自定义域。如果您计划制作大型REST API,请记下此限制。此外,修复工作正在进行中,并且是首要任务。
创作
要创建服务,请使用该create命令。您还必须传入要编写服务的运行时(例如,node.js,python等)。您还可以传入路径来创建目录并自动命名您的服务:
#在 ./myService 文件夹中使用nodeJS模板创建服务
serverless create --template aws-nodejs --path myService
以下是AWS Lambda的可用模板:
- aws-clojurescript-gradle
- aws-clojure-gradle
- aws-nodejs
- aws-nodejs-typescript
- aws-alexa-typescript
- aws-nodejs-ecma-script
- aws-python
- aws-python3
- aws-ruby
- aws-provided
- aws-kotlin-jvm-maven
- aws-kotlin-nodejs-gradle
- aws-groovy-gradle
- aws-java-gradle
- aws-java-maven
- aws-scala-sbt
- aws-csharp
- aws-fsharp
- aws-go
- aws-go-dep
查看create命令文档以获取所有详细信息和选项。
内容
您将在工作目录中看到以下文件:
- serverless.yml
- handler.js
serverless.yml
每个service
配置都在serverless.yml
文件中管理。该文件的主要职责是:
- 声明无服务器服务
- 在服务中定义一个或多个功能
- 定义将部署服务的提供程序(以及提供的运行时)
- 定义要使用的任何自定义插件
- 定义触发每个要执行的函数的事件(例如HTTP请求)
- 定义此服务中的函数所需的一组资源(例如,1个DynamoDB表)
- 允许本events节中列出的事件在部署时自动创建事件所需的资源
- 允许使用无服务器变量进行灵活配置
您可以看到服务的名称,提供程序配置以及functions
定义中指向handler.js
文件的第一个函数。任何进一步的服务配置都将在此文件中完成。
# serverless.yml //文件名
service: users
provider:
name: aws
runtime: nodejs6.10
stage: dev #设置使用的默认阶段。默认是dev
region: us-east-1 #覆盖使用的默认区域。默认为us-east-1
profile: production #用于此服务的默认配置文件
memorySize: 512 #覆盖默认的内存大小。默认值为1024
deploymentBucket:
name: com.serverless.${self:provider.region}.deploys #覆盖默认部署桶
serverSideEncryption: AES256 #使用服务器端加密时
tags: #将添加到每个部署资源的标记
key1: value1
key2: value2
deploymentPrefix: serverless #覆盖应存储已部署工件的默认S3前缀。默认是无服务器的
versionFunctions: false #可选功能版本控制
stackTags: #可选的CF堆栈标签
key: value
stackPolicy: #可选CF堆叠策略。 以下示例允许更新除删除/替换EC2实例之外的所有资源(请谨慎使用!)
- Effect: Allow
Principal: "*"
Action: "Update:*"
Resource: "*"
- Effect: Deny
Principal: "*"
Action:
- Update:Replace
- Update:Delete
Resource: "*"
Condition:
StringEquals:
ResourceType:
- AWS::EC2::Instance
functions:
usersCreate: #一个函数
handler: users.create
events: #触发此功能的事件
- http: post users/create
usersDelete: # 一个函数
handler: users.delete
events: #触发此功能的事件
- http: delete users/delete
#“功能”使用的“资源”。 原始AWS CloudFormation进入此处。
resources:
Resources:
usersTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: usersTable
AttributeDefinitions:
- AttributeName: email
AttributeType: S
KeySchema:
- AttributeName: email
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
每个serverless.yml转换为单个AWS CloudFormation模板,并从生成的CloudFormation模板创建CloudFormation堆栈。
handler.js
该handler.js
文件包含您的功能代码。函数定义serverless.yml
将指向此handler.js
文件和此处导出的函数。
event.json
注意:默认情况下不会创建此文件
创建此文件并添加事件数据,以便您可以通过数据调用您的函数 serverless invoke -p event.json
部署
部署服务时,您的所有功能,事件和资源serverless.yml
都将转换为AWS CloudFormation模板,并部署为单个CloudFormation堆栈。
要部署服务,首先要cd
进入相关的服务目录:
cd my-service
然后使用deploy
命令:
serverless deploy
部署默认为AWS 上的dev
阶段和us-east-1
区域,除非您在其他地方指定了这些,或者将它们作为选项添加:
serverless deploy --stage prod --region us-east-1
查看部署指南,了解有关部署及其工作方式的更多信息。或者,查看deploy命令文档以获取所有详细信息和选项。
删除
要从AWS账户轻松删除您的服务,您可以使用该remove
命令。
运行serverless remove -v
以触发删除过程。在部署步骤中,我们也在verbose
模式下运行,因此您可以查看删除过程的所有详细信息。
无服务器将启动删除并通知您有关其在控制台上的进程。删除整个服务后,将打印成功消息。
删除过程将仅删除提供商基础结构上的服务。服务目录仍将保留在本地计算机上,因此您仍可以稍后修改并(重新)将其部署到另一个阶段,区域或提供程序。
版本固定
无服务器框架通常通过全局安装npm install -g serverless
。这样,您就可以为所有服务提供无服务器CLI。
全局安装工具的缺点是版本无法固定在package.json中。如果您升级无服务器,这可能会导致问题,但您的同事或CI系统不会。您现在可以在serverless.yml中使用新功能,该功能仅在最新版本中可用,而不必担心您的CI系统将使用旧版本的无服务器进行部署。
固定版本
要配置版本固定frameworkVersion
,请在serverless.yaml中定义属性。每当您从CLI运行无服务器命令时,它都会检查您当前的无服务器版本是否与该frameworkVersion
范围匹配。CLI使用语义版本控制,因此您可以将其固定到精确版本或提供范围。一般来说,我们建议您确定一个确切的版本,以确保您团队中的每个人都具有完全相同的设置,并且不会发生意外问题。
例子:
# serverless.yml
frameworkVersion: "=1.0.3"
service: users
provider:
name: aws
runtime: nodejs6.10
memorySize: 512
…
版本范围
# serverless.yml
frameworkVersion: ">=1.0.0 <2.0.0"
service: users
provider:
name: aws
runtime: nodejs6.10
memorySize: 512
…
从现有服务中安装serverless
如果您已经拥有无服务器服务,并且希望使用锁定框架版本package.json
,则可以按如下方式安装无服务器:
#来自服务范围内
npm install serverless --save-dev
在本地调用无服务器
要执行本地安装的无服务器可执行文件,您必须从节点模块目录中引用二进制文件。
例:node ./node_modules/serverless/bin/serverless deploy