Transit Gateway アタッチメントの接続先一覧を CSV 形式で出力してみた

2023.08.05

Transit Gateway アタッチメントがどこのアカウントの VPC に接続されているか確認したいので一覧を CSV で出力する機会がありましたので出力方法を紹介します。

私が欲しかったものまとめ

tgw.csvファイル書き出しコマンド

aws ec2 describe-transit-gateway-attachments\
  --query "TransitGatewayAttachments[].{\
    Name:Tags[?Key=='Name'] | [0].Value,\
    TGWID:TransitGatewayId,\
    TGWAID:TransitGatewayAttachmentId,\
    ResourceOwnerID:ResourceOwnerId,\
    ResourceID:ResourceId,\
    State:State,\
    CreateTime:CreationTime\
    }" --output json\
| jq -r '
    ["NameTag","TGWID","TGWAttachmentID","DistAccount","DistVPC-ID","Status","CreateDate"],
    ( .[] | [.Name, .TGWID, .TGWAID, .ResourceOwnerID ,.ResourceID ,.State ,.CreateTime]) | @csv' > tgw.csv

出力したファイルを Excel で開いた様子

作業過程と説明

aws ec2 describe-transit-gateway-attachmentsコマンドで Transit Gateway のアタッチメント情報を出力できます。

describe-transit-gateway-attachments — AWS CLI 2.13.7 Command Reference

出力内容確認

コマンドを実行して出力項目を確認します。

aws ec2 describe-transit-gateway-attachments

実行結果

{
    "TransitGatewayAttachments": [
        {
            "TransitGatewayAttachmentId": "tgw-attach-xxxxxxxxxxxxxx",
            "TransitGatewayId": "tgw-xxxxxxxxxxxxxx",
            "TransitGatewayOwnerId": "xxxxxxxxxxxxxx", # Transit Gateway がある AWS アカウント ID
            "ResourceOwnerId": "xxxxxxxxxxxxxx", # アタッチ先の AWS アカウント ID
            "ResourceType": "vpc",
            "ResourceId": "vpc-xxxxxxxxxxxxxx", # アタッチ先の VPC ID
            "State": "available",
            "Association": {
                "TransitGatewayRouteTableId": "tgw-rtb-xxxxxxxxxxxxxx",
                "State": "associated"
            },
            "CreationTime": "2023-01-01T01:00:00+00:00",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "xxxxxxxxxxxxxx" # Name タグがあれば表示
                }
            ]
        },
      --- 以下省略 ---

シンプルな JSON 形式に変換

実行結果の Key/Value を参考に一覧に必要な項目(Key)を見繕います。後続の処理を楽にするために Key は任意の名前に置き換えます。

aws ec2 describe-transit-gateway-attachments\
  --query "TransitGatewayAttachments[].{\
    Name:Tags[?Key=='Name'] | [0].Value,\
    TGWID:TransitGatewayId,\
    TGWAID:TransitGatewayAttachmentId,\
    ResourceOwnerID:ResourceOwnerId,\
    ResourceID:ResourceId,\
    State:State,\
    CreateTime:CreationTime\
    }" --output json

必要な項目のみのシンプルな JSON 形式で出力できるようになりました。必要な項目はお好みで調整してください。

実行結果

[
    {
        "Name": "xxxxxxxxxxxxxx",
        "TGWID": "tgw-xxxxxxxxxxxxxx",
        "TGWAID": "tgw-attach-xxxxxxxxxxxxxx",
        "ResourceOwnerID": "xxxxxxxxxxxxxx",
        "ResourceID": "vpc-xxxxxxxxxxxxxx",
        "State": "available",
        "CreateTime": "2023-01-01T01:00:00+00:00"
    },
    --- 以下省略 ---

CSV 形式へ変換

jqコマンドで CSV 形式へ変換してファイルに書き出します。

aws ec2 describe-transit-gateway-attachments\
  --query "TransitGatewayAttachments[].{\
    Name:Tags[?Key=='Name'] | [0].Value,\
    TGWID:TransitGatewayId,\
    TGWAID:TransitGatewayAttachmentId,\
    ResourceOwnerID:ResourceOwnerId,\
    ResourceID:ResourceId,\
    State:State,\
    CreateTime:CreationTime\
    }" --output json\
| jq -r '
    ["NameTag","TGWID","TGWAttachmentID","DistAccount","DistVPC-ID","Status","CreateDate"],
    ( .[] | [.Name, .TGWID, .TGWAID, .ResourceOwnerID ,.ResourceID ,.State ,.CreateTime]) | @csv' > tgw.csv

tgw.csv

"NameTag","TGWID","TGWAttachmentID","DistAccount","DistVPC-ID","Status","CreateDate"
"xxxxxxxxxxxxxxx","tgw-xxxxxxxxxxxxxx","tgw-attach-xxxxxxxxxxxxxx","121234578901","vpc-xxxxxxxxxxxxxx","available","2020-08-07T11:29:11+00:00"
"xxxxxxxxxxxxxxx","tgw-xxxxxxxxxxxxxx","tgw-attach-xxxxxxxxxxxxxx","345678912345","vpc-xxxxxxxxxxxxxx","available","2019-01-15T14:22:45+00:00"
"xxxxxxxxxxxxxxx","tgw-xxxxxxxxxxxxxx","tgw-attach-xxxxxxxxxxxxxx","789012345678","vpc-xxxxxxxxxxxxxx","available","2021-07-20T03:34:56+00:00"

書き出した CSV ファイルを Excel で開くとこの様な一覧になります。

以上が Transit Gateay アタッチメント一覧の取得方法でした。

CSV でなくても良いならより手軽な方法

jqで CSV 変換が煩わしかったり、とりあえず一覧を確認できれば良いときは--output tableで出力した結果でも十分かと思います。

aws ec2 describe-transit-gateway-attachments\
              --query "TransitGatewayAttachments[].{\
                Name:Tags[?Key=='Name'] | [0].Value,\
                TGWID:TransitGatewayId,\
                TGWAID:TransitGatewayAttachmentId,\
                ResourceOwnerID:ResourceOwnerId,\
                ResourceID:ResourceId,\
                State:State,\
                CreateTime:CreationTime\
                }" --output table

実行結果

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                             DescribeTransitGatewayAttachments                                                                                                    |
+---------------------------+----------------------------+------------------+-----------------+------------+------------------+---------------------+
|        CreateTime         |            Name            |    ResourceID    | ResourceOwnerID  |   State    |      TGWAID      |        TGWID        |
+---------------------------+----------------------------+------------------+-----------------+------------+------------------+---------------------+
|  2020-03-20T10:09:15+00:00|  xxxxxxxxxxxxxxxxxx        |  vpc-xxxxxxxxxxxxxx  |  378945213450    |  available |  tgw-attach-xxxxxxxxxxxxxx |  tgw-xxxxxxxxxxxxxx  |
|  2021-07-26T11:32:21+00:00|  xxxxxxxxxxxxxxxxxx        |  vpc-xxxxxxxxxxxxxx  |  892031678459    |  available |  tgw-attach-xxxxxxxxxxxxxx |  tgw-xxxxxxxxxxxxxx  |
|  2022-11-05T06:24:15+00:00|  xxxxxxxxxxxxxxxxxx        |  vpc-xxxxxxxxxxxxxx  |  147580394267    |  available |  tgw-attach-xxxxxxxxxxxxxx |  tgw-xxxxxxxxxxxxxx  |

Transit Gateway アタッチメント経由の通信有無

Transit Gateway のアタッチメント一覧を出力できました。これらのアタッチメントを経由した通信が行われているのか確認するにはどうしたらよいでしょうか?

CloudWatch のメトリクスから通信量を確認する方法と、Transit Gateway のログを確認する 2 つの方法がございます。

CloudWatch メトリクス

CloudWatchのメトリクスから、TransitGateway → TransitGatewayAttachiment ごとを選択します。Transit Gateway アタッチメント ID で検索してフィルタできます。

メトリクス名は BytesIn/Out か、PacketsIn/Out の値からアタッチメント毎の通信量はチェックできます。ですが、アクセスがない状態でどの程度の通信量が発生しているかわかりません。確認するとしたら、他と比べて通信量が多い、少ない、長い期間でみたときに通信量が跳ねているアタッチメント ID は何かしらの通信で利用されている可能性があります。

Transit Gateway Flow Logs

通信内容を確認したい場合は Transit Gateway Flow Logs を設定し、S3へログを保存していただき Athena で通信ログを調査できます。

VPC へアタッチした経緯不明で通信内容から確認しないといけない状況でしたら、一定期間ログを収集していただき、通信ログを追う地道な確認作業でアタッチメント経由の通信が行われているか調査できます。

本当にログを確認するまで重要度が高いのか、作業工数を鑑みて実施するかはご判断ください。

おわりに

CSV 出力のコマンドが見つからなかったので参考までにご紹介しました。

AWS アカウントが数百あり、Transit Gateway で多くの VPC と VPC を接続をしていました。古くにアタッチしたものもあり、今でも必要なアタッチメントなのか棚卸しする際に一覧があると便利ということで出力してみました。

参考