Amazon Web Services ブログ
AWS Global Acceleratorのカスタムルーティングアクセラレータのご紹介
AWS Global Accelerator ではカスタムルーティングアクセラレータがサポートされるようになりました。新しく追加されたこの機能を利用することにより、Global Accelerator の利点を活用しつつ、独自のアプリケーションロジックを使用して複数のユーザーの宛先を特定の Amazon EC2 にルーティングできるようにします。
Global Accelerator は、 AWS グローバルネットワークインフラストラクチャを使用して、インターネットユーザーのパフォーマンスと可用性を向上させるネットワーキングサービスです。Global Accelerator の自動ルーティング最適化により、パケット損失、ジッタ、レイテンシーを一貫して低く抑えることができます。現在提供されているアクセラレータ機能は、ユーザーに最も近い正常なエンドポイントにトラフィックを自動的にルーティングします。これは、A/B テスト、ブルーグリーンのデプロイ、API アクセラレーション、ライブビデオのインジェストなど、さまざまなユースケースに使用できます。
しかし標準アクセラレータはトラフィックの負荷分散を目的として設計されているため、いくつかのユースケースで必要とされるように、アクセラレータの背後にある特定の宛先 EC2 に複数のユーザーをルーティングすることはできません。このユースケースの 1 つの例は、地理的な場所、プレイヤーのスキル、ゲーム構成などの要素に基づいて、ゲームサーバー上の 1 つのセッションに複数のプレイヤーを割り当てる、マルチプレイヤーゲームアプリケーションです。もう 1 つの例はVoIP、EdTech、ソーシャルメディアアプリケーションで、複数のユーザーを特定のメディアサーバーに割り当てて、音声、ビデオ、メッセージングセッションを開始します。
カスタムルーティングアクセラレータを使用すると、複数のユーザをアクセラレータの一意のポートに誘導できます。アクセラレータは、単一または複数の AWS リージョン内の特定の EC2 宛先プライベート IP アドレスとポートにポートをマッピングし、そこにトラフィックをルーティングします。この機能により、マッチメイキングサーバーやセッションボーダーコントローラー (リアルタイム通信ワークフローのために IP トラフィックフローを保護および規制するネットワーク要素) などのアプリケーションロジックに Global Accelerator を簡単に統合できます。カスタムルーティングアクセラレータを使用すると、AWS Global Accelerator をアプリケーションの単一エントリポイントとして活用しながら、任意の AWS リージョン内の特定の EC2 宛先にユーザトラフィックを確定的に送信できます。
このブログ記事では、カスタムルーティングアクセラレータの仕組みについて説明し、新しいアクセラレータをセットアップするためのステップバイステップガイダンスを提供します。
カスタムルーティングはどのように機能するか?
カスタムルーティングの仕組みをよりよく理解するために、1 つのリージョンに複数の EC2 インスタンスがあり、ポート 80 と 81 でアプリケーションを実行する例を見てみましょう。現在、カスタムアプリケーションロジックを使用して、特定のポートの EC2 インスタンスで実行されているセッションにユーザーを照合しています。たとえば次の図では、青色のユーザーがインスタンス A のポート 81 に接続しています。
次の図は、カスタムアプリケーションロジックがインターネットユーザーを特定の EC2 インスタンス上のポートにマッチさせる方法を示しています。
ユーザーをマッチさせる方法の 1 つは、インスタンスごとに Elastic IP アドレスを作成することです。しかしこれは煩雑であり、EC2 インスタンスがインターネットに公開されるため、セキュリティ上の脅威を引き起こす可能性があります。標準アクセラレータを追加することでこのリスクを軽減し、パフォーマンスを向上させることができます。しかしこれを行うと、必要な確定的ルーティング機能が失われます。
今回のGlobal Accelerator の機能追加により、カスタムルーティングアクセラレータを使用して、複数のユーザーを特定の EC2 インスタンスおよびポート(この例ではインスタンス A など)に確定的にルーティングできます。カスタムルーティングアクセラレータは、アクセラレータのポートから対応する EC2 の宛先への静的マッピングを自動的に作成します。ユーザーは、アクセラレータに割り当てられた 2 つのエニーキャスト IP アドレスのいずれかに接続できます。カスタムアプリケーションロジックは、この自動生成されたマッピングを取得して、複数のユーザーを正しいセッションにマッチさせることができます。Global Accelerator は、AWSのグローバルネットワークバックボーンを経由してすべてのアクセラレータのトラフィックを適切な宛先にルーティングします。次の図は、カスタムルーティングアクセラレータのポートマッピングを示し、ユーザが正しいインスタンスとポートにルーティングされる方法を示しています。
次に、カスタムルーティングアクセラレータを作成および設定する方法を見てみましょう。簡単にするために、1 つのリージョン内の /28 VPC サブネット内のポート 80 と 81 でアプリケーションを実行している 4 つの EC2 インスタンスがあると仮定します。
カスタムルーティングアクセラレータの作成、設定
カスタムルーティングアクセラレータを設定する方法を説明するために、AWS コマンドラインインターフェイス(CLI)を使用して手順を説明します。AWS マネジメントコンソールを使用するステップバイステップガイドについては、AWS Global Accelerator 開発者ガイドの「Getting Started with AWS Global Accelerator custom routing」を参照してください。
初期設定
カスタムルーティングアクセラレータを作成するときは、いくつかのリソースを使用して作業する必要があります。したがって、開始する前に、VPC 内にサブネットを作成し、次の手順を実行して、ポート 80 と 81 で listen するウェブサーバーで 4 つの EC2 インスタンスを起動します。
- AWS マネジメントコンソールの VPC コンソールで、選択した AWS リージョンの VPC にテストサブネットを作成します。サブネット /28 を作成し、サブネット ID を書き留めます。後で VPC をアクセラレータに追加するときに ID が必要になります。この例では、us-east-1 リージョンにサブネットを作成しました。詳細については、ドキュメントの「VPC とサブネットの使用」を参照してください。
- 作成したサブネットで、4 つの EC2 インスタンスを起動し、Apache または Nginx ウェブサーバーをセットアップします。この例では、サブネットで 4 つの EC2 インスタンスを起動しました。これを簡単にセットアップするには、起動時に EC2 ユーザーデータを使用することです(管理コンソールの詳細タブを参照)。Apache ウェブサーバーのサンプルスクリプトを含む詳細については、ドキュメントの「Linux インスタンスの起動時にコマンドを実行する」を参照してください。
EC2 インスタンスに関連付けられたセキュリティグループとネットワーク ACLで、エンドポイントグループで使用するポートでのトラフィックが許可されていることを確認します。この例では、TCP ポート 80 と 81 を使用しています。
これでアクセラレータを作成する準備ができました。
Step 1. カスタムルーティングアクセラレータを作成する
demoAccelerator という名前のカスタムルーティングアクセラレータを作成するには、次の CLI コマンドを実行します。コマンドと応答は、次のようになります。
$ aws globalaccelerator create-custom-routing-accelerator --name demoAccelerator { "Accelerator": { "AcceleratorArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917", "Name": "demoAccelerator", "IpAddressType": "IPV4", "Enabled": true, "IpSets": [ { "IpFamily": "IPv4", "IpAddresses": [ "1.2.3.4", "5.6.7.8" ] } ], "DnsName": " a1b2c3d4e5f6g7h8i.awsglobalaccelerator.com", "Status": "IN_PROGRESS", "CreatedTime": "2020-10-28T10:56:28-05:00", "LastModifiedTime": "2020-10-28T10:56:29-05:00" } }
Step 2. リスナーを作成する
次に、カスタムルーティングアクセラレータのリスナーを作成します。リスナーは、指定したポートに基づいて、ユーザーからのインバウンド接続を処理します。次の CLI コマンドを実行して、ポート 80 ~ 200 の接続を処理するアクセラレータのリスナーを作成します。リスナー上のこれらの各宛先ポートは、アクセラレータに指定するサブネットエンドポイント内の特定の EC2 を宛先とする固有のマッピングを持ちます。カスタムルーティングアクセラレータは、リスナーポートから宛先 EC2へのマッピングを自動生成することに注意してください。このマッピングにより、最大 121 の一意の宛先 EC2 インスタンスとポートにユーザーをルーティングできます。
リスナーを作成するコマンドと応答は、次のようになります。
$ aws globalaccelerator create-custom-routing-listener --accelerator-arn arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917 --port-ranges FromPort=80,ToPort=200
{
"Listener": {
"ListenerArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1",
"PortRanges": [
{
"FromPort": 80,
"ToPort": 200
}
]
}
}
Step 3. エンドポイントグループの作成
カスタムルーティングアクセラレータのエンドポイントグループは、単一のリージョン内の 1 つ以上の VPC サブネットにリクエストをルーティングします。VPC サブネットにはアクセラレータに関連付けるインスタンスが含まれています。エンドポイントグループごとに宛先 EC2 インスタンスでトラフィックを送信するポート範囲とプロトコルを指定します。Step 2 で作成したリスナーポートは、エンドポイントグループで定義されている宛先ポートに自動的にマッピングされます。
この例では、宛先 EC2 インスタンスが TCP トラフィックと UDP トラフィックの両方をポート 80 と 81 だけで受け入れるようにします。そこで、エンドポイントグループに 80 ~ 81 のポート範囲を設定し、両方のプロトコルを指定します。
コマンドと応答は、次のようになります。
$ aws globalaccelerator create-custom-routing-endpoint-group --listener-arn arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1 --endpoint-group-region us-east-1 --destination-configurations FromPort=80,ToPort=81,Protocols=TCP,UDP
{
"EndpointGroup": {
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
"EndpointGroupRegion": "us-east-1",
"DestinationDescriptions": [
{
"FromPort": 80,
"ToPort": 81,
"Protocols": [
"TCP",
"UDP"
]
}
],
"EndpointDescriptions": []
}
}
Step 4. カスタムルーティングエンドポイントグループにエンドポイントを追加する
次のStepでは、サブネットで実行される EC2 インスタンスにユーザーをルーティングできるように、VPC サブネットエンドポイントをエンドポイントグループに追加します。VPC サブネットエンドポイントには、アプリケーションをホストする宛先 EC2 インスタンスの IP アドレスが含まれます。カスタムルーティングアクセラレータは VPC サブネットのみをエンドポイントとしてサポートし、それらのサブネット内の EC2 インスタンスにのみトラフィックをルーティングすることに注意してください。
前述のサブネット ID を使用して、次のコマンドを実行してVPC サブネットをエンドポイントとして追加します。この例ではサブネット ID は subnet-0a08c428fc7d7af6e です。
$ aws globalaccelerator add-custom-routing-endpoints --endpoint-group-arn arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002 --endpoint-configurations EndpointId=subnet-0a08c428fc7d7af6e
{
"EndpointDescriptions": [
{
"EndpointId": "subnet-0a08c428fc7d7af6e"
}
],
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002"
}
コマンドを実行すると、次のエラーが発生することがあります。
“An error occurred (LimitExceededException) when calling the AddCustomRoutingEndpoints operation: There are not enough accelerator ports remaining to support the requested endpoints.”
これは、Step 2 で設定したリスナーポートの数が、一意の宛先 EC2 IP アドレスおよびポートの数よりも少ないためです。アクセラレータのリスナーポートの数を増やすか、CIDR 範囲が小さい VPC サブネットを使用してください。
Step 5. 特定の IP アドレスとポートがトラフィックを受信できるようにする
カスタムルーティングアクセラレータでは、VPC 内の IP アドレスとポートを有効にして、トラフィックを受信する必要があります。デフォルトではサブネット内のすべての IP アドレスと宛先ポートは、 Global Accelerator でトラフィックを受信できません。これにより、サブネット全体がパブリックインターネットに公開されなくなります。宛先を有効にしない限り、サブネット内の宛先 EC2 IP アドレスとポートへのすべてのトラフィックはエッジでドロップされます。
この例では、プライベートアドレスが 172.31.100.5、172.31.100.10、172.31.100.14、172.31.100.18 の 4 つの EC2 インスタンスがあります。次のコマンドを実行して、これらの 3 つの IP アドレスとポートがサブネット内のトラフィックを受信できるようにすることを選択します。これにより、172.31.100.10 を除くすべてのプライベート IP アドレスへのトラフィックが有効になります。
$ aws globalaccelerator allow-custom-routing-traffic --endpoint-group-arn arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002 --endpoint-id subnet-0a08c428fc7d7af6e --destination-addresses 172.31.100.5 172.31.100.14 172.31.100.18 --destination-ports 80 81
カスタムアプリケーションロジックはこれらの API を呼び出して、特定の宛先へのトラフィックを許可または拒否することもできます。たとえばイベントに備えて、トラフィックを受信できる宛先をスケールアップできます。各サブネットエンドポイントに新しい EC2 インスタンスを追加すると、カスタムアプリケーションロジックを使用してそれらの宛先へのトラフィックを許可できます。
Step 6. カスタムルーティングポートのマッピングを一覧表示する
Global Accelerator はカスタムルーティングアクセラレータを作成すると、トラフィックを許可しているかどうかにかかわらず、ポートからサブネット内のすべての宛先プライベート IP およびポートへのスタティックマッピングを自動的に生成します。ポートマッピングを取得して、特定の宛先 EC2 にユーザートラフィックをルーティングできます。アクセラレータを作成した後もマッピングは変更されないため、カスタムロジックはコマンドを実行してマッピングを一覧表示し、結果を保存できます。マッピングをリアルタイムで使用して、セッションの正しい宛先にユーザーを誘導できます。
次のコマンドは、すべてのポートマッピングを一覧表示します。
$ aws globalaccelerator list-custom-routing-port-mappings --accelerator-arn arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917
"PortMappings": [
{
"AcceleratorPort": 82,
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
"EndpointId": "subnet-0a08c428fc7d7af6e",
"DestinationSocketAddress": {
"IpAddress": "172.31.100.5",
"Port": 80
},
"Protocols": [
"TCP",
"UDP"
],
"DestinationTrafficState":"ALLOW"
},
{
"AcceleratorPort": 83,
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
"EndpointId": "subnet-0a08c428fc7d7af6e",
"DestinationSocketAddress": {
"IpAddress": "172.31.100.5",
"Port": 81
},
"Protocols": [
"TCP",
"UDP"
] ,
"DestinationTrafficState":"ALLOW"
},
{
"AcceleratorPort": 92,
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
"EndpointId": "subnet-0a08c428fc7d7af6e",
"DestinationSocketAddress": {
"IpAddress": "172.31.100.10",
"Port": 80
},
"Protocols": [
"TCP",
"UDP"
] ,
"DestinationTrafficState":"DENY"
},
{
"AcceleratorPort": 93,
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
"EndpointId": "subnet-0a08c428fc7d7af6e",
"DestinationSocketAddress": {
"IpAddress": "172.31.100.10",
"Port": 81
},
"Protocols": [
"TCP",
"UDP"
] ,
"DestinationTrafficState":"DENY"
},
{
"AcceleratorPort": 116,
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
…
…
"EndpointId": "subnet-0a08c428fc7d7af6e",
"DestinationSocketAddress": {
"IpAddress": "172.31.100.14",
"Port": 80
},
"Protocols": [
"TCP",
"UDP"
]
},
{
"AcceleratorPort": 117,
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
"EndpointId": "subnet-0a08c428fc7d7af6e",
"DestinationSocketAddress": {
"IpAddress": "172.31.100.14",
"Port": 81
},
"Protocols": [
"TCP",
"UDP"
]
},
{
"AcceleratorPort": 120,
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
"EndpointId": "subnet-0a08c428fc7d7af6e",
"DestinationSocketAddress": {
"IpAddress": "172.31.100.18",
"Port": 80
},
"Protocols": [
"TCP",
"UDP"
]
},
{
"AcceleratorPort": 121,
"EndpointGroupArn": "arn:aws:globalaccelerator::123456789012:accelerator/e0f0ecfa-85f2-4d9e-b0ba-adac33e32917/listener/24b106b1/endpoint-group/355bec295002",
"EndpointId": "subnet-0a08c428fc7d7af6e",
"DestinationSocketAddress": {
"IpAddress": "172.31.100.18",
"Port": 81
},
"Protocols": [
"TCP",
"UDP"
]
}
]
}
カスタムルーティングアクセラレータをテストする
1 つの /28 サブネットエンドポイントに 4 つの宛先 EC2 インスタンス(172.31.100.5、172.31.100.10、172.31.100.14、172.31.100.18)を持つカスタムルーティングアクセラレータを設定し、3 つの宛先へのトラフィックを有効にしました。次の図は 5 人のユーザーが Global Accelerator を介して VPC サブネットエンドポイントの EC2 インスタンスにルーティングされる方法を示しています。図に示されているカスタムルーティングポートマッピング情報は、アクセラレータのセットアップ Step 6 で説明したように、ListCustomRoutingPortMappings API 呼び出しを実行したときに返される応答から取得されます。
この図は、最後のユーザーを除く各ユーザーが、VPC サブネットでトラフィックを受信できる特定の IP アドレスとポートにルーティングされていることを示しています。最後のユーザーはトラフィックの受信を許可していない宛先に接続しようとしています。そのユーザーのトラフィックはエッジでドロップされ、トラフィックを受信しないサブネット内の宛先が保護されます。
Curl コマンドを使用して、ユーザトラフィックを受信できる各 EC2 インスタンス上のインデックスページの内容を確認できます。この例では、次に示すように、インスタンスメタデータを使用してプライベート IP アドレス、AWS リージョン、アベイラビリティーゾーンを返すように EC2 インスタンスを設定しました。
$ curl http://a1b2c3d4e5f6g7h8i.awsglobalaccelerator.com:82
Served by 172.31.100.5 in us-east-1 Region (us-east-1d AZ)
$ curl http://a1b2c3d4e5f6g7h8i.awsglobalaccelerator.com:116
Served by 172.31.100.14 in us-east-1 Region (us-east-1d AZ)
$ curl http://a1b2c3d4e5f6g7h8i.awsglobalaccelerator.com:117
Served by 172.31.100.14 in us-east-1 Region (us-east-1d AZ)
$ curl http://a1b2c3d4e5f6g7h8i.awsglobalaccelerator.com:92
User connection will timeout, since their traffic is dropped at the edge
カスタムルーティングアクセラレータをワークフローに統合する
次に、カスタムルーティングアクセラレータをワークフローに統合する方法を見てみましょう。次の図に、簡単なワークフローの例を示します。
この例では、マッチメーカーなどのカスタムアプリケーションロジックは、特定の宛先 EC2 の IP およびポートにルーティングするユーザーを照合します。アプリケーションロジックは、 ListCustomRoutingPortMappings API コールを使用して、アクセラレータ IP アドレスとポート、および宛先 IP アドレスとポート間の事前構成済みの静的マッピングを取得および格納します。これにより、アプリケーションに接続するすべてのユーザーが Global Accelerator を介して、セッションが実行されている正しい宛先 EC2 インスタンスにルーティングされます。
ワークフローは次のようになります。
- ユーザーはアプリケーションに接続します。
- カスタムアプリケーションロジックは最初に次の手順を実行して、あるユーザと、同じ宛先にルーティングする必要がある他のユーザーを照合します。
- 利用可能で VPC サブネットエンドポイントでトラフィックを受信できる宛先を検索する
- 特定の宛先 EC2 IP アドレスとポートを選択する
この例では、AWSの アベイラビリティーゾーン us-east-1a のサブネット内の IP アドレス 172.31.100.14 の EC2 インスタンスのポート 81 で実行されているセッションを選択します。
- 保存されたマッピングから、カスタムアプリケーションロジックは選択した EC2 インスタンスとポートにマップするアクセラレータとポートを検索します。
この例では、アプリケーションはアクセラレータポート「117」をユーザーに返します。
- ユーザは Global Accelerator の IP アドレスのポート 117 に接続します。ユーザは、 Global Accelerator に割り当てられた 2 つの IP アドレス(1.2.3.4 または 5.6.7.8)のいずれかでポート 117 に接続できることに注意してください。
- Global Accelerator は、IP アドレス/ポートを宛先 IP アドレス/ポート(172.31.100.14:81)に変換します。
- ユーザーは、EC2 サーバー上の実際のゲームセッションのプライベート IP アドレス/ポート 172.31.100.14:81 にルーティングされます。
標準アクセラレータとカスタムルーティングアクセラレータ
Global Accelerator のアクセラレータは、常に AWS グローバルネットワーク経由でエンドポイントにトラフィックを送信し、インターネットアプリケーションの可用性とパフォーマンスを向上させるという点では同じです。ただし、標準アクセラレータとカスタムルーティングアクセラレータには重要な違いがありますので、アクセラレータを作成するときは、シナリオに沿ったものを選択します。
標準アクセラレータ | カスタムルーティングアクセラレータ | |
---|---|---|
ルーティング | 最も近い正常なエンドポイントを自動的に選択します。トラフィックダイヤル、エンドポイントの重み、クライアントアフィニティを使用してトラフィックを管理します | ユーザトラフィックのルーティング先となる宛先 EC2 インスタンスの IP アドレスとポート |
エンドポイント | アプリケーションロードバランサー(ALB)、ネットワークロードバランサー(NLB)、EC2 インスタンス、および Elastic IP(EIP) | VPC サブネット(トラフィックはサブネット内の EC2 インスタンスにのみルーティングされます) |
プロトコルの選択 | リスナーレベルの TCP または UDP | エンドポイントグループレベルの TCP、UDP、またはその両方 |
まとめ
このブログ記事では、新しいカスタムルーティングアクセラレータを設定して使用する方法について説明しました。カスタムルーティングを利用することにより、AWS Global Accelerator のパフォーマンス上の利点が、数人から数千のユーザーを特定の EC2 エンドポイントリソースにルーティングするユースケースにおいても適用されることになります。この記事がお役に立てば幸いです。この機能をあなたがどう使うかをお聞かせください!
翻訳はソリューションアーキテクトの長田が担当しました。原文はこちらです。