# 服务

服务就像一个项目。您可以在其中定义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

# 参考

更新时间: 5/18/2020, 3:51:06 PM