【发布时间】:2020-06-12 15:38:14
【问题描述】:
场景:
- 我们需要使用特定资源集创建 CloudFormation 堆栈 如 Lambda、API Gateway、DynamoDB、ElasticSearch 等。
- 这些堆栈需要部署在多个区域,才能更多 具体 5 个不同的地区,如俄勒冈州、悉尼等。
- 每个堆栈具有基于区域的不同配置,例如 每个区域的 DynamoDB 自动扩展值不同,并且 ElasticSearch 等的 Lambda 并发或实例类型是特定于区域的。
我们目前在做什么:
目前,我们有一个 CloudFormation 模板,其中为区域特定值定义了 Mappings。 即,我们使用condition functions(如 if-else)来检查当前 AWS 区域,并基于此选择该区域的映射。
问题:
- 随着需要支持越来越多的区域的大小 映射也在增加
- 对于添加的每个新资源,我们需要更新映射以添加 新资源的配置
- 支持多个区域和资源配置以及 条件变得难以控制
预期:
我们正在寻找一个全面的解决方案来支持使用同一 CloudFormation 模板的多个区域,并且需要摆脱映射并找到更易于管理的方式来处理特定于区域的配置。
非常感谢任何帮助。
【问题讨论】:
-
您是否考虑过使用 CDK 生成特定区域的模板?您可能会发现最终结果比具有许多条件的复杂模板更清晰、更易于维护。
-
谢谢。使用 CDK 是一个不错的选择,但它需要我们重写当前在 CloudFormation 中的整个基础架构。对于长期目标,我们可以考虑使用 CDK,但您能否提出一些减少当前平原的建议。
-
映射虽然容易膨胀,但本身就很好。如果您不想使用 CDK,请结合 AWS Organizations 查看堆栈集:aws.amazon.com/blogs/aws/…
-
如果映射有问题,那么非 CDK 选项可能是稍微分解模板并使用 jinja2 等模板引擎通过条件插入重新组合模板。起初这听起来可能很复杂,但实际上非常简单。您将拥有一个主模板,然后是一些较小的模板,然后您可以通过编程方式将它们注入主模板中的相关位置,并使用相关值,使用诸如
{% include %}之类的普通模板功能并传入运行时值。这个这样您现有的模板将基本保持不变。
标签: javascript amazon-web-services aws-lambda amazon-cloudformation devops