如何在 CloudFormation 中创建可重复使用的块
How to create re-usable blocks in CloudFormation
场景:
我有一个 serverless/cloudformation 脚本,可以将具有不同配置的相同代码作为 lambda 重新部署到 AWS,并通过 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
。我将如何制作一个 "function" 我可以在这种错误...语言中重复使用的东西?
我已经找到了如何使用映射根据某些环境值交换变量...但是如何创建 code/config 的可重用块?
如果现有的 CloudFormation nested stacks 功能不够用,而您需要真正的可编程性,那么最终的 CF 模板可以是更高级别流程的输出。
有一些工具可用于创建模板,例如AWS Cloud Development Kit, Troposphere and cfndsl.
另一种选择是从 CLI 驱动最终模板的创建。它不必特别复杂,只需包含模板引擎(如 jinja2 或 handlebars)即可。然后,您可以编写包含可重用模板片段的程序,将值动态注入这些片段,根据需要迭代循环,并发出最终的 CloudFormation 模板(或主模板和一组嵌套模板)。
您可以使用 AWS::CloudFormation::Stack resource type. Nested stacks cannot exist without their parent, deleting the parent stack will delete all nested stacks. Note that the TemplateURL
must point to S3, and that is where the aws cloudformation package
CLI command 帮助将 CloudFormation 堆栈嵌套在另一个堆栈中,方法是在此处上传本地文件并替换模板中的 URL。
Cross-stack references 也有助于模块化模板。例如,"database network" 堆栈可以导出子网 ID 和其他值以供将来使用的任何数据库堆栈使用。请注意,模块化比合并文本更进一步,而是正确声明和管理资源生命周期关系。
堆栈甚至可以使用 StackSets. This may be quite helpful when managing applications provisioned per tenant or sub-organization. This is frequently the case in "self-service IT" that can be achieved using CloudFormation with other services like AWS Service Catalog and AWS Marketplace.
跨不同区域和帐户进一步组合
在 Cloudformation 中创建可重复使用的模板。您需要记住几件事
Use Nested stack
:使用嵌套堆栈,您可以为每个 AWS 服务(即 VPC、LoadBalancer)创建一个小堆栈,您可以在其他项目中使用它
Use Parameters
: 尽量使用参数
Use Conditions
: AWS Cloudformation 提供添加条件的解决方案,使用条件我们可以使用相同的模板执行多个任务
嵌套堆栈很笨拙,因为您不一定需要整个堆栈只用于单个资源。 CloudFormation Modules would solve this problem nicely (reference)。您甚至可以将多个资源打包到一个模块中。
您可以创建具有预打包属性的可重用模块,其中:
- 减少样板配置
- 在公司范围内执行标准
模块部署到 CloudFormation Registry,您公司的任何人都可以在其中对其进行版本控制和使用。您可以使用模块中的参数来传递属性,就像传递标准 AWS 资源一样。然后您可以像这样创建自定义模块:
Resources:
LambdaResourceNG:
Type: YourCompany::LambdaApi::FooBarApi
Properties:
ApiName: ng
LambdaResource:
Type: YourCompany::LambdaApi::FooBarApi
Properties:
ApiName: ke
场景:
我有一个 serverless/cloudformation 脚本,可以将具有不同配置的相同代码作为 lambda 重新部署到 AWS,并通过 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
。我将如何制作一个 "function" 我可以在这种错误...语言中重复使用的东西?
我已经找到了如何使用映射根据某些环境值交换变量...但是如何创建 code/config 的可重用块?
如果现有的 CloudFormation nested stacks 功能不够用,而您需要真正的可编程性,那么最终的 CF 模板可以是更高级别流程的输出。
有一些工具可用于创建模板,例如AWS Cloud Development Kit, Troposphere and cfndsl.
另一种选择是从 CLI 驱动最终模板的创建。它不必特别复杂,只需包含模板引擎(如 jinja2 或 handlebars)即可。然后,您可以编写包含可重用模板片段的程序,将值动态注入这些片段,根据需要迭代循环,并发出最终的 CloudFormation 模板(或主模板和一组嵌套模板)。
您可以使用 AWS::CloudFormation::Stack resource type. Nested stacks cannot exist without their parent, deleting the parent stack will delete all nested stacks. Note that the TemplateURL
must point to S3, and that is where the aws cloudformation package
CLI command 帮助将 CloudFormation 堆栈嵌套在另一个堆栈中,方法是在此处上传本地文件并替换模板中的 URL。
Cross-stack references 也有助于模块化模板。例如,"database network" 堆栈可以导出子网 ID 和其他值以供将来使用的任何数据库堆栈使用。请注意,模块化比合并文本更进一步,而是正确声明和管理资源生命周期关系。
堆栈甚至可以使用 StackSets. This may be quite helpful when managing applications provisioned per tenant or sub-organization. This is frequently the case in "self-service IT" that can be achieved using CloudFormation with other services like AWS Service Catalog and AWS Marketplace.
跨不同区域和帐户进一步组合在 Cloudformation 中创建可重复使用的模板。您需要记住几件事
Use Nested stack
:使用嵌套堆栈,您可以为每个 AWS 服务(即 VPC、LoadBalancer)创建一个小堆栈,您可以在其他项目中使用它Use Parameters
: 尽量使用参数Use Conditions
: AWS Cloudformation 提供添加条件的解决方案,使用条件我们可以使用相同的模板执行多个任务
嵌套堆栈很笨拙,因为您不一定需要整个堆栈只用于单个资源。 CloudFormation Modules would solve this problem nicely (reference)。您甚至可以将多个资源打包到一个模块中。
您可以创建具有预打包属性的可重用模块,其中:
- 减少样板配置
- 在公司范围内执行标准
模块部署到 CloudFormation Registry,您公司的任何人都可以在其中对其进行版本控制和使用。您可以使用模块中的参数来传递属性,就像传递标准 AWS 资源一样。然后您可以像这样创建自定义模块:
Resources:
LambdaResourceNG:
Type: YourCompany::LambdaApi::FooBarApi
Properties:
ApiName: ng
LambdaResource:
Type: YourCompany::LambdaApi::FooBarApi
Properties:
ApiName: ke