# Serverless.yml参考

下面是当提供程序设置为aws时,serverless.yml 中所有可用属性的列表。

# serverless.yml

service:
  name: myService
  awsKmsKeyArn: arn:aws:kms:us-east-1:XXXXXX:key/some-hash # 可选的KMS密钥arn,将用于所有函数的加密

frameworkVersion: '>=1.0.0 <2.0.0'

provider:
  name: aws
  runtime: nodejs12.x
  stage: ${opt:stage, 'dev'} # 设置使用的默认阶段。默认为dev
  region: ${opt:region, 'us-east-1'} # 覆盖使用的默认区域。默认值为us-east-1
  stackName: custom-stack-name # 为CloudFormation堆栈使用自定义名称
  apiName: custom-api-name # 为API网关API使用自定义名称
  websocketsApiName: custom-websockets-api-name # 为websockets API使用自定义名称
  websocketsApiRouteSelectionExpression: $request.body.route # 自定义路由选择表达式
  profile: production # 与此服务一起使用的默认配置文件
  memorySize: 512 # 覆盖默认的内存大小。默认值为1024
  reservedConcurrency: 5 # 可选,覆盖默认的并发保留限制。默认情况下,AWS使用账户并发限制
  timeout: 10 # 默认值为6秒。注意:API网关当前的最大值为30秒
  logRetentionInDays: 14 # 为CloudWatch LogGroup设置默认的RetentionInDays
  deploymentBucket:
    name: com.serverless.${self:provider.region}.deploys # 部署存储桶名称。默认值由框架生成
    maxPreviousDeploymentArtifacts: 10 # 在每次部署时,框架都会删除桶以删除超过此限制的工件。默认值是5
    blockPublicAccess: true # 禁止通过ACL或存储桶策略进行公共访问。默认为false
    serverSideEncryption: AES256 # 服务器端加密方法
    sseKMSKeyId: arn:aws:kms:us-east-1:xxxxxxxxxxxx:key/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa # 使用服务器端加密时
    sseCustomerAlgorithim: AES256 # 在使用服务器端加密和自定义密钥时
    sseCustomerKey: string # 在使用服务器端加密和自定义密钥时
    sseCustomerKeyMD5: md5sum # 在使用服务器端加密和自定义密钥时
    tags: # 将被添加到每个部署资源的标签
      key1: value1
      key2: value2
  deploymentPrefix: serverless # S3前缀,应在其中存储已部署的工件。默认为无服务器
  role: arn:aws:iam::XXXXXX:role/role # 覆盖用于所有函数的默认IAM角色
  rolePermissionsBoundary: arn:aws:iam::XXXXXX:policy/policy # 角色的权限边界的ARN。
  cfnRole: arn:aws:iam::XXXXXX:role/role # CloudFormation服务的IAM角色的ARN。如果指定,CloudFormation将使用角色的凭据
  versionFunctions: false # 可选函数版本控制
  environment: # 服务范围环境变量
    serviceEnvVar: 123456789
  endpointType: regional # API Gateway REST API的可选端点配置。默认值为Edge。
  apiKeys: # API网关REST API 服务要使用的API密钥列表
    - myFirstKey
    - ${opt:stage}-myFirstKey
    - ${env:MY_API_KEY} # 您可以将其隐藏在serverless变量中
  apiGateway: #  可选的API网关全局配置
    restApiId: xxxxxxxxxx #  REST API资源ID。默认值由框架生成
    restApiRootResourceId: xxxxxxxxxx # 根资源ID,表示为/path
    restApiResources: #REST API中创建的现有资源列表。这是必需的,否则堆栈会发生冲突
      '/users': xxxxxxxxxx
      '/users/create': xxxxxxxxxx
    websocketApiId: # Websocket API资源ID。默认值由框架生成
    apiKeySourceType: HEADER # 使用计划的API密钥的来源。标头或授权人。
    minimumCompressionSize: 1024 # 当大于指定的字节大小时压缩响应(必须在0到10485760之间)
    description: Some Description # API Gateway阶段部署的可选描述
    binaryMediaTypes: # API可能返回的可选二进制媒体类型
      - '*/*'
  alb:
    targetGroupPrefix: xxxxxxxxxx # 在为目标组生成名称时添加可选前缀
    authorizers:
      myFirstAuth:
        type: 'cognito'
        userPoolArn: 'arn:aws:cognito-idp:us-east-1:123412341234:userpool/us-east-1_123412341', # 必须
        userPoolClientId: '1h57kf5cpq17m0eml12EXAMPLE', # 必须
        userPoolDomain: 'your-test-domain' # 必须
        allowUnauthenticated: true # 如果设置为true,则允许在用户未进行身份验证时将请求转发到目标。省略此参数将返回一个HTTP 401未授权错误
        requestExtraParams: # 可选的。将查询参数(最多10个)包含在到授权端点的重定向请求中
          prompt: 'login'
          redirect: false
        scope: 'first_name age' # 可以是与客户端关联的任何系统保留作用域或自定义作用域的组合。默认是openid
        sessionCookieName: '🍪' # 用于维护会话信息的cookie的名称。默认是AWSELBAuthSessionCookie
        sessionTimeout: 7000 # 身份验证会话的最长持续时间(秒)。默认值为604800秒(7天)。
      mySecondAuth:
        type: 'oidc'
        authorizationEndpoint: 'https://example.com', # 必需的。IdP的授权端点。必须是完整的URL,包括HTTPS协议、域和路径
        clientId: 'i-am-client', # 必需的
        clientSecret: 'i-am-secret', # 如果创建规则,则必须这样做。如果修改规则,则在将useExistingClientSecret设置为true时可以忽略此规则(如下所示)
        useExistingClientSecret: true # 只有在省略clientSecret时才需要
        issuer: 'https://www.iamscam.com', # 必需的。IdP的OIDC发行方标识符。这必须是一个完整的URL,包括HTTPS协议、域和路径
        tokenEndpoint: 'http://somewhere.org', # 必需的
        userInfoEndpoint: 'https://another-example.com' # 必需的
        allowUnauthenticated: true # 如果设置为true,则允许在用户未进行身份验证时将请求转发到目标。省略此参数将返回一个HTTP 401未授权错误
        requestExtraParams:
          prompt: 'login'
          redirect: false
        scope: 'first_name age'
        sessionCookieName: '🍪'
        sessionTimeout: 7000
  httpApi:
    id: # 如果我们要附加到外部创建的HTTP API,应该在这里提供它的id
    name: # 为API网关API使用自定义名称,默认值为 ${self:provider.stage}-${self:service}
    payload: # 指定Lambda集成(1.0或2.0)的有效负载格式版本,默认为1.0
    cors: true # 意味着默认行为,可以使用特定选项进行微调
    authorizers:
      # 支持HTTP API端点的JWT授权方
      someJwtAuthorizer:
        identitySource: $request.header.Authorization
        issuerUrl: https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxx
        audience:
          - xxxx
          - xxxx
  usagePlan: # 可选的使用计划配置
    quota:
      limit: 5000
      offset: 2
      period: MONTH
    throttle:
      burstLimit: 200
      rateLimit: 100
  stackTags: # 可选的CF堆栈标签
    key: value
  iamManagedPolicies: # 可选的IAM托管策略,允许将策略包含在IAM角色中
    - arn:aws:iam:*****:policy/some-managed-policy
  iamRoleStatements: # IAM角色声明,以便可以在AWS账户中访问服务
    - Effect: 'Allow'
      Action:
        - 's3:ListBucket'
      Resource:
        Fn::Join:
          - ''
          - - 'arn:aws:s3:::'
            - Ref: ServerlessDeploymentBucket
  stackPolicy: # 可选的CF堆栈策略。下面的示例允许更新除删除/替换EC2实例之外的所有资源(请谨慎使用!)
    - Effect: Allow
      Principal: '*'
      Action: 'Update:*'
      Resource: '*'
    - Effect: Deny
      Principal: '*'
      Resource: '*'
      Action:
        - Update:Replace
        - Update:Delete
      Condition:
        StringEquals:
          ResourceType:
            - AWS::EC2::Instance
  vpc: # 可选的VPC。但是,如果您使用VPC,则两个子属性(securityGroupIds和subnetIds)都是必需的
    securityGroupIds:
      - securityGroupId1
      - securityGroupId2
    subnetIds:
      - subnetId1
      - subnetId2
  notificationArns: # 在发送堆栈事件通知的同一区域中现有Amazon SNS主题的列表。
    - 'arn:aws:sns:us-east-1:XXXXXX:mytopic'
  stackParameters:
    - ParameterKey: 'Keyname'
      ParameterValue: 'Value'
  resourcePolicy:
    - Effect: Allow
      Principal: '*'
      Action: execute-api:Invoke
      Resource:
        - execute-api:/*/*/*
      Condition:
        IpAddress:
          aws:SourceIp:
            - '123.123.123.123'
    rollbackConfiguration:
      MonitoringTimeInMinutes: 20
      RollbackTriggers:
        - Arn: arn:aws:cloudwatch:us-east-1:000000000000:alarm:health
          Type: AWS::CloudWatch::Alarm
        - Arn: arn:aws:cloudwatch:us-east-1:000000000000:alarm:latency
          Type: AWS::CloudWatch::Alarm
  tags: # 可选的服务范围函数标签
    foo: bar
    baz: qux
  tracing:
    apiGateway: true
    lambda: true # 可选的,可以是true (true等于'Active'), 'Active'或'PassThrough'
  logs:
    restApi: # 可选配置,指定是否使用API​​网关日志。可以将其设置为“ true”以使用默认值,也可以通过子属性进行配置。
      accessLogging: true # 可选配置,用于启用或禁用访问日志记录。默认为true。
      format: 'requestId: $context.requestId' # 可选配置,用于指定用于访问日志的日志格式。
      executionLogging: true # 可选配置,用于启用或禁用执行日志记录。默认为true。
      level: INFO # 可选配置,指定用于执行日志记录的日志级别。可以设置为INFO或ERROR。
      fullExecutionData: true # 可选配置,指定是否记录执行日志记录的完整请求/响应。默认为true。
      role: arn:aws:iam::123456:role # 管理CloudWatch日志时要使用的ApiGateway的现有IAM角色。如果未配置“role”,则会自动创建新角色。
      roleManagedExternally: false # 指定ApiGateway CloudWatch Logs角色设置是否不由Serverless管理。默认为false。
    websocket: # 可选配置,指定是否使用Websocket日志。可以将其设置为“ true”以使用默认值,也可以通过子属性进行配置。
      level: INFO # 可选配置,指定用于执行日志记录的日志级别。可以设置为INFO或ERROR。
    httpApi: # 可选配置,指定是否使用HTTP API日志。可以将其设置为“ true”(以使用以下默认值),也可以提供特定的日志格式配置
      format: '{ "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","routeKey":"$context.routeKey", "status":"$context.status","protocol":"$context.protocol", "responseLength":"$context.responseLength" }'

    frameworkLambda: true # 可选,是否为框架添加的自定义资源lambda编写CloudWatch日志

package: # 可选的部署打包配置
  include: # 指定部署包中应包含的目录和文件
    - src/**
    - handler.js
  exclude: # 指定部署包中应排除的目录和文件
    - .git/**
    - .travis.yml
  excludeDevDependencies: false # 如果无服务器应自动排除部署软件包中的开发依赖项,请进行配置。默认为true
  artifact: path/to/my-artifact.zip # 应该使用自己的程序包。您必须提供此文件。
  individually: true # 为每个函数启用单独的打包。如果为真,则必须为每个函数提供包。默认值为假

functions:
  usersCreate: # 一个函数
    handler: users.create # 此特定函数的文件和模块。
    name: ${self:provider.stage}-lambdaName # 可选,部署的Lambda函数名称
    description: My function # 函数的描述。
    memorySize: 512 # 这个特定函数的内存大小。
    reservedConcurrency: 5 #  此函数的可选的,并发保留限制。默认情况下,AWS使用账户并发限制
    provisionedConcurrency: 3 # 可选,已配置的lambda实例数
    runtime: nodejs12.x # 此特定函数的运行时。覆盖在provider级别设置的默认值
    timeout: 10 # 此特定函数的超时。覆盖上面的默认设置。
    role: arn:aws:iam::XXXXXX:role/role # 将用于此函数的IAM角色
    onError: arn:aws:sns:us-east-1:XXXXXX:sns-topic # 可选的SNS主题/ SQS arn (Ref, Fn::GetAtt and Fn::ImportValue are supported as well) 将用于DeadLetterConfig
    awsKmsKeyArn: arn:aws:kms:us-east-1:XXXXXX:key/some-hash #可选的用于加密的KMS密钥arn(覆盖在service级别定义的密钥)
    environment: # 函数级别环境变量
      functionEnvVar: 12345678
    tags: # 函数特定标签
      foo: bar
    vpc: # 可选的VPC。但如果使用VPC,则需要两个子属性(securitygroupid和subnetIds)
      securityGroupIds:
        - securityGroupId1
        - securityGroupId2
      subnetIds:
        - subnetId1
        - subnetId2
    package:
      include: # 指定此特定函数的部署包中应该包含的目录和文件。
        - src/**
        - handler.js
      exclude: # 指定此特定函数的部署包中应该排除的目录和文件。
        - .git/**
        - .travis.yml
      artifact: path/to/my-artifact.zip # 自己的包,应该用于这个特定的函数。您必须提供此文件。
      individually: true # 为特定函数启用单独的打包。如果为true,则必须为每个函数提供包。默认为false
    layers: # 要使用的可选列表Lambda层
      - arn:aws:lambda:region:XXXXXX:layer:LayerName:Y # 层版本ARN
    tracing: Active # 可选,可以是“Active”或“PassThrough”(覆盖在provider级别定义的值)
    condition: SomeCondition #可选,添加“条件”子句
    dependsOn: # 可选,附加这些额外的资源到'DependsOn'列表
      - MyThing
      - MyOtherThing
    destinations: # 可选,异步调用的目标
      onSuccess: functionName #  目标的函数名称或ARN(外部管理的Lambda,EventBridge事件总线,SQS队列或SNS主题)
      onFailure: xxx:xxx:target #  目标的函数名称或ARN(外部管理的Lambda,EventBridge事件总线,SQS队列或SNS主题)
    events: # 触发此函数的事件
      - http: # 这将创建一个API网关HTTP端点,该端点可用于触发此函数。在“events/apigateway”了解更多
          path: users/create # 该端点的路径
          method: get # 此端点的HTTP方法
          cors: true # 为这个端点打开CORS,但是不要忘记在响应中返回正确的头
          private: true # 要求客户端在其请求的`x-api-key`标头中添加API密钥值
          authorizer: # An AWS API Gateway自定义授权函数
            name: authorizerFunc # 授权函数的名称(必须在此服务中)
            arn: xxx:xxx:Lambda-Name # 通过引用服务外的函数,可以用来代替名称
            resultTtlInSeconds: 0
            identitySource: method.request.header.Authorization
            identityValidationExpression: someRegex
            type: token # token or request. 确定authorizer函数的输入对象(auth令牌或请求事件对象). 默认是 token
      - httpApi: # HTTP API端点
          method: GET
          path: /some-get-path/{param}
          authorizer: # 可选
            name: someJwtAuthorizer # 在provider.httpApi.authorizers部分中定义的按名称授权者的引用
            scopes: # 可选
              - user.id
              - user.email
      - websocket:
          route: $connect
          routeResponseSelectionExpression: $default # 可选,设置此选项可启用websocket请求上的回调以进行双向通信
          authorizer:
            # name: auth    您可以使用“name”或“ arn”属性
            arn: arn:aws:lambda:us-east-1:1234567890:function:auth
            identitySource:
              - 'route.request.header.Auth'
              - 'route.request.querystring.Auth'
      - s3:
          bucket: photos
          event: s3:ObjectCreated:*
          rules:
            - prefix: uploads/
            - suffix: .jpg
          existing: true # 可选,如果您使用的是一个现有的存储桶
      - schedule:
          name: my scheduled event
          description: a description of my scheduled event's purpose
          rate: rate(10 minutes)
          enabled: false
          # 请注意,您只能使用input,inputPath或inputTransformer中的一种
          input:
            key1: value1
            key2: value2
            stageParams:
              stage: dev
          inputPath: '$.stageVariables'
          inputTransformer:
            inputPathsMap:
              eventTime: '$.time'
            inputTemplate: '{"time": <eventTime>, "key1": "value1"}'
      - sns:
          topicName: aggregate
          displayName: Data aggregation pipeline
          filterPolicy:
            pet:
              - dog
              - cat
          redrivePolicy:
              # (1) ARN
              deadLetterTargetArn: arn:aws:sqs:us-east-1:11111111111:myDLQ
              # (2) Ref (在同一CF堆栈中定义的资源)
              deadLetterTargetRef: myDLQ
              # (3) Import (在外部CF堆栈中定义的资源)
              deadLetterTargetImport:
                arn: MyShared-DLQArn
                url: MyShared-DLQUrl
      - sqs:
          arn: arn:aws:sqs:region:XXXXXX:myQueue
          batchSize: 10
          maximumRetryAttempts: 5
      - stream:
          arn: arn:aws:kinesis:region:XXXXXX:stream/foo
          batchSize: 100
          startingPosition: LATEST
          enabled: false
      - alexaSkill:
          appId: amzn1.ask.skill.xx-xx-xx-xx
          enabled: true
      - alexaSmartHome:
          appId: amzn1.ask.skill.xx-xx-xx-xx
          enabled: true
      - iot:
          name: myIoTEvent
          description: An IoT event
          enabled: true
          sql: "SELECT * FROM 'some_topic'"
          sqlVersion: beta
      - cloudwatchEvent:
          event:
            source:
              - 'aws.ec2'
            detail-type:
              - 'EC2 Instance State-change Notification'
            detail:
              state:
                - pending
          # 请注意,您只能使用input,inputPath或inputTransformer中的一种
          input:
            key1: value1
            key2: value2
            stageParams:
              stage: dev
          inputPath: '$.stageVariables'
          inputTransformer:
            inputPathsMap:
              eventTime: '$.time'
            inputTemplate: '{"time": <eventTime>, "key1": "value1"}'
      - cloudwatchLog:
          logGroup: '/aws/lambda/hello'
          filter: '{$.userIdentity.type = Root}'
      - cognitoUserPool:
          pool: MyUserPool
          trigger: PreSignUp
          existing: true # 可选,如果引用的是现有用户池
      - alb:
          listenerArn: arn:aws:elasticloadbalancing:us-east-1:12345:listener/app/my-load-balancer/50dc6c495c0c9188/
          priority: 1
          conditions:
            host: example.com
            path: /hello
      - eventBridge:
          # 使用默认的AWS事件总线
          schedule: rate(10 minutes)
          # 创建事件总线
          eventBus: custom-saas-events
          pattern:
            source:
              - saas.external
          # 重用现有的事件总线
          eventBus: arn:aws:events:us-east-1:12345:event-bus/custom-private-events
          pattern:
            source:
              - custom.private
          inputTransformer:
            inputPathsMap:
              eventTime: '$.time'
            inputTemplate: '{"time": <eventTime>, "key1": "value1"}'
          # using `inputs`
          pattern:
            source:
              - 'aws.ec2'
            detail-type:
              - 'EC2 Instance State-change Notification'
            detail:
              state:
                - pending
          input:
            key1: value1
            key2: value2
            stageParams:
              stage: dev
          # using `inputPath`
          pattern:
            source:
              - 'aws.ec2'
            detail-type:
              - 'EC2 Instance State-change Notification'
            detail:
              state:
                - pending
          inputPath: '$.stageVariables'
          # using `inputTransformer`
          pattern:
            source:
              - 'aws.ec2'
            detail-type:
              - 'EC2 Instance State-change Notification'
            detail:
              state:
                - pending
          inputTransformer:
            inputPathsMap:
              eventTime: '$.time'
            inputTemplate: '{"time": <eventTime>, "key1": "value1"}'
      - cloudFront:
          eventType: viewer-response
          includeBody: true
          pathPattern: /docs*
          origin:
            DomainName: serverless.com
            OriginPath: /framework
            CustomOriginConfig:
              OriginProtocolPolicy: match-viewer

layers:
  hello: # A Lambda层
    path: layer-dir # 必需,指向磁盘上的层内容的路径
    name: ${self:provider.stage}-layerName # 可选的,部署的Lambda层名
    description: Description of what the lambda layer does # 可选,发布到AWS的描述
    compatibleRuntimes: # 可选,此层兼容的运行时列表
      - python3.8
    licenseInfo: GPLv3 # 可选,一个字符串,用于指定许可证信息
    allowedAccounts: # 可选,允许访问此层的AWS账户ID列表。
      - '*'
    retain: false # 可选,默认为false。如果为真,则不会在创建新版本时删除层版本

# 您的“Functions”使用的“Resources”。原始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
  extensions:
    # 覆盖Framework创建的资源的属性或其他属性。
    # 参考 https://serverless.com/framework/docs/providers/aws/guide/resources#override-aws-cloudformation-resource 了解更多细节
    UsersCreateLogGroup:
      Properties:
        RetentionInDays: '30'

  # AWS CloudFormation堆栈应产生的“Outputs”。这允许在服务之间进行引用。
  Outputs:
    UsersTableArn:
      Description: The ARN for the User's Table
      Value:
        'Fn::GetAtt': [usersTable, Arn]
      Export:
        Name: ${self:service}:${opt:stage}:UsersTableArn # 如何在其他服务中使用 Fn :: ImportValue,请参考https://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html

# 参考

更新时间: 5/18/2020, 11:58:11 PM