【小ネタ】セキュリティグループのインバウンドルールをまとめて削除する

2021.04.30

データアナリティクス(DA)事業本部の川崎です。

先日、セキュリティグループを整理する機会があり、 これまではマネージメントコンソールから、個別に追加・削除していたのですが、 今回、AWS CLIを使って一括で削除する方法を試してみました。

1.コマンドのドキュメント確認

「revoke-security-group-ingress」のドキュメントには、 冒頭に、

To specify multiple rules in a single command use the --ip-permissions option

の記述があります。 複数のルールを指定する場合は、--ip-permissions を使ってください、とあります。

この --ip-permissions を指定することで、まとめて削除できそうです。

ただ、ドキュメントのExampleには、複数のルールを指定する方法が書かれていませんでした。この Example 2 の方法ですと、ルールを個別に削除していくことになります。

Example 2: To remove a rule using the IP permissions set

aws ec2 revoke-security-group-ingress \
    --group-id sg-026c12253ce15eff7 \
    --ip-permissions IpProtocol=icmp,FromPort=3,ToPort=4,IpRanges=[{CidrIp=0.0.0.0/0}]

まとめて削除する方法は、こちらのStackoverflowのやり取りが参考になりました。

2.セキュリティグループのIP permissions の内容を出力

まず、今回対象となるセキュリティグループのIP permissions を出力し、内容を確認します。

groupId="sg-0dxxxxxxxxxxxxxxx"
aws ec2 describe-security-groups --group-id $groupId --query "SecurityGroups[0].IpPermissions"
[
    {
        "FromPort": 5439,
        "IpProtocol": "tcp",
        "IpRanges": [
            {
                "CidrIp": "172.31.3.1/32"
            }
        ],
        "Ipv6Ranges": [],
        "PrefixListIds": [],
        "ToPort": 5439,
        "UserIdGroupPairs": []
    },
    {
        "FromPort": 22,
        "IpProtocol": "tcp",
        "IpRanges": [
            {
                "CidrIp": "172.31.0.1/32"
            },
            {
                "CidrIp": "172.31.1.1/32"
            },
            {
                "CidrIp": "172.31.2.1/32"
            }
        ],
        "Ipv6Ranges": [],
        "PrefixListIds": [],
        "ToPort": 22,
        "UserIdGroupPairs": []
    },
    {
        "FromPort": 443,
        "IpProtocol": "tcp",
        "IpRanges": [
            {
                "CidrIp": "172.31.4.1/32"
            }
        ],
        "Ipv6Ranges": [],
        "PrefixListIds": [],
        "ToPort": 443,
        "UserIdGroupPairs": []
    }
]

3.「revoke-security-group-ingress」を組み立て

次に、インバウンドルールを削除するコマンド「revoke-security-group-ingress」を組み立てていきます。 --cli-input-jsonオプションを使うことで、 先ほどの出力内容を変数に入れた上で、このように指定することができます。

groupId="sg-0dxxxxxxxxxxxxxxx"
json_ingress=$(aws ec2 describe-security-groups --group-id $groupId --query "SecurityGroups[0].IpPermissions")
echo $json_ingress
[ { "FromPort": 5439, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.3.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 5439, "UserIdGroupPairs": [] }, { "FromPort": 22, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.0.1/32" }, { "CidrIp": "172.31.1.1/32" }, { "CidrIp": "172.31.2.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 22, "UserIdGroupPairs": [] }, { "FromPort": 443, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.4.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 443, "UserIdGroupPairs": [] } ]
aws ec2 revoke-security-group-ingress --cli-input-json "{\"GroupId\": \"$groupId\", \"IpPermissions\": $json_ingress}"

上記のコマンドを実行し、セキュリティグループのインバウンドルールをまとめて削除できました。

aws ec2 describe-security-groups --group-id $groupId --query "SecurityGroups[0].IpPermissions"
[]

まとめ

--cli-input-jsonオプションを使う場合は、いつも「file://xxx.json」と、ファイルに保存したJSONを利用していましたが、 このようにシェルの変数として記述することもできるのですね。こっちの方が便利です、目からウロコでした。