EEA*_*EAA 20 amazon-ec2 amazon-web-services amazon-cloudformation
我有一个 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"} ]
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码段中,我创建了一个“允许 ssh”安全组并将其分配给一个实例。如前所述,我的堆栈还创建了一个 VPC(在其中启动了此实例),进而创建了一个默认安全组。不幸的是,由于这个组是由 AWS 自动创建的,它的组 ID 对堆栈不可用,因此无法通过 ID 进行引用。我最初认为该SecurityGroups
属性将是一个选项,因为这将允许我通过其名称引用默认 SG,default
. 但是,这不起作用,因为该SecurityGroups
属性仅适用于 EC2 安全组,而不适用于 VPC 安全组。
所以我被困住了。我已经就此向 AWS 支持开立了一个案例,但到目前为止,他们并没有帮助。关于我如何做到这一点的任何想法?
小智 22
可以使用以下方法引用默认安全组:
{ "Fn::GetAtt" : ["VPC", "DefaultSecurityGroup"] }
Run Code Online (Sandbox Code Playgroud)
其中“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"
}
},
Run Code Online (Sandbox Code Playgroud)
正如@artbristol 和@gabriel 所提到的,这允许在单堆栈部署中将入口/出口规则添加到 VPC 的默认安全组。
我很确定自引用问题仍然会影响更改 VPC 的默认安全组上的任何其他属性的任何尝试。一个很好的例子是添加标签或描述。如果你想改变这些事情,你将不得不处理周围的无关安全组。
好吧,事实证明,AWS 支持回复并通知我,他们认识到这是 CloudFormation 中的功能差距,并且已作为功能请求提交给开发团队。
因此,在实施此功能之前,解决方法是创建您自己的“默认”安全组,复制与“真实”默认 SG 相同的行为。不幸的是,由于此设置的自我引用方面,仍然无法在单个堆栈部署中进行。另一种方法是部署堆栈一次,而不为您的实例分配默认安全组。然后,一旦创建了堆栈(并且您有机会看到默认的安全组 ID 是什么),您就可以将该 SG ID 添加到您的实例中。
归档时间: |
|
查看次数: |
18464 次 |
最近记录: |