Amazon-Ec2

AWS CloudFormation:VPC 預設安全組

  • December 8, 2020

我有一個 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"} ]
     }
}

在上面的程式碼片段中,我創建了一個“允許 ssh”安全組並將其分配給一個實例。如前所述,我的堆棧還創建了一個 VPC(此實例在其中啟動),這反過來又創建了一個預設安全組。不幸的是,由於這個組是由 AWS 自動創建的,它的組 ID 對堆棧不可用,因此無法通過 ID 引用。我最初認為該SecurityGroups屬性將是一個選項,因為這將允許我通過其名稱引用預設 SG default,. 但是,這不起作用,因為該SecurityGroups屬性僅適用於 EC2 安全組,而不適用於 VPC 安全組。

所以我被困住了。我已經在這方面向 AWS 支持提出了一個案例,但到目前為止,他們並沒有提供幫助。關於我如何做到這一點的任何想法?

好吧,事實證明,AWS 支持人員回复並通知我,他們認識到這是 CloudFormation 中的一個功能差距,並且它已作為功能請求送出給開發團隊。

因此,在實施此功能之前,解決方法是創建您自己的“預設”安全組,複製與“真實”預設 SG 相同的行為。不幸的是,由於這種設置的自引用方面,仍然不可能在一個單一的堆棧部署中進行。另一種方法是部署一次堆棧,而不為您的實例分配預設安全組。然後,一旦創建了堆棧(並且您有機會看到預設的安全組 ID 是什麼),您可以將該 SG ID 添加到您的實例中。

可以使用以下方式引用預設安全組:

{ "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 所提到的,這允許在單個堆棧部署中將入口/出口規則添加到VPC 的預設安全組。

我很確定自引用問題仍然會影響任何嘗試更改 VPC 的預設安全組上的任何其他屬性的嘗試。一個很好的例子是添加標籤或描述。如果您希望更改這些內容,則必須處理周圍存在的無關安全組。

引用自:https://serverfault.com/questions/544439