【问题标题】:How to create re-usable blocks in CloudFormation如何在 CloudFormation 中创建可重用的块
【发布时间】:2021-06-22 04:24:18
【问题描述】:

场景:

我有一个 serverless/cloudformation 脚本,它将具有不同配置的相同代码作为 lambda 重新部署到 AWS,并通过 API Gateway 公开每个 lambda。

到目前为止,我能够做到这一点的唯一方法是在同一个脚本中进行大量复制和粘贴……但它开始让我陷入困境……因此,因为我是一个完整的人AWS 的新手,浏览 AWS 文档和互联网产生了非常糟糕的结果,在回答这个问题时......我在这里试试运气。

在 cloudformation 脚本中:

"Resources":{  
   "LambdaResourceNG":{  
      "Type":"AWS::Serverless::Function",
      "Properties":{  
         "Handler":"some-handlername::foo::bar",
         "Runtime":"dotnetcore2.0",
         "Environment":{  
            "Variables":{  
               "PictureOptions__OriginalPictureSuffix":{  
                  "Fn::Join":[  
                     "",
                     [  
                        "_",
                        "ng",
                        "_",
                        {  
                           "Fn::FindInMap":[  
                              "Environments",
                              {  
                                 "Ref":"EnvironmentValue"
                              },
                              "PictureOptionsOriginalPictureSuffix"
                           ]
                        }
                     ]
                  ]
               },

            },
            "Events":{  
               "Bar":{  
                  "Type":"Api",
                  "Properties":{  
                     "Path":"/ng/bar",
                     "Method":"POST"
                  }
               },
               "Foo":{  
                  "Type":"Api",
                  "Properties":{  
                     "Path":"/ng/foo",
                     "Method":"POST"
                  }
               }
            }
         }
      },
   }

问题:

在上面的脚本块中..资源被称为LambdaResourceNG。如果我想拥有另一个资源...LambdaResourceKE...所有适当的部分都更改为KE。我将如何制作一个可以在这个 erm... 语言中重复使用的“功能”?

我已经发现了如何使用映射来根据一些 env 值交换变量...但是如何创建可重用的代码/配置块?

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudformation


    【解决方案1】:

    如果现有的 CloudFormation nested stacks 功能不够用,并且您需要真正的可编程性,那么最终的 CF 模板可以是更高级别流程的输出。

    有一些工具可用于创建模板,例如AWS Cloud Development KitTropospherecfndsl

    另一个选项是从 CLI 驱动最终模板的创建。它不必特别复杂,只是其中包括模板引擎(例如Jinja2或车把)。然后,您可以对可重用模板片段的包含进行编程,将值动态注入这些片段,根据需要迭代循环,并发出最终的 CloudFormation 模板(或主模板和嵌套模板集)。

    【讨论】:

    • 哇,太完美了。我同意.. 将所有内容都放入一个文件中对我来说似乎非常混乱。在某些情况下,最初创建我的 lambda 时(我是 C# 开发人员)......它包含一个 serveless.tempate 文件......我最近才意识到它实际上是一个 CF 脚本。您链接的那两个模板工具似乎可以完成工作。再次感谢:)
    • 在提交到 troposphere 或 cfndsl 等模板生成器之前要验证的一件事是它们是最新的并支持您想要生成的 AWS 资源。这些工具通常落后于 AWS 的步伐。
    【解决方案2】:

    您可以使用 AWS::CloudFormation::Stack 资源类型将 CloudFormation 堆栈嵌套在另一个堆栈中。嵌套堆栈没有父级就不能存在,删除父级堆栈将删除所有嵌套堆栈。请注意,TemplateURL 必须指向 S3,这就是 aws cloudformation package CLI command 通过在那里上传本地文件并替换模板中的 URL 来提供帮助的地方。

    Cross-stack references 还有助于模块化模板。例如,“数据库网络”堆栈可以导出子网 ID 和其他值以供任何未来的数据库堆栈使用。请注意,模块化比合并文本更进一步,而是正确声明和管理资源生命周期关系。

    甚至可以使用StackSets 跨不同区域和帐户进一步组合堆栈。这在管理每个租户或子组织配置的应用程序时可能非常有用。这在“自助式 IT”中经常出现,可以使用 CloudFormation 与 AWS Service CatalogAWS Marketplace 等其他服务来实现。

    【讨论】:

      【解决方案3】:

      嵌套堆栈很笨拙,因为您不一定希望整个堆栈仅用于单个资源。 CloudFormation Modules 可以很好地解决这个问题 (reference)。您甚至可以将多个资源打包在一个模块中。

      您可以创建具有预打包属性的可重用模块,其中:

      1. 减少样板配置
      2. 执行公司范围内的标准

      模块部署到CloudFormation Registry,您公司中的任何人都可以在其中对其进行版本控制和使用。您可以使用模块中的参数来传递属性,就像使用标准 AWS 资源一样。然后,您可以像这样创建自定义模块:

      Resources:
        LambdaResourceNG:
          Type: YourCompany::LambdaApi::FooBarApi
          Properties:
            ApiName: ng
        LambdaResource:
          Type: YourCompany::LambdaApi::FooBarApi
          Properties:
            ApiName: ke
      

      【讨论】:

      • 哇哦!所以这是相当新的?不要以为这在问的时候就已经出来了。但我会牢记在心。感谢您对此的更新/新答案。
      • 是的,CF 模块于 2020 年底推出。我开始使用它们,到目前为止一切都很好!
      【解决方案4】:

      在 Cloudformation 中创建可重复使用的模板。有几点需要注意

      1. Use Nested stack:使用嵌套堆栈,您可以为每个 AWS 服务(即 VPC、LoadBalancer)创建一个小堆栈,您可以在其他项目中使用它
      2. Use Parameters : 尽可能使用参数
      3. Use Conditions : AWS Cloudformation 提供添加条件的解决方案,使用条件我们可以使用相同的模板来执行多个任务

      【讨论】:

        猜你喜欢
        • 2016-09-12
        • 1970-01-01
        • 2014-03-27
        • 2023-03-23
        • 2021-11-29
        • 2014-02-18
        • 2011-08-28
        • 2019-04-27
        • 1970-01-01
        相关资源
        最近更新 更多