【问题标题】:How do I assign a created SecurityGroup to an ELB from CloudFormation?如何从 CloudFormation 将创建的 SecurityGroup 分配给 ELB?
【发布时间】:2014-02-02 05:23:24
【问题描述】:

我有一个生成 SecurityGroup 和 ELB 的 CloudFormation 脚本;我正在尝试在 ELB 创建中引用 SecurityGroup;这是资源位:

    "ELBSecurityGroup" : {
        "Type" : "AWS::EC2::SecurityGroup",
        "Properties" : {
            "GroupDescription" : "Security group for the Arena dev stack",
            "SecurityGroupIngress" : [
                {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : { "Ref" : "OfficeIp" }}
            ]
        }
    },

    "ProjectLoadBalancerTest" : {
        "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
        "Properties" : {
            "AvailabilityZones" : { "Fn::GetAZs" : "" },
            "Instances" : [  ],
            "Listeners" : [ {
                "LoadBalancerPort" : "80",
                "InstancePort" : "12345",
                "Protocol" : "HTTP"
            } ],
            "HealthCheck" : {
                "Target" : {
                    "Fn::Join" : [ "", [ "HTTP:", "12345", "/status.json" ] ]
                },
                "HealthyThreshold" : "2",
                "UnhealthyThreshold" : "5",
                "Interval" : "60",
                "Timeout" : "30"
            },
            "SecurityGroups" : [
                { "Ref" : "ELBSecurityGroup" }
            ]
        }
    }

不幸的是,这失败了:

Invalid id: "sebelbtest2-ELBSecurityGroup-1F5Z5DIIVQKD1" (expecting "sg-...")

那么如何引用 ELBSecurityGroup 以用作 ELB 创建中的属性?

谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-elb amazon-cloudformation


    【解决方案1】:

    正如 mytwocents 所提到的,解决方案是使用 Fn::GetAtt。此函数现在支持安全组:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html

    这适用于 ELB:

    ...
    "SecurityGroups" : [
        { "Fn::GetAtt" : [ "ELBSecurityGroup", "GroupId" ] }
    ]
    ...
    

    注意。如果您要将其放入非默认 VPC,您还需要为安全组指定 VPC,并为 ELB 指定子网 ID。

    【讨论】:

      【解决方案2】:

      由于我的 CloudFormation 脚本都是在 VPC 中完成的,因此我发现了问题所在 - 我正在创建安全组,但没有为其指定 VpcId。

      安全组看起来要么是普通安全组,要么是 VPC 安全组;如果您在普通的上执行{ "Ref": "MySecurityGroup" },您将获得安全组名称,但不会获得 ID。如果您在 VPC 上执行 { "Ref": "MySecurityGroup" },您将返回 sg-abcdef id,这是 ELB 安全组参数所必需的。

      所以完整的答案是:

      "ELBSecurityGroup" : {
          "Type" : "AWS::EC2::SecurityGroup",
          "Properties" : {
              "GroupDescription" : "Security group for the ELB",
              "VpcId" : { "Ref" : "VpcId" },
              "SecurityGroupIngress" : [
                  {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : { "Ref" : "OfficeIp" }}
              ]
          }
      },
      "MyELB": {
          "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
          "Properties" : {
              "AvailabilityZones" : { "Fn::GetAZs" : "" },
              "Listeners" : [ {
                  "LoadBalancerPort" : "80",
                  "InstancePort" : 8000,
                  "Protocol" : "HTTP"
              } ],
              "SecurityGroups" : [ { "Ref" : "ELBSecurityGroup" } ]
          }
      }
      

      这一切都运行良好(前提是您所做的一切都在您的 VPC 中)并且在我的配置中,将成功限制对任何 OfficeIP 设置的访问。

      【讨论】:

        【解决方案3】:

        嗯……

        模板似乎返回的是安全组的名称而不是其 ID。

        基于the documentation,SecurityGroups 似乎只能附加到 VPC 中的负载均衡器。

        如果是我,我会做两件事之一(或两者都做):

        • 将我的问题发布到official AWS CloudFormation forum,尝试让该团队中的某个人回答。
        • 使用 AWS 控制台、开发工具包或 CLI 工具以您想要的方式设置您的环境,然后使用 CloudFormer 工具生成与您的环境匹配的 CloudFormation 模板。

        【讨论】:

        • 我想出了如何解决这个问题,请参阅下面的(更新的)答案 - 我只需要将安全组设为 VPC (通过为其分配 VpcId)然后 ELB 使用{“参考”:...}
        【解决方案4】:

        我遇到了同样的问题 - 但我决定,由于这只是用于初始设置,弹性负载均衡器可以与云形成分开管理,直到他们解决了这个错误。此外,云生成器并不完全可靠,尤其是当您的安全组引用其他安全组时。

        我希望对 ID 的 GetAttr 函数调用能够正常工作,但安全组不在 GetAttr 支持的列表中: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html

        【讨论】:

          【解决方案5】:

          为您的安全组试试这个:

          "ELBSecurityGroup" : {
              "Type" : "AWS::EC2::SecurityGroup",
              "Properties" : {
                  "GroupDescription" : "Security group for the Arena dev stack",
                  "SecurityGroupIngress" : [ {
                      "IpProtocol" : "tcp",
                      "FromPort" : 80,
                      "ToPort" : 80,
                      "SourceSecurityGroupOwnerId" : { "Fn::GetAtt" : [ "ProjectLoadBalancerTest", "SourceSecurityGroup.OwnerAlias" ] },
                      "SourceSecurityGroupName" : { "Fn::GetAtt" : [ "ProjectLoadBalancerTest", "SourceSecurityGroup.GroupName" ] }
                  } ]
              }
          },
          

          并从您的 ELB 定义中删除 "SecurityGroups"。这将允许从您的 ELB 到您的应用服务器的流量。

          您似乎还希望将 ELB 流量限制到您的办公室 IP。使用 apache 指令之类的东西会更好。

          【讨论】:

          • 这不是我想要的 - 你正在限制从 ELB 到 EC2 实例的流量;我正在尝试限制到 ELB 本身的流量,根据文档,可以通过将安全组附加到它来实现。
          猜你喜欢
          • 1970-01-01
          • 2018-04-08
          • 2020-10-20
          • 2021-10-27
          • 1970-01-01
          • 2014-08-08
          • 2017-03-01
          • 2019-12-02
          • 2021-05-30
          相关资源
          最近更新 更多