AWS CloudFormation:VPC 預設安全組
我有一個 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
屬性將是一個選項,因為這將允許我通過其名稱引用預設 SGdefault
,. 但是,這不起作用,因為該SecurityGroups
屬性僅適用於 EC2 安全組,而不適用於 VPC 安全組。所以我被困住了。我已經在這方面向 AWS 支持提出了一個案例,但到目前為止,他們並沒有提供幫助。關於我如何做到這一點的任何想法?
好吧,事實證明,AWS 支持人員回复並通知我,他們認識到這是 CloudFormation 中的一個功能差距,並且它已作為功能請求送出給開發團隊。
因此,在實施此功能之前,解決方法是創建您自己的“預設”安全組,複製與“真實”預設 SG 相同的行為。不幸的是,由於這種設置的自引用方面,仍然不可能在一個單一的堆棧部署中進行。另一種方法是部署一次堆棧,而不為您的實例分配預設安全組。然後,一旦創建了堆棧(並且您有機會看到預設的安全組 ID 是什麼),您可以將該 SG ID 添加到您的實例中。
可以使用以下方式引用預設安全組:
{ "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 的預設安全組上的任何其他屬性的嘗試。一個很好的例子是添加標籤或描述。如果您希望更改這些內容,則必須處理周圍存在的無關安全組。