web-dev-qa-db-ja.com

AWS CloudFormation:VPCデフォルトセキュリティグループ

とりわけ、VPC、いくつかのセキュリティグループ、および少数のEC2インスタンスを作成するcfnスタックがあります。スタック内で作成されたセキュリティグループを、スタックによって作成されたインスタンスに割り当てるのは簡単です。ただし、私はデフォルトの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(このインスタンスが起動される場所)も作成します。これにより、デフォルトのセキュリティグループが作成されます。残念ながら、このグループはAWSによって自動的に作成されるため、そのグループIDはスタックで使用できず、IDで参照することはできません。最初は、SecurityGroupsプロパティがオプションであると考えていました。これにより、デフォルトのSGをその名前defaultで参照できるようになります。ただし、SecurityGroupsプロパティはEC2セキュリティグループ専用であり、VPCセキュリティグループではないため、これは機能しません。

だから私は行き詰まっています。私持っている AWSのサポートについてこれを提起しましたが、これまでのところ、役に立ちませんでした。これを達成する方法についてのアイデアはありますか?

16
EEAA

結局のところ、AWSサポートから返信があり、これはCloudFormationの機能ギャップであることを認識しており、機能リクエストとして開発チームに提出されていることがわかりました。

したがって、この機能が実装されるまでの回避策は、「実際の」デフォルトSGと同じ動作を複製する独自の「デフォルト」セキュリティグループを作成することです。残念ながら、このセットアップは自己参照型であるため、1つのスタック展開内で行うことはまだ不可能です。代わりの方法は、インスタンスにデフォルトのセキュリティグループを割り当てずに、スタックを1回デプロイすることです。次に、スタックが作成されたら(そして、デフォルトのセキュリティグループIDを確認する機会があったら)、そのSG IDをインスタンスに追加できます。

6
EEAA

デフォルトのセキュリティグループを参照するには、以下を使用します。

{ "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のデフォルトのセキュリティグループにIngress/Egressルールを追加できます。

自己参照の問題は、VPCのデフォルトのセキュリティグループの他のプロパティを変更しようとする試みに影響を与えると確信しています。この良い例は、タグや説明の追加です。これらを変更したい場合は、配置されている無関係なセキュリティグループに対処する必要があります。

19
IanBlenke