AWS CloudFormation:VPC默认安全组


16

我有一个cfn堆栈(除其他外),创建一个VPC,几个安全组和一些EC2实例。将在堆栈内创建的安全组分配给同样由堆栈创建的实例很简单。但是,我对默认的VPC SG感兴趣。

创建VPC后(无论是通过GUI手动,通过cloudformation还是其他方式手动创建),AWS都会为该组中的任何实例创建一个默认的安全组,并使用“允许所有”规则。

我想做的就是将此默认安全组以及其他几个SG分配给由堆栈创建的实例。事实证明,这比我预期的要困难得多。以下是一些片段,显示了我的情况:

"AllowSSHSecGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"Allow SSH from anywhere",
        "VpcId":{
          "Ref":"DevVPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":"22",
            "ToPort":"22",
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
},
"Instance001" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "ami-7eab224e",
        "InstanceType" : "m1.large",
        "AvailabilityZone" : "us-west-2a",
        "PrivateIpAddress" : "10.22.0.110",
        "SecurityGroupIds" : [ {"Ref" : "AllowSSHSecGroup"} ],
        "SubnetId" : { "Ref" : "PublicSubnet" },
        "KeyName" : "erik-key",
        "DisableApiTermination" : "false",
        "Tags" : [ { "Key": "Name", "Value": "Instance001"} ]
      }
}

在以上代码段中,我正在创建一个“ allow ssh”安全组并将其分配给实例。如前所述,我的堆栈还创建了一个VPC(在该实例中启动了VPC),该VPC又创建了一个默认的安全组。不幸的是,由于该组是由AWS自动创建的,因此其组ID在堆栈中不可用,从而无法通过ID进行引用。最初,我认为该SecurityGroups属性将是一个选项,因为这使我可以通过其名称来引用默认SG default。但是,这不起作用,因为该SecurityGroups属性仅适用于EC2安全组,不适用于VPC安全组。

所以我被卡住了。我已经为此提供了AWS支持的案例,但是到目前为止,它们并没有帮助。关于如何实现此目标的任何想法?

Answers:


19

可以使用以下方法引用默认安全组:

{ "Fn::GetAtt" : ["VPC", "DefaultSecurityGroup"] }

其中“ VPC”是您的VPC资源名称。

使用AWS::EC2::SecurityGroupIngressAWS::EC2::SecurityGroupEgress,可以增加此默认安全组的权限。

我认为这是您想要的:

"VPCDefaultSecurityGroupIngress": {
  "Type" : "AWS::EC2::SecurityGroupIngress",
  "Properties" : {
    "GroupId": { "Fn::GetAtt" : ["VPC", "DefaultSecurityGroup"] },
    "IpProtocol":"tcp",
    "FromPort":"22",
    "ToPort":"22",
    "CidrIp":"0.0.0.0/0"
  }
},

如@artbristol和@gabriel所述,这允许将Ingress / Egress规则添加到单个堆栈部署中VPC的默认安全组中。

我非常确定,自引用问题仍然会影响更改VPC的默认安全组上任何其他属性的尝试。一个很好的例子是添加标签或描述。如果您希望更改这些内容,则必须与周围的无关安全组打交道。


6

好吧,事实证明,AWS支持人员回答并告知我,他们认识到这是CloudFormation中的功能缺陷,并且已作为功能请求提交给开发团队。

因此,在实现此功能之前,解决方法是创建自己的“默认”安全组,该组复制与“真实”默认SG相同的行为。不幸的是,由于此设置具有自参考性,因此仍然不可能在单个堆栈部署中进行。另一种方法是只部署一次堆栈,而无需为您的实例分配默认安全组。然后,一旦创建了堆栈(您就有机会查看默认的安全组ID是什么),则可以将该SG ID添加到实例中。


2
我相信,如果您遵循此forums.aws.amazon.com/thread.jspa?messageID=466960并创建一个SecurityGroupIngress,以引用您的综合默认安全组,则可以在单个堆栈部署中获取所需的自我参考
artbristol

这是对的。例如,如果你在现有的VPC包含默认运行CloudFormer堆栈,自我指涉的安全组,它会生成一个模板,其中SecurityGroupIngress被分解为具有它自己的资源GroupIdSourceSecurityGroupId设置{ "Ref": "<SecurityGroupResource>" }
加布里埃尔

2
您是否知道这是否已更新?必须复制默认安全组很烦人。
Paul MacDougall 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.