GWLB 導入に関わる TGW の重要な設定「アプライアンスモード」について

記事タイトルとURLをコピーする

CI部 佐竹です。
本日は ELB の1つ Gateway Load Balancer と Transit Gateway を組み合わせて利用する場合の重要な設定項目である「アプライアンスモード」について記載します。

はじめに

Gateway Load Balancer が東京リージョンに対応したのは、今年2021年の2月25日のことです。

aws.amazon.com

このリリースを受けて、具体的に Gateway Load Balancer の導入を検討されているお客様もいらっしゃるかと存じます。本日はそんなお客様に「AWS Transit Gateway appliance mode(アプライアンスモード)」についてお伝えしたいと考えております。

なお、本ブログでは Gateway Load Balancer のことを GWLB と記載し、Gateway Load Balancer Endpoint のことを GWLBE と記載を省略します。また、AWS Transit Gateway を TGW と省略します。

Gateway Load Balancer と Transit Gateway を組み合わせた構成について

f:id:swx-satake:20210401164031p:plain

上図は、Gateway Load Balancer と Transit Gateway を組み合わせたAWS環境構成を表しています。

EC2 の構築先として VPC が VPC 01VPC 02 で2つ存在しており、Availability Zone (AZ) ごとに Subnet を構成しています。また GWLB VPC という VPC を上部に構築しており、その内部には GWLBE、GWLB、仮想ネットワークアプライアンス、NAT Gateway、Internet Gateway が構築されています。そしてこれら3つの VPC をつなぐのが TGW であり、それぞれの VPC には TGW Attachment がアタッチされています。

Private subnet 01-1a にある EC2 からインターネットへの経路

f:id:swx-satake:20210401164047p:plain

先にご紹介した構成図の状態で、画像左下に位置する Subnet(Private subnet 01-1a)内に存在する EC2 インスタンスからインターネットへ抜けるには、左側にある黄色い矢印のルートを通過します。

Private subnet 02-1c にある EC2 からインターネットへの経路

f:id:swx-satake:20210401164113p:plain

また、画像右下に位置する Subnet(Private subnet 02-1c)内に存在する EC2 インスタンスからインターネットへ抜けるには、右側にある黄色い矢印のルートを通過します。

これらの経路の差は「EC2 インスタンスが存在している AZ がどこにあるか」によって決まっています。つまり AZ-1a に存在している EC2 インスタンスが取る経路は AZ-1a に存在している GWLB とそのアプライアンスへとつながる( AZ-1c に存在している EC2 インスタンスが取る経路は AZ-1c に)ということです。

非対称ルーティングとアプライアンスモード

非対称ルーティングの発生条件

ではもし、この構成の状況で、Subnet(Private subnet 01-1a)内に存在する EC2 インスタンスから Subnet(Private subnet 02-1c)内に存在する EC2 インスタンスへと通信した場合にはどうなるでしょうか?

f:id:swx-satake:20210401164146p:plain

つまり、先の構成図の「左下にある EC2」から「右下にある EC2」への通信です。このような通信は可能でしょうか?

順を追ってみてみましょう。構成図で説明します。「行きの通信」は赤色の矢印、「戻りの通信」は青色の矢印で示しています。

f:id:swx-satake:20210401164200p:plain

まず、左下の EC2 インスタンスから発生した通信は、同じ AZ に位置する GWLBE へと到達し、次にネットワークアプライアンスへと到達。ここでインスペクションされた後、右下にある EC2 インスタンスへと到達します。

ここまでの通信は問題なく到達できます。

f:id:swx-satake:20210401164211p:plain

しかし、画像右下に位置する Subnet(Private subnet 02-1c)内に存在する EC2 インスタンスから外への通信は、同じ AZ に位置する GWLBE へと到達してしまうため、このタイミングで通信が AZ-1a から AZ-1c へと意図せず切り替わってしまいます。

そして AZ-1c にある ネットワークアプライアンス(ステートフルファイアウォール)は行きの通信を知りませんため、ここで非対称ルーティングとなりネットワークアプライアンスによりトラフィックがドロップ(破棄)されます。

非対称ルーティングの回避方法

先に説明しました非対称ルーティング、これを回避するオプションがあります。それが「AWS Transit Gateway appliance mode(アプライアンスモード)」です。

f:id:swx-satake:20210401164234p:plain
modify-transit-gateway-vpc-attachment

方法としては GWLB VPC にアタッチされている TGW Attachment に対して設定変更を行い ApplianceModeSupportenable にすることでこの問題を解消します。本設定の変更方法については後程改めて記載します。

GWLB VPC にアタッチされている TGW Attachment に対して設定変更を行う必要がある根拠を、公式ドキュメントから以下の通り引用致します。

VPC C の VPC アタッチメントの場合、アプライアンスモードのサポートを有効にして、レスポンストラフィックがソーストラフィックと同じ VPC C のアベイラビリティーゾーンにルーティングされるようにします。

https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/transit-gateway-appliance-scenario.html

※上記引用内の「VPC C」は GWLB VPC を指します。

アプライアンスモード有効時の経路

アプライアンスモードを有効化した場合には、「戻りの通信(青色矢印)」は以下の構成図の通りとなります。

f:id:swx-satake:20210401164247p:plain

アプライアンスモードを有効化した場合は「行きの通信」経路で利用した GWLBE を「戻りの通信」でも利用してくれるようになります。よって青色の矢印は「行きの通信」と同じ GWLBE を通過するため、経路は正常(対称)となります。

f:id:swx-satake:20210401164302p:plain

これにより、行きと戻りがそれぞれ別の Availability Zone であっても通信が可能となります。

アプライアンスモードの有効化

実際に「AWS Transit Gateway appliance mode(アプライアンスモード)」を有効にする方法をお伝えします。

まず、本設定はマネジメントコンソールから実施できません。

現在、Amazon VPC コンソールを使用してアプライアンスモードのサポートを有効にすることはできません。代わりに、create-Transit-Gateway-vpc-Attachment コマンドと modify transit-Gateway-vpc-Attachment コマンドを使用できます。

https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/transit-gateway-appliance-scenario.html

実際にマネジメントコンソールを見てみると、このように項目がありません。

f:id:swx-satake:20210401155923p:plain

そのため、CLI を利用して実行します。今回は AWS CloudShell を利用しました。

念のため記載しますと、今回設定するのは TGW Attachment に対してです。Transit Gateway への設定ではありませんのでご留意ください。

f:id:swx-satake:20210401164234p:plain

今回、本ブログで利用するコマンドは modify-transit-gateway-vpc-attachment です。

アプライアンスモードの現状確認

まずは現状を確認するため、先に describe-transit-gateway-attachments を実行したいと思います。

[cloudshell-user@ip-10-0-16-198 ~]$ aws ec2 describe-transit-gateway-attachments --transit-gateway-attachment-ids tgw-attach-003e1ba60feeb2a13
{
    "TransitGatewayAttachments": [
        {
            "TransitGatewayAttachmentId": "tgw-attach-003e1ba60feeb2a13",
            "TransitGatewayId": "tgw-07fa323e606351408",
            "TransitGatewayOwnerId": "123456789012",
            "ResourceOwnerId": "123456789012",
            "ResourceType": "vpc",
            "ResourceId": "vpc-0cec1869",
            "State": "modifying",
            "Association": {
                "TransitGatewayRouteTableId": "tgw-rtb-0a29d2dbb96a46dee",
                "State": "associated"
            },
            "CreationTime": "2021-04-01T05:27:51+00:00",
            "Tags": []
        }
    ]
}

なのですが、上記が結果です。Option の設定が見えません。これは describe-transit-gateway-attachments の仕様で、現状 Option 項目は describe-transit-gateway-attachments で確認できません。非常に残念です。

※補足:describe-transit-gateway-vpc-attachments であれば確認できることが後日判明しました。本コマンドについては「こちら」からご確認ください。

仕方がないので modify-transit-gateway-vpc-attachment で既存の設定を上書きすることでパラメータの確認とします。

f:id:swx-satake:20210401160005p:plain

既に有効となっている DNS Support を再度有効化する、つまり設定としては変更なしに結果を返してもらうことを期待します。コマンドに追加で --options DnsSupport=enable を指定して実行します。

[cloudshell-user@ip-10-0-16-198 ~]$ aws ec2 modify-transit-gateway-vpc-attachment --transit-gateway-attachment-id tgw-attach-003e1ba60feeb2a13 --options DnsSupport=enable
{
    "TransitGatewayVpcAttachment": {
        "TransitGatewayAttachmentId": "tgw-attach-003e1ba60feeb2a13",
        "TransitGatewayId": "tgw-07fa323e606351408",
        "VpcId": "vpc-0cec1869",
        "VpcOwnerId": "123456789012",
        "State": "modifying",
        "SubnetIds": [
            "subnet-3d0fe54a",
            "subnet-fc6d64ba"
        ],
        "CreationTime": "2021-04-01T05:27:51+00:00",
        "Options": {
            "DnsSupport": "enable",
            "Ipv6Support": "disable",
            "ApplianceModeSupport": "disable"
        }
    }
}

"ApplianceModeSupport": "disable" が無事に返却されました。なお、"ApplianceModeSupport" は初期値が "disable" になります。

余談になりますが "Ipv6Support": "disable" の項目は CLI のドキュメントに You cannot modify the IPv6 options. と記載があるように設定が変更できませんのでご注意ください。

アプライアンスモードの設定変更

それでは、実際に ApplianceModeSupportenable にしてみます(※ Enable と E を大文字にしないでください)。

[cloudshell-user@ip-10-0-128-196 ~]$ aws ec2 modify-transit-gateway-vpc-attachment --transit-gateway-attachment-id tgw-attach-003e1ba60feeb2a13 --options ApplianceModeSupport=enable
{
    "TransitGatewayVpcAttachment": {
        "TransitGatewayAttachmentId": "tgw-attach-003e1ba60feeb2a13",
        "TransitGatewayId": "tgw-07fa323e606351408",
        "VpcId": "vpc-0cec1869",
        "VpcOwnerId": "772359705507",
        "State": "modifying",
        "SubnetIds": [
            "subnet-3d0fe54a",
            "subnet-fc6d64ba"
        ],
        "CreationTime": "2021-04-01T05:27:51+00:00",
        "Options": {
            "DnsSupport": "enable",
            "Ipv6Support": "disable",
            "ApplianceModeSupport": "enable"
        }
    }
}

"ApplianceModeSupport": "enable" が無事に返却されました。これで設定変更は完了です。

まとめ

今回のブログでは、GWLB 導入時に関係する TGW の重要な設定「アプライアンスモード」について記載しました。VPC 間通信が存在し、かつ Availability Zone を跨いでの通信がある場合に、ネットワークアプライアンス(つまり GWLB )を経由する場合は本設定が重要な項目になりますため設計にあたっては十分に確認ください。

最後に関連する AWS の公式ブログを紹介して終わりにします。

aws.amazon.com

With the AWS Transit Gateway appliance mode, you have the ability to specify attachments that should forward network flows out of the same availability zone regardless of the flow’s direction and what availability zone it originated. The AWS Transit Gateway Appliance Mode ensures that network flows will be symmetrically routed to the same availability zone and network appliance.

[翻訳]
AWS Transit Gateway アプライアンスモードを利用することで、フローの方向とその通信を発生させたアベイラビリティーゾーンに関係なく、同じアベイラビリティーゾーンからネットワークフローを転送するように「TGW VPC アタッチメント」を指定することができます。(それにより)AWS Transit Gateway アプライアンスモードは、ネットワークフローが同じアベイラビリティーゾーンとネットワークアプライアンスに対称的にルーティングされることを保証します。

それでは、またお会いしましょう。

佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ

マネージドサービス部所属。AWS資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023 Japan AWS Top Engineers/2020-2023 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。