无服务器框架:实现完整“基础架构即代码”的方法?
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 framework
与 Cloudformation
和 Terraform
,无服务器框架是无服务器专家,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.yml
的 resources
键向您公开了底层 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。
【讨论】:
以上是关于无服务器框架:实现完整“基础架构即代码”的方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CloudFormation 中使用基础架构即代码实施 DynamoDB 全局二级索引