Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何从CloudFormation将创建的SecurityGroup分配给ELB?_Amazon Web Services_Amazon Elb_Amazon Cloudformation - Fatal编程技术网

Amazon web services 如何从CloudFormation将创建的SecurityGroup分配给ELB?

Amazon web services 如何从CloudFormation将创建的SecurityGroup分配给ELB?,amazon-web-services,amazon-elb,amazon-cloudformation,Amazon Web Services,Amazon Elb,Amazon Cloudformation,我有一个CloudFormation脚本,它生成一个SecurityGroup和一个ELB;我试图在ELB创建中引用SecurityGroup;以下是参考资料部分: "ELBSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Security group for the Arena dev stac

我有一个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创建中的属性

谢谢

Hmmm

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

基于,似乎
securitygroup
只能连接到专有网络中的负载平衡器

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

  • 将我的问题发布到,尝试从团队中的某个人那里得到答案
  • 使用AWS控制台、SDK或CLI工具以您想要的方式设置您的环境,然后使用该工具生成与您的环境匹配的CloudFormation模板

我也有同样的问题,但我决定,因为这只是初始设置,弹性负载平衡器可以独立于云计算进行管理,直到他们解决了这个问题。此外,cloud-former并不完全可靠,尤其是当您的安全组引用其他安全组时

我希望ID的GetAttr函数调用能起作用,但安全组不在GetAttr的受支持列表中:

为您的SecurityGroup尝试以下方法:

"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指令的方法会更好。

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

安全组可能是普通安全组,也可能是专有网络安全组;如果在普通组上执行
{“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设置为的任何内容的访问。

正如我提到的,解决方案是使用Fn::GetAtt。此功能现在支持SecurityGroup:

这在ELB上起作用:

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

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

这不是我想要的-您将流量限制为来自ELB的EC2实例;我正试图将流量限制在ELB本身,根据文档,这可以通过在其上附加一个安全组来实现。我找到了解决方法,请参阅下面我的(更新)答案-我只需要将安全组设为VPC组(通过为其分配VpcId),然后ELB使用{“Ref”:…}提取正确的值