【问题标题】:Serverless Framework: ways to achieve full "infrastructure as code"?无服务器框架:实现完整“基础架构即代码”的方法?
【发布时间】:2018-04-02 08:49:26
【问题描述】:

我遵循了一个出色的指南 (Serverless Stack),该指南创建了一个带有反应前端的典型 CRUD 无服务器基础架构。它为 AWS 使用 Serverless Framework

我不喜欢引导设置,涉及到大量手动单击 GUI(主要是 Amazon 的控制台界面)。 IE。该设置不受版本控制,不易重现。使用 CI/CD 流程等进行扩展并不容易。在此示例中,需要手动设置以下资源:

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

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

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

让 CloudFormation 设置 Serverless 似乎很奇怪,而且可能是不可能的,然后它有自己的 Cloudformation 模板来设置 lambda。扩展无服务器框架可能更有意义,不仅可以定义需要在 serverless deploy 上创建的函数和 API 网关,还可以定义其他资源,例如 DynamoDB 或 Cognito 用户池。有没有人这样做的例子或尝试?

【问题讨论】:

    标签: amazon-cloudformation terraform serverless-framework serverless


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      Serverless 框架是一个中间层,仅用于生成 Cloudformation 模板,主要用于无服务器相关资源。

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

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

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

      【讨论】:

        【解决方案3】:

        我同意这方面的文档将成为出色的 pull request here

        serverless 在后台使用 CloudFormation 是正确的。该框架确实通过 serverless.ymlresources 键向您公开了底层 CloudFormation 机制。

        我认为the intent of the framework 是您将使用regular old CloudFormation syntax 将其余这些资源(Cognito 的东西、S3 等)放在您的serverless.yml 文件的resources: 部分中。

        例如,此文件将创建一个 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

        【讨论】:

          猜你喜欢
          • 2022-01-05
          • 1970-01-01
          • 2023-04-07
          • 2019-02-03
          • 2020-04-15
          • 2019-03-05
          • 1970-01-01
          • 2019-11-06
          • 1970-01-01
          相关资源
          最近更新 更多