2014-01-14 46 views
11

我有一个CloudFormation脚本来生成一个SecurityGroup和一个ELB;我试图在ELB创建中引用SecurityGroup;这里的资源位:如何将创建的SecurityGroup从CloudFormation分配给ELB?

"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创建的属性?

谢谢!

回答

4

由于我的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安全组的名称时出现。

根据the documentation,看起来SecurityGroups只能连接到VPC中的负载均衡器。

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

  • 后我的问题给official AWS CloudFormation forum,试图把它从别人对团队回答。
  • 使用AWS控制台,SDK或CLI工具以您想要的方式设置您的环境,然后使用CloudFormer工具生成一个与您的环境相匹配的CloudFormation模板。
+0

我想出了如何解决这个问题,请参阅下面的我的(更新的)答案 - 我只需要使安全组成为VPC之一(通过分配VpcId),然后ELB用{“Ref”拉出正确的值: ...} – Seb

0

试试这个你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指令这样做会更好。

+0

这不是我之后的事 - 你正在限制流量到ELB的EC2实例;我试图限制流量到ELB本身,根据文档可以通过附加安全组来实现。 – Seb

相关问题