代码之家  ›  专栏  ›  技术社区  ›  Rohan Büchner

如何在CloudFormation中创建可重用的块

  •  1
  • Rohan Büchner  · 技术社区  · 7 年前

    场景:

    我有一个无服务器/云信息脚本,它将具有不同配置的相同代码重新部署到AWS中,作为lambdas,并通过API网关公开每个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值的变量。。。但是如何创建可重用的代码/配置块呢?

    4 回复  |  直到 7 年前
        1
  •  2
  •   jarmod    5 年前

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

    有一些工具可用于创建模板,例如。 AWS Cloud Development Kit ,则, Troposphere cfndsl

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

        2
  •  2
  •   Julio Faerman    7 年前

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

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

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

        3
  •  1
  •   DV82XL    4 年前

    嵌套堆栈很笨拙,因为您不一定只需要为单个资源使用整个堆栈。云层形成 Modules 会很好地解决这个问题( reference )。您甚至可以在单个模块中打包多个资源。

    您可以创建具有预打包属性的可重用模块,这些属性包括:

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

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

    Resources:
      LambdaResourceNG:
        Type: YourCompany::LambdaApi::FooBarApi
        Properties:
          ApiName: ng
      LambdaResource:
        Type: YourCompany::LambdaApi::FooBarApi
        Properties:
          ApiName: ke
    
        4
  •  0
  •   Hardik Shah    7 年前

    在Cloudformation中创建可重用的模板。有几件事你需要记住

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