无服务器框架:实现完整“基础架构即代码”的方法?

Posted

技术标签:

【中文标题】无服务器框架:实现完整“基础架构即代码”的方法?【英文标题】: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 用户池。有没有人这样做的例子或尝试?

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于无服务器框架:实现完整“基础架构即代码”的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Java游戏服(简单事件通知实现)

如何在 CloudFormation 中使用基础架构即代码实施 DynamoDB 全局二级索引

无服务器框架:输出编译的 CloudFormation

[Go] Golang练习项目-web客服系统即时通讯websocket项目go-fly

多云和混合云如何使用基础架构实现配置管理

本地自动化基础设施部署的良好解决方案?