目次
はじめに
こんにちは、ディーネットの山田です。ブログ執筆のネタがなく、小ネタで数稼ぎをします。
今回は、案件対応で利用するCloudFormationを作成していて、セキュリティグループのEgressを空にする必要があったのですが、一筋縄ではいかなかったので記事にしてみました。
CloudFormationとは
AWSを触っている方なら、補足する必要ないと思いますが。
AWSから提供されている、AWSインフラストラクチャをCloudFormationテンプレートと呼ばれるコードで管理できるサービスとなります。
リファレンスも公式から提供されているので、以下を確認しながらコードを書くことができます。
AWS resource and property types reference
本題
さて、前置きはこのあたりにして、実際にはまった事柄としては、CloudFormationでセキュリティグループを新規作成するコードを書いていたのですが、アウトバウンドルールを空で指定しているにも関わらず実行したらアウトバウンドルールが全許可されているではないですか。
実際のCloudFormationのコード
Resources:
BlogTestSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: blog-test-description
GroupName: blog-test
SecurityGroupEgress: []
SecurityGroupIngress: []
Tags:
- Key: Name
Value: blog-test
VpcId: vpc-XXXXXXXXXXXXXXXXX
実際の実行後のセキュリティグループ
なんと、アウトバウンドルールが全許可されている!!
原因について
「AWS::EC2::SecurityGroup」のリファレンスには、以下のように書かれております。
When you create a security group, if you do not add egress rules, we add egress rules that allow all outbound IPv4 and IPv6 traffic. Otherwise, we do not add them. After the security group is created, if you remove all egress rules that you added, we do not add egress rules, so no outbound traffic is allowed.
日本語に翻訳すると。
セキュリティグループを作成するときに、egressルールを追加しない場合は、すべてのアウトバウンドIPv4およびIPv6トラフィックを許可するegressルールを追加します。それ以外の場合は追加しません。セキュリティグループの作成後、追加したすべてのegressルールを削除すると、egressルールは追加されないので、送信トラフィックは許可されません。
セキュリティグループを作成するときに、Egressルールを追加しない場合は勝手に全許可のアウトバウンドルールを追加するよ。Egressルールを追加している場合は、そういった対応はしないからと。
つまり、セキュリティグループのアウトバウンドルールを空にしたければ、以下の順序を踏む必要がある。
- Egressルールにダミールールを入れてセキュリティグループを作成
- 変更セットで、Egressルールからダミールールを削除
では早速試してみる
以下の順序で試してみる。
- Egressルールにダミールールを入れてセキュリティグループを作成
- 変更セットで、Egressルールからダミールールを削除
Egressルールにダミールールを入れてセキュリティグループを作成
リファレンスに記載されているダミールールを入れてセキュリティグループを作成します。
Resources:
BlogTestSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: blog-test-description
GroupName: blog-test
SecurityGroupEgress:
- CidrIp: 127.0.0.1/32
IpProtocol: "-1"
SecurityGroupIngress: []
Tags:
- Key: Name
Value: blog-test
VpcId: vpc-XXXXXXXXXXXXXXXXX
この時点で、アウトバウンドルールは作成されているが、宛先がループバックアドレスなので、実質どこにも接続はできない。
変更セットで、Egressルールからダミールールを削除
宛先がループバックアドレスのルールを残しておいてもよいが、(元々の設計がアウトバウンドルールが空であれば)設計との乖離が出てしまうので、以下のようにEgressルールを空にして変更セットで実行する。
Resources:
BlogTestSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: blog-test-description
GroupName: blog-test
SecurityGroupEgress: []
SecurityGroupIngress: []
Tags:
- Key: Name
Value: blog-test
VpcId: vpc-XXXXXXXXXXXXXXXXX
ようやく、アウトバウンドルールが空になった
まとめ
冪等性という意味では、1回目の初回実行と2回目の実行で結果が変わってしまうので、よくない気もするが、セキュリティグループのアウトバウンドルールには癖がある前提で設計するしかなさそうですね。
どうしても、要件上セキュリティグループのアウトバウンドルールを空にする必要がある場合は、この癖を思い出して対応しようと思います。

プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ