amazon-web-services - Cloudformation:如何根据用户输入配置资源
问题描述
当我遇到这种情况时,我正在为 beanstalk 编写 Cloudformation 模板。我的模板中有以下代码
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
SourceSecurityGroupId: !Ref ELBSecGroupForBeanStalk
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: !If
- Range
- !Ref AcessIPRange
- !Ref 'AWS::NoValue'
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
SourceSecurityGroupId: !If
- SecurityGroupRange
- !Ref CustomeSecurityGroup
- !Ref 'AWS::NoValue'
现在您可以看到我已经硬编码了端口 22 和 80,但是我如何使它们可配置。
假设一个用户来了,想添加 4 个或 6 个端口。我想进行可配置,所以可以使用相同的模板。我可以使它们参数化,但无法获得可配置的方法。
解决方案
不幸的是,仅使用 CloudFormation 无法实现这一目标。那将是动态数量的资源,这不是 CF 的一部分。
您最好的选择是:
- 使用troposphere之类的工具动态生成将要使用的 CloudFormation 模板(因此具有动态数量的端口)
- 在您的模板上使用AWS Lambda 支持的自定义资源,而不是指定
SecurityGroupIngress
. Lambda 函数将 SecurityGroupId 以及端口号作为参数。从那里,您可以调用 AWS API(使用 NodeJS、Python 或任何适用于 Lambda 的东西)并添加您想要的端口。不要忘记在更新模板时还包含用于更新和删除规则的代码。
推荐阅读
- variables - 将标签保存到变量中
- laravel - 从 laravel 方法显示一些视图
- python - 如何在python中及时转换像132这样的数字?
- database - 如何通过 REST API 从数据库流式传输数据?
- r - 在 tidyverse 中分离混合值并生成新列
- angular - Angular 不会使用新值更新 UI(仅在明确强制的情况下)
- azure-devops - Azure Pipelines 如何为“仅限手动”触发的版本筛选每个阶段的工件
- bash - 如何在 BASH 中为特定输入编写错误消息?
- c++ - 为什么 volatile 不是 sig_atomic_t 的一部分
- api - Instagram 的 Webhook 在评论广告时是否提供信息?