SecuriryGroup ルールの一覧をどうしても表計算ソフトに貼り付けたいのでマネジメントコンソールから CSV でエクスポートする

表計算ソフトは表計算をするためにありますが表計算以外でも使い勝手がいいんですよね

コンバンハ、千葉(幸)です。

SecuriryGroup のルール一覧を Excel に貼り付けてチェックしたい、皆さんもそんな思いに駆られることもあるのではないでしょうか。(Excel でなく Google スプレッドシートやその他もろもろの表計算ソフトでも構わないので、そこは本筋ではありません。)

初めましての環境での設定値チェック、あるいは構築した環境でのダブルチェックなど、いまある SecuriryGroup ルールの一覧を手元で確認したいというケースを想定しています。

「マネジメントコンソールで全選択してスプレッドシートに値のみ貼り付けをしたのち、ズレた部分を手動で整える」という漢気溢れる手法でも実現できなくもないですが、なるべくならここで漢気は出したくありません。

  • SecuriryGroup の一覧を表示する
  • 一つの SecuriryGroup の詳細を表示する
  • インバウンドルールのタブを選択する
  • アウトバウンドルールのタブを選択する
  • 次の SecuriryGroup の詳細を表示する……

という手順が必要になることを考えると、漢気の在庫が早々に枯渇しそうです。

一昔前はこんな場合に取りうる手段は少なかったのですが、今ではマネジメントコンソールからの CSV でのエクスポートという便利な手段が用意されています。

その使い心地を確認しつつ、AWS CLI での出力も合わせて確認してみます。

まとめ

  • SecuriryGroup の一覧、SecuriryGroup のルール一覧はマネジメントコンソールから CSV でエクスポートできる
  • aws ec2 describe-security-group-rulesで似たようなことができるので項目をカスタマイズしたければこちらを使うのもあり

SecuriryGroup をマネジメントコンソールから CSV でエクスポートする

マネジメントコンソールの「EC2」もしくは「VPC」のサービス画面から SecuriryGroup の一覧を参照できます。そのいずれにおいても「セキュリティグループを CSV にエクスポート」というボタンが用意されています。

EC2_Management_Console_SG_Export

ボタンの横の「▼」を押下することで、以下のいずれかの操作を選択できます。

  • セキュリティグループを CSV にエクスポート
  • セキュリティグループのインバウンド / アウトバウンドルールを CSV にエクスポート

いずれも、対象は画面下部で選択した(チェックボックスでチェックが入った) SecuriryGroup となります。

SecuriryGroup 一覧のエクスポート

「セキュリティグループを CSV にエクスポート」から出力した結果のイメージは以下です。

SecuriryGroup_CSV

列の一覧は以下の通りであり、これはカスタマイズできません。

  • GroupId(セキュリティグループ ID)
  • GroupName(セキュリティグループ名)
  • VpcID(セキュリティグループが所属する VPC ID)
  • Description(セキュリティグループの説明)
  • OwnerId(セキュリティグループを所有する AWS アカウント)
  • InboundRulesCount(インバウンドルール数)
  • OutboundRulesCount(アウトバウンドルール数)
  • Tags(セキュリティグループに付与されたタグ一覧)

Tags は以下の形式で記載されています。

<タグキー1>:<値>,<タグキー2>:<値>,<タグキー3>:<値>...
(例)
Name:TestSG,Description:SG for Test,aws:cloudformation:stack-name:TestStack...

タグキーに:が含まれることもあるため、分割するときは注意が必要そうです。

SecuriryGroup ルール一覧のエクスポート

「セキュリティグループのインバウンド / アウトバウンドルールを CSV にエクスポート」から出力した結果のイメージは以下です。

SecuriryGroup_Export_CSV

列の一覧は以下です。同じくカスタマイズはできません。

  • GroupId(セキュリティグループ ID)
  • GroupName(セキュリティグループ名)
  • Type(インバウンド/アウトバウンドのタイプ)
  • IpProtocol(IP プロトコル。-1は「すべて」を表す)
  • FromPort(ポート範囲の開始)
  • ToPort(ポート範囲の終了)
  • IpRanges(IPv4 の IP 範囲)
  • Ipv6Ranges(IP v6 の IP 範囲)
  • PrefixListIds(プレフィックスリスト ID)
  • UserIdGroupPairs(相互参照するセキュリティグループ ID)

相互参照とはインバウンドにおける送信元、アウトバウンドにおける宛先として SecuriryGroup を指定することを指します。この CSV では相互参照先の セキュリティグループ名が表示されないため、スプレッドシートの VLOOKUP 関数を使用するなどして表示を工夫するとよいでしょう。

AWS CLI でルール一覧を出力する

ここまで確認した CSV の内容で多くのケースでは事足りるかと思います。とは言えもう少し項目をカスタマイズしたい、というケースもあるかもしれません。

特に SecuriryGroup ルール一覧の CSV はマネジメントコンソールでは参照できる「ルール ID」と「説明」が含まれていないため、この値を取りたいんだということもあるでしょう。そんな時には以下の AWS CLI コマンドを使用します。

以下の AWS CLI バージョンを使用して試してみます。

% aws --version
aws-cli/2.4.6 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off

ルールごとに ID が採番されるようになったのが 2021年7月のため、それ以降の AWS CLI のバージョンであればコマンドは実行できるかと思います。

JSON 出力のイメージ

特にフィルター等を使用せずそのまま JSON で出力した際のイメージは以下です。

% aws ec2 describe-security-group-rules --output json
{
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0f6931da807969f7c",
            "GroupId": "sg-0e397fe90b00bc997",
            "GroupOwnerId": "000000000000",
            "IsEgress": true,
            "IpProtocol": "-1",
            "FromPort": -1,
            "ToPort": -1,
            "CidrIpv4": "0.0.0.0/0",
            "Description": "hoge"
            "Tags": []
        },
        {
            "SecurityGroupRuleId": "sgr-0a8e56cc225ec542a",
            "GroupId": "sg-0bd23967c75e01f7d",
            "GroupOwnerId": "000000000000",
            "IsEgress": false,
            "IpProtocol": "-1",
            "FromPort": -1,
            "ToPort": -1,
            "ReferencedGroupInfo": {
                "GroupId": "sg-0bd23967c75e01f7d",
                "UserId": "000000000000"
            },
            "Tags": []
        },
 .....

相互参照の SecuriryGroup がある場合はReferencedGroupInfoの配下に記載されますが、それ以外の情報は同列で出力されます。

また、インバウンド/アウトバウンドルールのいずれであるかはIsEgressで表されます。falseであればインバウンドルール、trueであればアウトバウンドルールです。

テキスト出力のイメージ

出力形式としてtextを指定して実行してみます。以下のようにタブで区切られた結果が得られます。

% aws ec2 describe-security-group-rules --output text
SECURITYGROUPRULES      0.0.0.0/0                       -1      sg-0e397fe90b00bc997    000000000000    -1      True    sgr-0f6931da807969f7c   -1
SECURITYGROUPRULES                              -1      sg-0bd23967c75e01f7d    000000000000    -1      False   sgr-0a8e56cc225ec542a   -1
REFERENCEDGROUPINFO     sg-0bd23967c75e01f7d    000000000000
SECURITYGROUPRULES                              -1      sg-04b167c5ccef42abc    000000000000    -1      False   sgr-06535b8cc75681639   -1
REFERENCEDGROUPINFO     sg-0a597e5b2a9a1d86d    000000000000
SECURITYGROUPRULES      0.0.0.0/0                       80      sg-0e397fe90b00bc997    000000000000    tcp     False   sgr-02ceec822ac63ab5c   80
SECURITYGROUPRULES      0.0.0.0/0                       -1      sg-00f6367024c9125ff    000000000000    -1      True    sgr-0bb5823aacbd86ad4   -1
SECURITYGROUPRULES                              443     sg-02d9d038b65bf387a    000000000000    tcp     False   sgr-0d9a25d881c4d1dac   443
REFERENCEDGROUPINFO     sg-0a597e5b2a9a1d86d    000000000000
SECURITYGROUPRULES      0.0.0.0/0                       -1      sg-04f8fc8a14ea3c852    000000000000    -1      True    sgr-0e8fdc3a62ae87a13   -1
SECURITYGROUPRULES      0.0.0.0/0                       -1      sg-0a597e5b2a9a1d86d    000000000000    -1      True    sgr-04ca7c64f6d9f8d72   -1
SECURITYGROUPRULES              ::/0            -1      sg-074c66a9ced2409f3    000000000000    -1      True    sgr-07a28cd5d0eb52d6d   -1
...

行ごとにSECURITYGROUPRULESREFERENCEDGROUPINFOのいずれを示すかが表されており、それぞれの行の内訳を確認すると以下のようになっていました。

SECURITYGROUPRULES の行

Export_Text

行ごとに以下の内容がタブ区切りで出力されています。

  • CidrIpv4
  • CidrIpv6
  • Description
  • FromPort
  • GroupId
  • GroupOwnerId
  • IpProtocol
  • IsEgress
  • SecurityGroupRuleId
  • ToPort

マネジメントコンソールからエクスポートした CSV ではFromPortToPort-1が入るのは ICMP ルールの場合のみでしたが、ここではタイプが「すべてのトラフィック」の場合でも-1が入ります。 TCP や UDP の場合、0 - 65535で表されます。

REFERENCEDGROUPINFO の行

SecuriryGroup_ReferencedGroupInfo

該当行では以下の内容が出力されていました。

  • GroupId
  • UserId

GroupIdはあくまで相互参照先の SecuriryGroup ID を表すものなので、この行だけだとどの SecuriryGroup ルール ID に紐づく情報なのかが判別できませんね。


それぞれの結果を確認し、出力に含まれる項目がアルファベット順でソートされていることが分かりました。今回試行した環境ではPrefixListIdVpcPeeringConnectionId等を持つルールがありませんでしたが、それらがあればさらに列が増えて出力されます。

クエリを指定して項目を絞り込んで出力する

列がソートされてしまうと分かりづらいのと、すべての項目の出力は必要ないということで--queryでフィルタリングしてみます。

% aws ec2 describe-security-group-rules\
  --query 'SecurityGroupRules[*].[
      GroupId,
      SecurityGroupRuleId,
      IsEgress,
      IpProtocol,
      FromPort,
      ToPort,
      CidrIpv4,
      CidrIpv6,
      ReferencedGroupInfo.GroupId,
      Description
      ]'\
  --output text
sg-0e397fe90b00bc997    sgr-0f6931da807969f7c   True    -1      -1      -1      0.0.0.0/0       None    None    None
sg-0bd23967c75e01f7d    sgr-0a8e56cc225ec542a   False   -1      -1      -1      None    None    sg-0bd23967c75e01f7d    None
sg-04b167c5ccef42abc    sgr-06535b8cc75681639   False   -1      -1      -1      None    None    sg-0a597e5b2a9a1d86d    None
sg-0e397fe90b00bc997    sgr-02ceec822ac63ab5c   False   tcp     80      80      0.0.0.0/0       None    None    None
sg-00f6367024c9125ff    sgr-0bb5823aacbd86ad4   True    -1      -1      -1      0.0.0.0/0       None    None    None
sg-02d9d038b65bf387a    sgr-0d9a25d881c4d1dac   False   tcp     443     443     None    None    sg-0a597e5b2a9a1d86d    None
sg-04f8fc8a14ea3c852    sgr-0e8fdc3a62ae87a13   True    -1      -1      -1      0.0.0.0/0       None    None    None
sg-0a597e5b2a9a1d86d    sgr-04ca7c64f6d9f8d72   True    -1      -1      -1      0.0.0.0/0       None    None    None
sg-074c66a9ced2409f3    sgr-07a28cd5d0eb52d6d   True    -1      -1      -1      None    ::/0    None    None
sg-0bfa10eac66ac1610    sgr-08ec2d511f3c0d02c   True    -1      -1      -1      0.0.0.0/0       None    None    None

指定した通りの列順で出力されました。該当する値がない箇所はNoneと表示されます。

結果を適当なファイルに出力する、Mac であればパイプでpbcopyでクリップボードにコピーする、などしてスプレッドシートに転記すると、以下のように表示されます。

SecuriryGroup_Rules_Export

  • ヘッダーが無いので自分でつけてあげる必要がある
  • セキュリティグループ ID がバラバラで出てくるので並び替えが必要
  • セキュリティグループ名が結果に含まれていないのでどこかから引っ張ってくる必要がある

など課題はいくつかありますが、スプレッドシートなのでいくらでもやりようはあります。お好みの方法でいじくり回してください。

終わりに

SecuriryGroup ルールをまとめてチェックしたい時はなんやかんや表計算ソフト一番だよな(※個人の感想です)、という話でした。

マネジメントコンソールから CSV でエクスポートできるようになった明確な時期は定かではありませんが、2021年11月ごろだったかと記憶しています。大抵の場合はこの CSV で事足りるかと思うものの、物足りない場合は AWS CLI もご活用ください。

今回試したのはルール単位での出力です。SecuriryGroup 単位での一覧を出力したい場合は以下コマンドを使うことになります。

CSV 出力できるようになったのが2021年11月ごろ(想定)、ルール単位での AWS CLI 出力ができるようになったのが 2021 年7月ごろだと考えると、それ以前はaws ec2 describe-security-groupsをうまくいじくり回してあげないと手元での確認が気軽にはできなかったということですね。いい時代になりました。

SecuriryGroup は何かとチェックする機会が多い項目だと思いますので、本エントリが参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。