# AWS-资源

如果您使用AWS作为您的服务的提供者,那么所有资源都是AWS Lambda在您的服务中所依赖的其他AWS基础设施资源,比如AWS DynamoDB或AWS S3。

使用Serverless Framework,您可以在serverless.yml中定义所需的基础结构资源,并轻松部署它们。

# 配置

使用aws提供程序通过 serverless.yml 部署到的每个阶段都是一个AWS CloudFormation堆栈。 这里定义了AWS Lambda函数及其事件配置,以及如何部署它们。当您添加资源时,这些资源将在 serverless deploy 时添加到CloudFormation堆栈中。

在名为resources的属性中定义AWS资源。这个属性中的内容是原始的CloudFormation模板语法,在YAML中,如下所示:

# serverless.yml

service: usersCrud
provider: aws
functions:

resources: # CloudFormation模板语法
  Resources:
    usersTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: usersTable
        AttributeDefinitions:
          - AttributeName: email
            AttributeType: S
        KeySchema:
          - AttributeName: email
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

您可以将任何类型的资源附加到您的CloudFormation堆栈中。你可以添加ResourcesOutputs。您还可以为资源模板中的敏感数据或可重用配置使用Serverless变量

注意:通过配置resources.Resources,提供资源。资源可能会意外覆盖框架生成的资源。要有意扩展此类资源,请使用resources.extensions

# AWS CloudFormation资源参考

为了在部署的CloudFormation模板中具有一致的命名,我们使用标准模式:

{Function Name}{Cloud Formation Resource Type}{Resource Name}{SequentialID, instanceId or Random String}

  • Function Name - 当函数名更改时,应该重新创建资源,这是可选的。这些资源也称为函数绑定
  • Cloud Formation Resource Type - 例如,S3Bucket
  • Resource Name - 特定资源的标识符,例如为S3存储桶配置的存储桶名称。
  • SequentialID, instanceId or Random String - 对于一些资源,我们需要添加可选的序列ID,Serverless instanceId(可通过$ {sls:instanceId}访问)或随机字符串来标识它们

Serverless 部署的所有资源名称都必须遵循此命名方案。唯一的例外(出于向后兼容的原因)是用于上传工件的S3 Bucket,以便可以将它们部署到您的函数中。

在本指南中,我们还使用了术语normalizedName或类似的术语。这意味着删除资源名称中不允许的字符,例如特殊字符。

提示:如果您不确定如何命名资源,您想从自定义资源中引用它,则可以执行 serverless package 命令。这将在 .serverless 文件夹中为您的服务创建CloudFormation模板(它名为cloudformation-template-update-stack.json)。 只需打开文件并检查生成的资源名称即可。

# 覆盖AWS CloudFormation资源

您可以覆盖特定的CloudFormation资源以应用您自己的选项(将所有此类扩展名放在 resources.extensions 部分中)。 例如,如果您要将AWS :: Logs :: LogGroup保留时间设置为30天,请使用上表的名称模板覆盖它。

覆盖基本资源时,当涉及 normalizedFunctionName 时,要记住两点:

  • 它应该以大写字母开头
  • -将被改为Dash,_将被改为Underscore

下面是一个例子:

functions:
  write-post:
    handler: handler.writePost
    events:
      - http:
          method: post
          path: ${self:service}/api/posts/new
          cors: true

resources:
  extensions:
    WriteDashPostLogGroup:
      Properties:
        RetentionInDays: '30'

扩展逻辑的定义方式如下:

资源属性 操作
CreationPolicy 设置为扩展值(如果存在)
DeletionPolicy 设置为扩展值(如果存在)
DependsOn 合并。 扩展值将添加到资源的DependsOn列表中
Metadata 合并。如果资源中存在同名元数据键,则将用扩展值替换该值
Properties 合并。如果资源中存在同名属性,则将用扩展值替换该值
UpdatePolicy 如果存在,设置为扩展值
UpdateReplacePolicy 如果存在,设置为扩展值
other 不支持。 如果您尝试扩展不受支持的属性,将引发错误

使用 resources.extensions 进行扩展仅适用于CloudFormation模板的 Resources 部分。

# 参考

更新时间: 5/18/2020, 9:45:48 PM