首页 > 解决方案 > 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 个端口。我想进行可配置,所以可以使用相同的模板。我可以使它们参数化,但无法获得可配置的方法。

标签: amazon-web-servicesamazon-cloudformation

解决方案


不幸的是,仅使用 CloudFormation 无法实现这一目标。那将是动态数量的资源,这不是 CF 的一部分。

您最好的选择是:

  • 使用troposphere之类的工具动态生成将要使用的 CloudFormation 模板(因此具有动态数量的端口)
  • 在您的模板上使用AWS Lambda 支持的自定义资源,而不是指定SecurityGroupIngress. Lambda 函数将 SecurityGroupId 以及端口号作为参数。从那里,您可以调用 AWS API(使用 NodeJS、Python 或任何适用于 Lambda 的东西)并添加您想要的端口。不要忘记在更新模板时还包含用于更新和删除规则的代码。

推荐阅读