[アップデート] Amazon VPC Flow LogsがTransit Gatewayをサポートしました

Transit Gatewayが絡むトラブルシューティングに大助かりな機能が来ました
2022.07.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Transit Gatewayのログが見たいな

こんにちは、のんピ(@non____97)です。

皆さんはTransit Gatewayのログが見たいなと思ったことはありますか? 私はあります。

VPC Flow Logsがあるじゃない」と思われるかもいるかもしれないですが、VPC内のログではなく、どのトラフィックがTransit Gatewayでどのようにルーティングされたかをログから確認したいのです。

そんな折、Amazon VPC Flow LogsがTransit Gatewayをサポートしたとアナウンスがありました。

AWS公式ブログも投稿されていますね。

早速調査してみたのでアップデート内容を紹介します。

いきなりまとめ

  • Transit GatewayのログをS3もしくは、CloudWatch Logsに出力できる
  • 基本的な使い勝手はVPCのVPC Flow Logsと同じ
    • 取得できる情報がTransit Gateway attachmentなど異なる
    • Deny / Allow のフィルターができないため、VPC及びオンプレミスネットワーク間で頻繁に通信が発生する場合はログ取得にかかる料金に注意
  • APIやAWS CLIはVPCにVPC Flow Logsを設定するときと同じ
    • クエリのパラメーターでTransit Gatewayを指定する

特徴

ユースケース

どのトラフィックがどのTransit Gateway attachmentからどのTransit Gateway attachmentに流れていったのかを簡単に確認することができるようになりました。

例えば、Direct Connect GatewayやSite-to-Site VPNとのTransit Gateway attachmentのログを確認すれば、オンプレミスネットワークとどのような種類のトラフィックが流れているのか簡単に把握することができます。

オンプレミスネットワークとの通信の場合、VPCのVPC Flow Logsでは「Transit Gateway attachmentに到達した or から来た」までしか分かりませんでした。今回のアップデートにより、「Transit Gatewayのどのアタッチメントにルーティングされたか」まで分かるようになりました。トラブルシューティングにもってこいですね。

Transit GatewayのVPC Flow LogsはS3もしくは、CloudWatch Logsに出力可能です。

出力したログに対してAthenaやQuickSight、SIEM on Amazon OS、CloudWatch Contributor Insightsなどを使えば、分析も捗ると思います。

なお、Transit GatewayのVPC Flow LogsはVPCのVPC Flow Logsとは異なり、Deny / Allow の概念がないため「許可された通信のみ」のようなフィルターはできません。そのため、VPC及びオンプレミスネットワーク間で頻繁に通信が発生する場合は、ログ取得の料金に注意が必要です。

どんなログが取れるの?

Transit GatewayのVPC Flow Logsで取得できる情報は以下の通りです。

フィールド 説明 バージョン
version フィールドが導入されたバージョンを示す
デフォルトのフォーマットは、すべてのバージョン2フィールドを、テーブルに表示されるのと同じ順序で含んでいる
2
tgw-id トラフィックが記録されているTransit GatewayのID 6
tgw-attachment-id トラフィックが記録されているTransit Gateway attachmentのID 6
srcaddr 受信トラフィックの送信元アドレス、またはTransit Gatewayの送信トラフィックのTransit GatewayのIPv4またはIPv6アドレス 2
dstaddr 送信トラフィックの宛先アドレス、またはTransit Gatewayの受信トラフィックのTransit GatewayのIPv4またはIPv6アドレス 2
srcport トラフィックの送信元ポート 2
dstport トラフィックの宛先ポート 2
protocol トラフィックのIANAプロトコル番号 2
packets フロー中に転送されたパケットの数 2
bytes フロー中に転送されたバイト数 2
start フローの最初のパケットが集約間隔内に受信された時刻(Unix秒単位)
パケットがTransit Gatewayで送信または受信されてから最大60秒かかる場合がある
2
end フローの最後のパケットが集約間隔内に受信された時刻(Unix秒単位)
パケットがTransit Gatewayで送信または受信されてから最大60秒かかる場合がある
2
packets-lost-no-route 経路が指定されていないために失われたパケット 6
packets-lost-blackhole ブラックホールによって失われたパケット 6
packets-lost-mtu-exceeded サイズが MTU を超えたために失われたパケット 6
packets-lost-ttl-expired TTLの超過により失われたパケット 6
tgw-src-vpc-account-id トラフィックの送信元VPCのAWSアカウントID 6
tgw-dst-vpc-account-id トラフィックの送信先VPCのAWSアカウントID 6
tgw-src-vpc-id 送信元VPCのID 6
tgw-dst-vpc-id 送信先VPCのID 6
tgw-src-subnet-id 送信元トラフィックのTransit Gateway attachmentのサブネットのID 6
tgw-dst-subnet-id 送信先トラフィックのTransit Gateway attachmentのサブネットのID 6
tgw-src-eni 送信元トラフィックのTransit Gateway attachmentのENIのID -
tgw-dst-eni 送信先トラフィックのTransit Gateway attachmentのENIのID -
tcp-flags TCPフラグのビットマスク値 3
type トラフィックの種類 3
region トラフィックが記録されるTransit Gatewayのリージョン 4
tgw-src-az-id トラフィックが記録されている送信元Transit Gateway attachmentのAZのID 6
tgw-dst-az-id トラフィックが記録されている送信先Transit Gateway attachmentのAZのID 6
tgw-pair-attachment-id トラフィックの送信先もしくは送信元のTransit Gateway attachmentのID -
log-status ロギングステータス -
flow-direction トラフィックがキャプチャされるTransitGateway attachmentを基準としたフローの方向 5
pkt-src-aws-service 送信元IPアドレスがAWSサービスの場合のsrcaddrのIPアドレス範囲のサブセットの名前 5
pkt-dst-aws-service 送信先IPアドレスがAWSサービス用の場合のdstaddrフィールドのIPアドレス範囲のサブセットの名前 5
resource-type Flow Logsリソースの種類 6
account-id 送信元Transit Gatewayの所有者のAWSアカウントID 2

参考 : Logging network traffic using Transit Gateway Flow Logs - Amazon VPC

バージョンが-になっているものは、2022/7/15時点でAWS公式ドキュメントには記載はなかったフィールドです。ログの内容からどのようなフィールドか判断しました。ドキュメントに反映されるのを気長に待ちましょう。

設定方法は?

設定は簡単で、マネージメントコンソールの場合はTransit Gatewayを選択してVPCの時と同じようにFlow Logsを設定します。

AWS CLIやAPIもVPCにVPC Flow Logsを設定するときと同じです。クエリのパラメーターでTransit Gatewayを指定します。

例えば、create-flow-logsの場合は、--resource-typeTransitGatewayもしくはTransitGatewayAttachmentを指定します。

やってみた

検証の構成

検証の構成は以下の通りです。

構成図

Transit GatewayのVPC Flow LogsをCloudWatch Logsに出力します。

Transit GatewayのVPC Flow Logsの設定

それでは、Transit GatewayのVPC Flow Logsの設定をします。

Transit GatewayのVPC Flow Logsのリソース以外はAWS CDKでデプロイしておきます。使用したコードは以下リポジトリに保存しています。

デプロイ後、AWS CLIでTransit Gateway attachmentとENIを確認しておきます。

# Transit Gateway attachmentの確認
$ aws ec2 describe-transit-gateway-attachments \
    --filters Name=transit-gateway-id,Values=tgw-00df7ccffe7499669
{
    "TransitGatewayAttachments": [
        {
            "TransitGatewayAttachmentId": "tgw-attach-0ef3bd9b8e903d23e",
            "TransitGatewayId": "tgw-00df7ccffe7499669",
            "TransitGatewayOwnerId": "<AWSアカウントID>",
            "ResourceOwnerId": "<AWSアカウントID>",
            "ResourceType": "vpc",
            "ResourceId": "vpc-04b7534a255f8e615",
            "State": "available",
            "Association": {
                "TransitGatewayRouteTableId": "tgw-rtb-0742b8c2d7577db02",
                "State": "associated"
            },
            "CreationTime": "2022-07-15T05:09:20+00:00",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "Transit Gateway attachment for VPC A"
                }
            ]
        },
        {
            "TransitGatewayAttachmentId": "tgw-attach-0f61f249a2957f685",
            "TransitGatewayId": "tgw-00df7ccffe7499669",
            "TransitGatewayOwnerId": "<AWSアカウントID>",
            "ResourceOwnerId": "<AWSアカウントID>",
            "ResourceType": "vpc",
            "ResourceId": "vpc-0ad89adef4a35a569",
            "State": "available",
            "Association": {
                "TransitGatewayRouteTableId": "tgw-rtb-0742b8c2d7577db02",
                "State": "associated"
            },
            "CreationTime": "2022-07-15T05:09:38+00:00",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "Transit Gateway attachment for VPC B"
                }
            ]
        }
    ]
}

# VPC AのENIの確認
$ aws ec2 describe-network-interfaces \
    --filters Name=vpc-id,Values=vpc-04b7534a255f8e615
{
    "NetworkInterfaces": [
        {
            "Association": {
                "IpOwnerId": "amazon",
                "PublicDnsName": "ec2-54-80-234-195.compute-1.amazonaws.com",
                "PublicIp": "54.80.234.195"
            },
            "Attachment": {
                "AttachTime": "2022-07-15T05:10:48+00:00",
                "AttachmentId": "eni-attach-0aa99d34915b2dbde",
                "DeleteOnTermination": true,
                "DeviceIndex": 0,
                "NetworkCardIndex": 0,
                "InstanceId": "i-050d437da9aca3217",
                "InstanceOwnerId": "<AWSアカウントID>",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1a",
            "Description": "",
            "Groups": [
                {
                    "GroupName": "TgwStack-VPCAEC2InstanceSG6644E55D-A694RBJN5MSA",
                    "GroupId": "sg-0091fe96aebf7e3e9"
                }
            ],
            "InterfaceType": "interface",
            "Ipv6Addresses": [],
            "MacAddress": "0e:43:3e:65:c7:9f",
            "NetworkInterfaceId": "eni-099fbf827b3a9bda9",
            "OwnerId": "<AWSアカウントID>",
            "PrivateDnsName": "ip-10-0-1-8.ec2.internal",
            "PrivateIpAddress": "10.0.1.8",
            "PrivateIpAddresses": [
                {
                    "Association": {
                        "IpOwnerId": "amazon",
                        "PublicDnsName": "ec2-54-80-234-195.compute-1.amazonaws.com",
                        "PublicIp": "54.80.234.195"
                    },
                    "Primary": true,
                    "PrivateDnsName": "ip-10-0-1-8.ec2.internal",
                    "PrivateIpAddress": "10.0.1.8"
                }
            ],
            "RequesterManaged": false,
            "SourceDestCheck": true,
            "Status": "in-use",
            "SubnetId": "subnet-0d36c9766ce73a692",
            "TagSet": [],
            "VpcId": "vpc-04b7534a255f8e615"
        },
        {
            "Attachment": {
                "AttachmentId": "ela-attach-0085156eedfcaa199",
                "DeleteOnTermination": false,
                "DeviceIndex": 1,
                "InstanceOwnerId": "amazon-aws",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1a",
            "Description": "Network Interface for Transit Gateway Attachment tgw-attach-0ef3bd9b8e903d23e",
            "Groups": [],
            "InterfaceType": "transit_gateway",
            "Ipv6Addresses": [],
            "MacAddress": "0e:83:76:e4:ff:33",
            "NetworkInterfaceId": "eni-0a6667e3a8907f6ad",
            "OwnerId": "<AWSアカウントID>",
            "PrivateDnsName": "ip-10-0-1-24.ec2.internal",
            "PrivateIpAddress": "10.0.1.24",
            "PrivateIpAddresses": [
                {
                    "Primary": true,
                    "PrivateDnsName": "ip-10-0-1-24.ec2.internal",
                    "PrivateIpAddress": "10.0.1.24"
                }
            ],
            "RequesterId": "936118442230",
            "RequesterManaged": false,
            "SourceDestCheck": false,
            "Status": "in-use",
            "SubnetId": "subnet-0dae8cebfb7adebb3",
            "TagSet": [],
            "VpcId": "vpc-04b7534a255f8e615"
        }
    ]
}

# VPC BのENIの確認
$ aws ec2 describe-network-interfaces \
    --filters Name=vpc-id,Values=vpc-0ad89adef4a35a569
{
    "NetworkInterfaces": [
        {
            "Association": {
                "IpOwnerId": "amazon",
                "PublicDnsName": "ec2-3-85-109-13.compute-1.amazonaws.com",
                "PublicIp": "3.85.109.13"
            },
            "Attachment": {
                "AttachTime": "2022-07-15T05:10:48+00:00",
                "AttachmentId": "eni-attach-0de94693afa9d6dca",
                "DeleteOnTermination": true,
                "DeviceIndex": 0,
                "NetworkCardIndex": 0,
                "InstanceId": "i-081ad3820b4877273",
                "InstanceOwnerId": "<AWSアカウントID>",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1a",
            "Description": "",
            "Groups": [
                {
                    "GroupName": "TgwStack-VPCBEC2InstanceSG420D90C0-KC3YX4ICX4UL",
                    "GroupId": "sg-08e79665402a3c626"
                }
            ],
            "InterfaceType": "interface",
            "Ipv6Addresses": [],
            "MacAddress": "0e:c3:0f:d4:9c:1f",
            "NetworkInterfaceId": "eni-025ac6949e24ee9b3",
            "OwnerId": "<AWSアカウントID>",
            "PrivateDnsName": "ip-10-0-2-6.ec2.internal",
            "PrivateIpAddress": "10.0.2.6",
            "PrivateIpAddresses": [
                {
                    "Association": {
                        "IpOwnerId": "amazon",
                        "PublicDnsName": "ec2-3-85-109-13.compute-1.amazonaws.com",
                        "PublicIp": "3.85.109.13"
                    },
                    "Primary": true,
                    "PrivateDnsName": "ip-10-0-2-6.ec2.internal",
                    "PrivateIpAddress": "10.0.2.6"
                }
            ],
            "RequesterManaged": false,
            "SourceDestCheck": true,
            "Status": "in-use",
            "SubnetId": "subnet-09765604677404d2a",
            "TagSet": [],
            "VpcId": "vpc-0ad89adef4a35a569"
        },
        {
            "Attachment": {
                "AttachmentId": "ela-attach-0a2f734610f0cae51",
                "DeleteOnTermination": false,
                "DeviceIndex": 1,
                "InstanceOwnerId": "amazon-aws",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1a",
            "Description": "Network Interface for Transit Gateway Attachment tgw-attach-0f61f249a2957f685",
            "Groups": [],
            "InterfaceType": "transit_gateway",
            "Ipv6Addresses": [],
            "MacAddress": "0e:e4:51:df:0a:03",
            "NetworkInterfaceId": "eni-0a656e2b79bb80c54",
            "OwnerId": "<AWSアカウントID>",
            "PrivateDnsName": "ip-10-0-2-27.ec2.internal",
            "PrivateIpAddress": "10.0.2.27",
            "PrivateIpAddresses": [
                {
                    "Primary": true,
                    "PrivateDnsName": "ip-10-0-2-27.ec2.internal",
                    "PrivateIpAddress": "10.0.2.27"
                }
            ],
            "RequesterId": "936118442230",
            "RequesterManaged": false,
            "SourceDestCheck": false,
            "Status": "in-use",
            "SubnetId": "subnet-0f259fbeea4217fa4",
            "TagSet": [],
            "VpcId": "vpc-0ad89adef4a35a569"
        }
    ]
}

各リソースのID及びIPアドレスは以下の通りです。

リソース ID or IPアドレス
Transit Gateway ID tgw-00df7ccffe7499669
VPC A ID vpc-04b7534a255f8e615
VPC B ID vpc-0ad89adef4a35a569
VPC A の Transit Gateway attachment ID tgw-attach-0ef3bd9b8e903d23e
VPC B の Transit Gateway attachment ID tgw-attach-0f61f249a2957f685
VPC A の Transit Gateway attachment の ENI ID eni-0a6667e3a8907f6ad
VPC B の Transit Gateway attachment の ENI ID eni-0a656e2b79bb80c54
VPC A の Transit Gateway attachment の IPアドレス 10.0.1.24
VPC B の Transit Gateway attachment の IPアドレス 10.0.2.27
VPC A の EC2インスタンス のIP アドレス 10.0.1.8
VPC B の EC2インスタンス のIP アドレス 10.0.2.6

それでは、Transit GatewayにVPC Flow Logsの設定をしてあげます。

Transit Gatewayを選択し、フローログタブのフローログを作成をクリックします。

フローログの作成

送信先はCloudWatch Logsを指定します。送信先ロググループとIAMロールはAWS CDKで作成したものを指定します。

フローログ設定画面

ちなみに、IAMロールのポリシー及び、信頼されたエンティティは以下の通りです。

  • ポリシー
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "iam:PassRole",
                "Resource": "arn:aws:iam::<AWSアカウントID>:role/TgwStack-FlowLogsIAMRole0408C8AF-1ADCDDN69YBSX",
                "Effect": "Allow"
            },
            {
                "Action": [
                    "logs:CreateLogStream",
                    "logs:DescribeLogStreams",
                    "logs:PutLogEvents"
                ],
                "Resource": "arn:aws:logs:us-east-1:<AWSアカウントID>:log-group:TgwStack-FlowLogsLogGroupFA35AB6F-a8JHrqa7si62:*",
                "Effect": "Allow"
            }
        ]
    }

  • 信頼されたエンティティ

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "vpc-flow-logs.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }

VPC Flow Logsの設定が完了すると、以下のように表示されます。VPCにVPC Flow Logsを設定した時と同じですね。

FlowLogsの設定確認

ロググループを確認します。Transit Gateway attachmentごとにログストリームが作成されています。

ロググループの確認

動作確認

それではログが出力されるか確認してみます。

まず、VPC AのEC2インスタンスからVPC BのEC2インスタンスに対してpingを叩いてみます。

$ ping ip-10-0-2-6.ec2.internal -c 5
PING ip-10-0-2-6.ec2.internal (10.0.2.6) 56(84) bytes of data.
64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=1 ttl=254 time=1.88 ms
64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=2 ttl=254 time=0.494 ms
64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=3 ttl=254 time=0.536 ms
64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=4 ttl=254 time=0.658 ms
64 bytes from ip-10-0-2-6.ec2.internal (10.0.2.6): icmp_seq=5 ttl=254 time=0.547 ms

--- ip-10-0-2-6.ec2.internal ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4070ms
rtt min/avg/max/mdev = 0.494/0.824/1.889/0.536 ms

1分ほど待つと以下のように各ログストリームにログが出力されました。

tgw-attach-0ef3bd9b8e903d23e-all (VPC A の Transit Gateway attachment)

6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e - - - - - - - - - - - - - - - - - - 1657862234 1657862264 NODATA - 0 0 0 0 - us-east-1 - - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 0 0 1 5 420 1657862334 1657862338 OK IPv4 0 0 0 0 0 us-east-1 egress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 0 0 1 5 420 1657862334 1657862338 OK IPv4 0 0 0 0 0 us-east-1 ingress - -

tgw-attach-0f61f249a2957f685-all (VPC B の Transit Gateway attachment)

6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e - - - - - - - - - - - - - - - - - - 1657862234 1657862264 NODATA - 0 0 0 0 - us-east-1 - - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 0 0 1 5 420 1657862334 1657862338 OK IPv4 0 0 0 0 0 us-east-1 egress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 0 0 1 5 420 1657862334 1657862338 OK IPv4 0 0 0 0 0 us-east-1 ingress - -

protocolのフィールドが1になっていることから、ICMPのトラフィックであることが分かります。各Transit Gateway attachmentでEcho RequestとEcho Replyのトラフィックが記録されています。

protocolの値に対応するプロトコルは以下、IANAのサイトからご確認ください。

packetsもpingで指定した5になっていますね。bytesも1回のEcho Requestにつき84バイトを送信しているので、は5 × 84 = 420になっています。

なお、それぞれの一行目のログはNODATAとなっていることから、集約間隔内にトラフィックが流れなかった際のログです。

tcp/22にアクセスした際のログも確認してみましょう

VPC AのEC2インスタンスからVPC BのEC2インスタンスに対してcurlでtcp/22でアクセスしてみます。

$ curl -v telnet://ip-10-0-2-6.ec2.internal:22
*   Trying 10.0.2.6:22...
* Connected to ip-10-0-2-6.ec2.internal (10.0.2.6) port 22 (#0)
SSH-2.0-OpenSSH_7.4
^C

1分ほど待つと以下のログが出力されました。

tgw-attach-0ef3bd9b8e903d23e-all (VPC A の Transit Gateway attachment)

6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 22 56840 6 3 185 1657869028 1657869037 OK IPv4 0 0 0 0 - us-east-1 egress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 56840 22 6 5 268 1657869028 1657869037 OK IPv4 0 0 0 0 - us-east-1 ingress - -

tgw-attach-0f61f249a2957f685-all (VPC B の Transit Gateway attachment)

6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.1.8 10.0.2.6 56840 22 6 5 268 1657869028 1657869037 OK IPv4 0 0 0 0 - us-east-1 egress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.2.6 10.0.1.8 22 56840 6 3 185 1657869028 1657869037 OK IPv4 0 0 0 0 - us-east-1 ingress - -

protocolのが3(tcp)で、srcportdstport22になっていることから確かにtcp/22のアクセスが記録されています。

tcp/80にもアクセスしてみます。

VPC AのEC2インスタンスからVPC BのEC2インスタンスに対してcurlを叩いてみます。

$ curl -m 5 ip-10-0-2-6.ec2.internal
curl: (7) Failed to connect to ip-10-0-2-6.ec2.internal port 80 after 30 ms: Connection refused

ログは以下の通りです。

tgw-attach-0ef3bd9b8e903d23e-all (VPC A の Transit Gateway attachment)

6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 58872 80 6 1 60 1657873373 1657873373 OK IPv4 0 0 0 0 2 us-east-1 ingress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 80 58872 6 1 40 1657873373 1657873373 OK IPv4 0 0 0 0 - us-east-1 egress - -

tgw-attach-0f61f249a2957f685-all (VPC B の Transit Gateway attachment)

6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.2.6 10.0.1.8 80 58872 6 1 40 1657873373 1657873373 OK IPv4 0 0 0 0 - us-east-1 ingress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.1.8 10.0.2.6 58872 80 6 1 60 1657873373 1657873373 OK IPv4 0 0 0 0 2 us-east-1 egress - -

protocolのが3(tcp)で、srcportdstport80になっていることから確かにtcp/80が記録されています。また、VPC BのEC2インスタンスではtcp/80でLISTENしていません。そのため、リクエストのtcp-flags(SYN)に対して、レスポンスのtcp-flags-になっています。

最後にTransit GatewayのMTU以上のパケットを送信してみた時の挙動を確認してみます。

EC2インスタンスのMTUは9001です。

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 0e:43:3e:65:c7:9f brd ff:ff:ff:ff:ff:ff

一方、Transit GatewayのMTUは8500です。

ネットワーク接続の最大送信単位 (MTU) とは、接続を介して渡すことができる最大許容パケットサイズ (バイト単位) です。接続の MTU が大きいほど、より多くのデータを単一のパケットで渡すことができます。Transit Gateway は、VPC、Direct Connect ゲートウェイ、およびピアリングアタッチメント間のトラフィックに対して 8500 バイトの MTU をサポートします。VPN 接続を介したトラフィックは、1500 バイトの MTU を持つことができます。

Transit Gateway のクォータ - Amazon VPC

今回は、8000と8600のパケットサイズを送りつけたときの挙動を確認します。

# パケットサイズ8000の場合
$ sudo ping ip-10-0-2-6.ec2.internal -s 8000 -f -c 5
PING ip-10-0-2-6.ec2.internal (10.0.2.6) 8000(8028) bytes of data.

--- ip-10-0-2-6.ec2.internal ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.696/0.774/1.050/0.140 ms, ipg/ewma 0.812/0.907 ms

# パケットサイズ8600の場合
sh-4.2$ sudo ping ip-10-0-2-6.ec2.internal -s 8600 -f -c 5
PING ip-10-0-2-6.ec2.internal (10.0.2.6) 8600(8628) bytes of data.
.....
--- ip-10-0-2-6.ec2.internal ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 64ms

パケットサイズ8600の場合は、全てロストしていますね。

ログは以下の通りです。

tgw-attach-0ef3bd9b8e903d23e-all (VPC A の Transit Gateway attachment)

6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.1.8 10.0.2.6 0 0 1 5 40140 1657875298 1657875298 OK IPv4 0 0 0 0 0 us-east-1 ingress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0ef3bd9b8e903d23e <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0f61f249a2957f685 10.0.2.6 10.0.1.8 0 0 1 5 40140 1657875298 1657875298 OK IPv4 0 0 0 0 0 us-east-1 egress - -

tgw-attach-0f61f249a2957f685-all (VPC B の Transit Gateway attachment)

6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-0ad89adef4a35a569 vpc-04b7534a255f8e615 subnet-0f259fbeea4217fa4 subnet-0dae8cebfb7adebb3 eni-0a656e2b79bb80c54 eni-0a6667e3a8907f6ad use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.2.6 10.0.1.8 0 0 1 5 40140 1657875298 1657875298 OK IPv4 0 0 0 0 0 us-east-1 ingress - -
6 TransitGateway <AWSアカウントID> tgw-00df7ccffe7499669 tgw-attach-0f61f249a2957f685 <AWSアカウントID> <AWSアカウントID> vpc-04b7534a255f8e615 vpc-0ad89adef4a35a569 subnet-0dae8cebfb7adebb3 subnet-0f259fbeea4217fa4 eni-0a6667e3a8907f6ad eni-0a656e2b79bb80c54 use1-az6 use1-az6 tgw-attach-0ef3bd9b8e903d23e 10.0.1.8 10.0.2.6 0 0 1 5 40140 1657875298 1657875298 OK IPv4 0 0 0 0 0 us-east-1 egress - -

パケットサイズ8600のトラフィックは記録されませんでした。packets-lost-mtu-exceededに記録されると思いましたが、そう言うわけではなさそうです。

トラブルシューティングに大助かり

Amazon VPC Flow LogsがTransit Gatewayをサポートしたアップデートを紹介しました。

Transit Gatewayが絡むトラブルシューティングに大助かりな機能だと思います。Transit Gateway attachmentやTransit Gateway route tableが多くなると混乱することも多くなりがちです。思った通りの通信ができないなと思ったらTransit GatewayでFlow Logsの作成をしてみてはいかがでしょうか。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!