如何在CloudFormation中将创建的安全组分配给ELB?

15
我有一个 CloudFormation 脚本,生成了一个 SecurityGroup 和一个 ELB;我试图在创建 ELB 时引用 SecurityGroup;以下是资源部分:
```html

我有一个 CloudFormation 脚本,生成了一个 SecurityGroup 和一个 ELB;我试图在创建 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创建中的属性呢?

谢谢!

5个回答

14

8
由于我的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的任何内容的访问。

1

嗯……

看起来模板返回的是安全组名称而不是它的ID。

根据文档,似乎SecurityGroups只能附加到VPC中的负载均衡器。

如果我是你,我会做以下两件事(或两者皆可):

  • 官方AWS CloudFormation论坛上发布我的问题,试图从团队成员那里得到答案。
  • 使用AWS控制台、SDK或CLI工具设置您想要的环境,然后使用CloudFormer工具生成与您的环境相匹配的CloudFormation模板。

我弄清楚了如何解决这个问题,请查看我的(更新后的)答案 - 我只需要将安全组设置为VPC组(通过分配VpcId),然后ELB就可以使用 { "Ref": ...} 提取正确的值。 - Seb

0

0

为了您的安全组,试试这个:

"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本身,根据文档,可以通过将安全组附加到ELB来实现。 - Seb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接