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

时间:2018-04-12 12:46:12

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

情境:

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

到目前为止,我能够做到这一点的唯一方法是在相同的脚本中通过大量的复制和粘贴......但它开始让我走上墙......因此,我和#39 ; ma完成了对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。我将如何制作一个"功能"我可以在这种语言中重复使用吗?

我已经发现如何使用map根据某些env值替换变量......但是如何创建可重用的代码/配置块呢?

4 个答案:

答案 0 :(得分:1)

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

一种选择是从CLI驱动最终模板的创建。它不一定非常复杂,只需要包含模板引擎(如jinja2或把手)。然后,您可以编程包含可重用的模板片段,动态地将值注入到这些片段中,根据需要迭代循环,并发出最终的CloudFormation模板(或主模板和嵌套模板集)。

还有可用于创建模板的工具,例如Tropospherecfndsl

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

嵌套堆栈很笨拙,因为您不一定只需要单个资源的整个堆栈。 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

答案 3 :(得分:0)

在Cloudformation中创建可重复使用的模板。您需要牢记几件事

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