我有一个(除其他外)cfn堆栈,创build一个VPC,几个安全组和一些EC2实例。 将在堆栈中创build的安全组分配给也由堆栈创build的实例是很简单的。 不过,我对默认的VPC SG感兴趣。
创buildVPC时(无论是通过GUI,通过云形态还是其他任何方式手动创build),AWS都会为该组中的任何实例创build一个默认安全组,其中包含“allow all”规则。
我想要做的是将这个默认安全组和其他几个SG一起分配给堆栈创build的实例。 事实certificate这比我预料的要困难得多。 这里有一些片段显示我正在做什么:
"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"} ] } }
在上面的代码片段中,我创build了一个“允许ssh”安全组并将其分配给一个实例。 如前所述,我的堆栈还创build了一个VPC(启动此实例),从而创build一个默认安全组。 不幸的是,由于这个组是由AWS自动创build的,所以它的组ID对堆栈是不可用的,使得不可能通过ID引用。 我最初认为SecurityGroups属性是一个选项,因为这将允许我通过其default名称引用默认SG。 但是,这不起作用,因为SecurityGroups属性仅适用于EC2安全组,而不适用于VPC安全组。
所以我卡住了 我已经打开了一个AWS支持这个案例,但到目前为止,他们没有帮助。 任何想法,我怎么能做到这一点?
引用默认安全组是可能的使用:
{ "Fn::GetAtt" : ["VPC", "DefaultSecurityGroup"] }
其中“VPC”是您的VPC资源名称。
使用AWS::EC2::SecurityGroupIngress和AWS::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所述,这允许在单个堆栈部署中将入口/出口规则添加到VPC的默认安全组。
我很确定自我指涉的问题仍然会影响任何更改VPC的默认安全组的任何其他属性的尝试。 一个很好的例子就是添加标签或描述。 如果你想改变这些东西,你将不得不面对周围的无关安全组织。
那么,事实certificate,AWS支持回复并通知我,他们认识到这是CloudFormation中的一个function差距,并且已经作为function请求提交给了开发团队。
因此,在实现此function之前,解决方法是创build自己的“默认”安全组,以复制与“真实”默认SG相同的行为。 不幸的是,由于这个设置的自引用方面,在一个单独的堆栈部署中仍然是不可能的。 另一种方法是一次部署堆栈,而不将缺省安全组分配给实例。 然后,一旦堆栈被创build(并且您有机会查看默认的安全组ID),您可以将SG ID添加到您的实例。