Amazon web services 如何从CloudFormation将创建的SecurityGroup分配给ELB?
我有一个CloudFormation脚本,它生成一个SecurityGroup和一个ELB;我试图在ELB创建中引用SecurityGroup;以下是参考资料部分: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
"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模板
为您的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”:…}提取正确的值