10

我遵循了一个优秀的指南(无服务器堆栈),它创建了一个带有反应前端的典型 CRUD 无服务器基础架构。它使用 AWS 的无服务器框架

我不喜欢的是,为了引导设置,需要在 GUI(主要是亚马逊的控制台界面)中进行大量手动点击。即设置不受版本控制并且不容易重现。使用 CI/CD 流程等进行扩展并不容易。在此示例中,需要手动设置以下资源:

  • AWS Cognito 用户池
  • AWS Cognite 用户池应用程序
  • AWS Cognito 联合身份池
  • AWS DynamoDB 实例
  • AWS S3 存储桶 (x3)(这也托管了前端
  • AWS CloudFront 分布
  • AWS Route53 区域文件

从代码构建的唯一资源是无服务器函数 (lambda) 本身以及 API 网关实例。这就是无服务器框架使用其serverless.yml文件所做的事情。但上述所有资源都不会自动创建。有时需要引用它们以使用它们的 ARN,但它们不是由 serverless.yml 配置创建的。在生产中运行这样的系统(严重依赖于通过 GUI 手动创建服务)似乎是有风险的。

我在想一个解决方案是使用 Terraform 或 Cloudformation。但是无服务器框架本身已经在使用 Cloudformation 来设置 Lambda,尽管还没有用于其他资源。那么如何消除这种差距呢?换句话说,如何在代码中重建无服务器堆栈中描述的整个设置?

让 CloudFormation 设置 Serverless 看起来很奇怪,而且可能是不可能的,然后它有自己的 Cloudformation 模板来设置 lambdas。扩展无服务器框架可能更有意义,不仅可以定义需要在serverless deploy. 有没有人这样做的例子或尝试?

4

3 回答 3

9

我同意这方面的文档会在这里提出一个很好的拉取请求

您是正确的,serverless在后台使用 CloudFormation。该框架确实通过resources您的serverless.yml.

我认为该框架的目的是您将使用常规的旧 CloudFormation 语法将其余这些资源(Cognito 的东西、S3 等)放在文件的resources:部分中。serverless.yml

例如,此文件将创建一个 DynamoDB 表和 S3 存储桶,以及无服务器功能:

service: aws-nodejs # NOTE: update this with your service name
provider:
  name: aws
  runtime: nodejs6.10
functions:
  hello:
    handler: handler.deletecustomer
    events:
      - http:
          path: /deletecustomer
          method: post
          cors: true
resources:
  Resources:
    tablenotes:
      Type: AWS::DynamoDB::Table
      Properties:
        AttributeDefinitions:
          - AttributeName: noteId
            AttributeType: S
          - AttributeName: userId
            AttributeType: S
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
          - AttributeName: noteId
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: '5'
          WriteCapacityUnits: '5'
    mysamplebucket:
      Type: AWS::S3::Bucket
      Properties:
        WebsiteConfiguration:
          IndexDocument: index.html
          ErrorDocument: error.html
        AccessControl: Private
        VersioningConfiguration:
          Status: Suspended

如果您是 CloudFormation 的新手,我还建议您看看CloudFormer

于 2017-10-21T13:19:35.723 回答
0

基于@Mike Patrick 的选项,增加了我对无服务器框架和其他类似的无服务器焦点工具的理解。

正如您所提到的,对于无服务器项目,涉及大量资源。将它们组合在一起并不是一件简单的工作。所以选择一个合适的工具是困难的。

Serverless frameworkCloudformationand相比Terraform,无服务器框架是无服务器专家, Cloudformation和 Terraform 是GP

Cloudformation和terraform完全Infrastructure as Code覆盖了大部分资源。

Serverless 框架是一个中间层,仅用于生成 Cloudformation 模板,该模板大多仅用于 serverless 相关资源。

全部都可以直接写在Cloudformation模板中,但是模板文件会很大,JSON/Yaml模板很难维护。只需几十行serverless.yml,Serverless 框架就可以生成上千行或上千行的 cloudformation 模板。它节省了大量处理cloudformation代码的时间。

让无服务器框架处理所有 AWS 资源是没有意义的,其他工具已经做得最好了。

无服务器框架仍在开发中,由于它的流行,许多开发人员每天都参与其中,为其添加功能。也许有一天你可以得到你需要的东西,但现在你必须在某些情况下将无服务器框架与 Cloudformation 或 Terraform 或其他工具混合在一起。

于 2017-10-22T20:22:02.170 回答
0

您肯定已经可以使用各种部署工具将几乎所有内容部署为 IaC(实际上我们每天都在工作)。

如果您碰巧主要使用无服务器;那么您可以选择无服务器框架 (SF) 之类的东西来抽象使用 CloudFormation (CF) 所固有的一些复杂性/不灵活性。无论 CF 能做什么,SF 都可以,但 SF 有一个插件系统,它允许运行代码来调用 API(例如,它可以允许您创建 CF 不支持的资源)。

于 2019-01-12T01:27:28.083 回答