# 服务
服务就像一个项目。您可以在其中定义AWS Lambda函数,触发它们的事件以及它们所需的任何AWS基础设施资源,所有这些都在一个名为 serverless.yml 的文件中。
要开始构建您的第一个 Serverless Framework 项目,请创建一个服务。
# 组织
在应用程序开始时,许多人使用单个服务来定义该项目的所有函数、事件和资源。这是我们一开始的建议。
myService/
serverless.yml # 包含所有函数和基础设施资源
但是,随着应用程序的增长,您可以将其分解为多个服务。许多人通过 工作流 或 数据模型 来组织其服务,并将与那些工作流和数据模型相关的功能组合在服务中。
users/
serverless.yml # 包含4个函数,用于执行用户CRUD操作和用户数据库
posts/
serverless.yml # 包含4个函数,用于执行Posts CRUD操作和Posts数据库
comments/
serverless.yml # 包含4个函数,用于执行Comments CRUD操作和Comments数据库
这是有意义的,因为相关的功能通常使用公共基础设施资源,并且您希望将这些功能和资源作为单个部署单元保存在一起,以便更好地组织和分离关注点。
# 创建服务
要创建服务,请使用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 command docs,以获取所有详细信息和选项。
# 内容
您将在工作目录中看到以下文件:
- serverless.yml
- handler.js
# serverless.yml
每个服务配置都在serverless.yml文件中进行管理。该文件的主要职责是:
- 声明 Serverless 服务
- 在服务中定义一个或多个函数
- 定义将部署服务的提供者 provider (如果提供,则定义运行时)
- 定义要使用的任何自定义插件
- 定义触发每个函数执行的事件(例如,HTTP请求)
- 定义此服务中的函数所需的一组资源(例如1 DynamoDB表)
- 允许 events 部分中列出的事件在部署时自动创建事件所需的资源
- 允许使用 Serverless变量 进行灵活配置
您可以看到服务的名称、provider 配置和函数定义中指向handler.js文件的第一个函数。任何进一步的服务配置都将在此文件中完成。
# serverless.yml
service: users
provider:
name: aws
runtime: nodejs12.x
stage: dev # 设置使用的默认阶段。 默认为dev
region: us-east-1 # 覆盖使用的默认区域。 默认值为us-east-1
stackName: my-custom-stack-name-${self:provider.stage} # 覆盖默认的CloudFormation堆栈名称。 默认值为 ${self:service}-${self:provider.stage}
apiName: my-custom-api-gateway-name-${self:provider.stage} # 覆盖默认的API网关名称。 默认值为 ${self:provider.stage}-${self:service}
profile: production # 与此服务一起使用的默认配置文件
memorySize: 512 # 覆盖默认的内存大小。 默认值为1024
deploymentBucket:
name: com.serverless.${self:provider.region}.deploys # 覆盖默认部署存储桶
serverSideEncryption: AES256 # 在使用服务器端加密时,指定加密方法
tags: # 将被添加到每个部署资源的标记
key1: value1
key2: value2
deploymentPrefix: serverless # 覆盖默认的S3前缀,在该前缀下应存储已部署的工件。 默认为 serverless
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
# 你的“functions”使用的“资源”。原始的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上部署stage默认为dev,区域默认为us-east-1,除非您在其他地方指定了这些,或者将它们作为选项添加进来:
serverless deploy --stage prod --region us-east-1
查看部署指南,以了解有关部署及其工作方式的更多信息。或者,请查看deploy命令文档以获取所有详细信息和选项。
# 移除
为了轻松地从您的AWS账户中删除服务,您可以使用 remove 命令。
运行 serverless remove -v 以触发删除过程。与部署步骤一样,我们也在详细模式下运行,因此您可以看到删除过程的所有详细信息。
Serverless将启动删除并在控制台上通知您它的进程。一旦整个服务被删除,就会打印一条成功消息。
删除过程只会删除您 provider 提供商的基础架构上的服务。服务目录仍将保留在您的本地计算机上,因此您以后仍可以对其进行修改并将其(重新)部署到另一个阶段,区域或提供者。
# 版本固定
通常,Serverless Framework是通过 npm install -g serverless 全局安装的。这样,您的所有服务都可以使用Serverless CLI。
全局安装工具的缺点是无法将版本固定在package.json中。如果您升级Serverless,而您的同事或CI系统却没有,则会导致问题。现在,您可以在serverless.yml中使用一项新功能,该功能仅在最新版本中可用,而无需担心CI系统将与旧版本的Serverless一起部署。
# 固定版本
要配置版本固定,请在 serverless.yaml 中定义 frameworkVersion属性。每当您从CLI运行Serverless命令时,它都会检查您当前的Serverless版本是否与 frameworkVersion 范围匹配。 CLI使用语义版本控制,因此您可以将其固定到一个确切的版本或提供一个范围。一般情况下,我们建议锁定一个精确的版本,以确保团队中的每个人都具有完全相同的设置,并且不会发生意外的问题。
# 确切的版本
# serverless.yml
frameworkVersion: "=1.0.3"
service: users
provider:
name: aws
runtime: nodejs12.x
memorySize: 512
…
# 提供一个范围
# serverless.yml
frameworkVersion: ">=1.0.0 <2.0.0"
service: users
provider:
name: aws
runtime: nodejs12.x
memorySize: 512
…
# 在现有服务中安装Serverless
如果您已经拥有Serverless服务,并且希望使用 package.json 锁定框架版本,则可以按以下方式安装无服务器:
# from within a service
npm install serverless --save-dev
# 本地调用Serverless
要执行本地安装的Serverless可执行文件,必须从 node modules 目录中引用二进制文件。
node ./node_modules/serverless/bin/serverless deploy
# 参考
← AWS-简介 函数-Functions →