ALB Extensible Edition の動的転送機能は、リクエストからターゲットアドレスをリアルタイムで抽出し、リクエストを直接転送します。事前にバックエンドを登録する必要はありません。この機能は、AI エージェントサンドボックスのスケジューリングや、多数の動的バックエンドを持つゲートウェイなど、バックエンドアドレスが動的に変化するシナリオに適しています。IP アドレス範囲サーバーグループは、トラフィックが不正なバックエンドに転送されるのを防ぐため、ターゲットスコープを制約します。
シナリオ
動的転送は、リクエストごとにバックエンドアドレスが動的に変化し、バックエンドインスタンスの数が多いシナリオに適しています。代表的なシナリオには、次のようなものがあります。
-
AI エージェントサンドボックスのトラフィックスケジューリング:AI エージェントの推論、コード実行などのワークロードは、オンデマンドでプロビジョニングされる多数のサンドボックスインスタンス (各種サンドボックス製品の Pod など) 上で実行されます。上位層のスケジューラは、ターゲットサンドボックスインスタンスの IP アドレスとポートをリクエストヘッダーに書き込み、ALB はそれらを抽出してリクエストを直接転送します。頻繁に変化するサンドボックスバックエンドを事前に登録する必要はありません。
-
ミニプログラムや H5 ゲーム向けのシングルドメイン転送:ミニプログラムなどのプラットフォームでは、通常、有効なドメイン名を 1 つだけ構成できます。単一のドメイン名で、URL パラメータ (例:
?ip=1.1.X.X&port=1111) を使用して、リクエストを異なるゲームサーバーインスタンスにルーティングできます。これにより、自社で構築した Nginx ソリューションを置き換えることができます。 -
多数の動的バックエンド:バックエンドインスタンスの数が多い場合、動的転送はバックエンドを 1 つずつ登録することなく、各リクエストをリアルタイムで処理します。許可する IP アドレス範囲とポート範囲を構成するだけで済みます。単一のインスタンスで多数の動的バックエンドを処理できるため、サーバーグループのクォータ制限によって複数のインスタンスに分割する必要がなくなります。
アーキテクチャ
クライアントリクエストが ALB Extensible Edition インスタンスに到達すると、転送ルールは、IP アドレス範囲サーバーグループに関連付けられた動的転送コンポーネントにトラフィックを渡します。このコンポーネントは、エンドポイント抽出、ターゲットスコープの検証、動的転送の 3 つのステージを順番に実行します。実際のターゲット IP アドレスとポートを決定し、ターゲットが許可された範囲と一致する場合、リクエストをそのアドレスに直接転送します。一致しない場合は、HTTP 403 を返します。
-
ALB Extensible Edition インスタンス:負荷分散とトラフィック転送機能を提供します。
-
IP アドレス範囲サーバーグループ:動的転送で許可されるターゲットスコープを、IP アドレス範囲とポート範囲の形式で宣言します。動的転送コンポーネントを含むサービス拡張に関連付ける必要があります。
-
サービス拡張:動的転送コンポーネントを保持します。IP アドレス範囲サーバーグループにバインドされると有効になります。
-
動的転送コンポーネント:リクエストのクエリパラメータまたはリクエストヘッダーからターゲットホストとポートを抽出し、ターゲットスコープの検証後にリクエストをバックエンドに転送します。
前提条件
-
ALB Extensible Edition のパブリックプレビュー資格を取得していること。
-
中国 (上海) リージョンに
VPC1という名前の Virtual Private Cloud (VPC) が作成されており、ゾーン B とゾーン F にそれぞれ vSwitchVSW1とVSW2が作成されていること。
操作手順
1. ALB Extensible Edition インスタンスを作成する
-
ALB コンソールにログインし、中国 (上海) リージョンを選択して、ALB の作成 をクリックします。
-
購入ページで、以下の設定を完了し、今すぐ作成 をクリックします。
-
[リージョン]:[中国 (上海)] を選択します。
-
[インスタンスネットワークタイプ]:[インターネット] を選択します。
-
[VPC] と [ゾーン]:
VPC1を選択し、[上海ゾーンB] と [上海ゾーンF] を選択してから、VSW1とVSW2を選択します。[パブリックIPを自動的に割り当てる] を有効にします。 -
[プロトコルバージョン]:[IPv4] を選択します。
-
[エディション (インスタンス料金)]:[Extensible Edition] を選択します。
-
-
注文確認 ページで、インスタンス構成の詳細を確認し、今すぐ有効化 をクリックします。
2. サービス拡張を作成し、動的転送コンポーネントを追加する
-
サービス拡張コンソールで、サービス拡張の作成 をクリックします。サービス拡張設定 セクションで、拡張名 に
ext-dyn-fwd-pluginなどを入力します。 -
拡張タイプ のデフォルトは プラグイン です。コンポーネント名 で、ドロップダウンリストから[動的転送]を選択します。クイック設定 (クリックで現在のルールパラメータを自動入力) の下で、一般的な Header をクリックしてプリセットのシステムテンプレートを使用し、次に 作成 をクリックします。
-
[抽出元]: デフォルト値は ヘッダー です。これは、ターゲット IP アドレスとポートが HTTP リクエストヘッダーから抽出されることを意味します。
-
[抽出モード]: デフォルト値は 分離モード です。これは、ターゲット IP アドレスとポートが 2 つの異なるフィールドにあり、個別に指定する必要があることを意味します。
-
[ターゲット Host のソース]: デフォルト値は
X-Target-Hostです。動的転送コンポーネントは、このリクエストヘッダーからターゲット IP アドレスを読み取ります。 -
[ターゲット Port のソース]: デフォルト値は
X-Target-Portです。動的転送コンポーネントは、このリクエストヘッダーからターゲットポートを読み取ります。 -
[デフォルトポート]:デフォルト値は
80です。これは、リクエストからポートが抽出されない場合に使用されるフォールバックポートです。
-
動的転送コンポーネントは、他のコンポーネントと同じサービス拡張に追加することはできません。
3. バックエンドサーバーを準備する
-
次の構成を参考にして ECS インスタンスを作成します。ECS インスタンスのセキュリティグループは、
VPC1の CIDR ブロックからのインバウンドトラフィックを許可する必要があります。-
[リージョン]:中国 (上海) を選択します。
-
[ネットワークおよびゾーン]:
VPC1とVSW1を選択し、プライマリ ENI のプライマリプライベート IP アドレスの指定 を選択します。 このチュートリアルでは、VSW1は IP アドレス範囲172.16.10.0/24に対応し、プライマリ ENI のプライマリプライベート IP アドレスは172.16.10.100として指定されます。 -
[イメージ]:
Alibaba Cloud Linux 3.2104 LTS 64-bitを選択します。
-
-
ECS コンソールで、インスタンスを見つけます。操作 列で、ネットワークとセキュリティグループ > セカンダリプライベート IP の管理 を選択します。増加 をクリックし、
172.16.10.101を入力して、[OK] をクリックします。オペレーティングシステムでセカンダリプライベート IP アドレスを認識させるを参照して、ECS インスタンスが IP アドレスを認識するように設定します。ECS インスタンスに接続し、ip aを実行します。ECS インスタンスがセカンダリプライベート IP アドレスを認識したことを確認できます。2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:16:3e:xx:xx:xx brd ff:ff:ff:ff:ff:ff altname enp3s0 inet 172.16.10.100/24 brd 172.16.10.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 172.16.10.101/24 brd 172.16.10.255 scope global secondary noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::xxxx:xxff:fexx:xxxx/64 scope link valid_lft forever preferred_lft forever -
バックエンド ECS インスタンスに Nginx をインストールし、ポート 80 とポート 81 でリッスンする echo サービスをデプロイします。任意のリクエストに対して、そのリクエストが実際に到達したターゲットの
IP:Portを返します。これは、動的転送の着地点を検証するために使用されます。# 1. Nginx をインストール sudo dnf install -y nginx # 2. echo 構成を作成 sudo tee /etc/nginx/conf.d/echo.conf >/dev/null <<'EOF' server { listen 80 default_server; listen 81 default_server; server_name _; location / { default_type text/plain; return 200 "served: $server_addr:$server_port\n"; } } EOF # 3. デフォルトサイトから default_server フラグを削除して競合を回避 sudo sed -i 's/ default_server//g' /etc/nginx/nginx.conf # 4. 構成を検証し、自動起動を有効にしてサービスを開始 sudo nginx -t sudo systemctl enable nginx sudo systemctl restart nginx # 5. ローカルでテスト curl 172.16.10.100:80 curl 172.16.10.100:81 curl 172.16.10.101:80 curl 172.16.10.101:81
4. IP アドレス範囲サーバーグループを作成する
動的転送は、リクエストの内容に基づいて転送ターゲットを決定します。制約がないと、細工されたリクエストによってトラフィックが不正なアドレスにリダイレクトされ、SSRF リスクが生じる可能性があります。IP アドレス範囲サーバーグループを必須のセキュリティ境界として構成します。ターゲット IP アドレスとポートが許可されたエントリと一致するリクエストのみが転送されます。その他のすべてのリクエストは HTTP 403 を返します。
-
サーバーグループコンソールで、サーバーグループの作成 をクリックします。
-
以下のパラメーターを設定し、作成 をクリックします:
-
[サーバーグループタイプ]: [IP アドレス範囲] を選択します。
-
[サーバーグループ名]:
sgp-dyn-fwdなどのカスタム名を入力します。 -
[バックエンドプロトコル]: デフォルトは HTTP です。
-
既存のサービス拡張を使用する を選択し、サービス拡張
ext-dyn-fwd-pluginを選択します。
-
-
サーバーグループの作成完了 が表示されたら、バックエンドサーバーの追加 をクリックします。IP アドレス範囲の追加 ダイアログボックスで、IP アドレス範囲 に
172.16.10.0/24を、ポート範囲 に80-81を入力し、OK をクリックします。
5. リスナーを作成する
-
ALB コンソールで、対象のインスタンス ID をクリックして インスタンスの詳細 ページに移動します。リスナー タブで、リスナーの作成 をクリックします。
-
リスナーの設定 ステップで、リスナープロトコルの選択 を HTTPS に、リスニングポート を
443に設定し、次へ をクリックします。 -
SSL 証明書の設定 ステップでは、カスタムドメイン名に一致するサーバー証明書を選択し、次へ をクリックします。
-
サーバーグループの選択 ステップで、[IP アドレス範囲] タイプとサーバーグループ
sgp-dyn-fwdを選択し、次に 次へ をクリックします。説明このチュートリアルでは、デフォルト転送ルールを使用して、トラフィックを IP アドレス範囲サーバーグループに転送します。認証やレート制限などの機能を追加するには、リスナーに追加の転送ルールを作成し、対応するサービス拡張に関連付けます。
-
設定の確認 ステップで、設定内容を確認し、送信 をクリックします。
6. DNS 解決を構成する
CNAME レコードを使用して、カスタムドメイン名が ALB インスタンスの DNS 名を指すように設定します。クライアントは、カスタムドメイン名を通じて ALB にアクセスします。
このチュートリアルでは、Alibaba Cloud DNS を例として使用します。Alibaba Cloud に登録されていないドメイン名の場合は、まずドメインを DNS コンソールに追加する必要があります。
-
ALB コンソールで、対象のインスタンスのドメイン名をコピーします。
-
DNS コンソールにログインします。 対象ドメインの Actions 列で、解決設定 をクリックします。 解決設定 ページで、Add Record をクリックします。
-
以下の情報で CNAME レコードを追加し、OK をクリックします:
-
[Record Type]: CNAME を選択します。
-
[Hostname]:
testなどのドメインプレフィックスを入力します。 たとえば、ルートドメインがexample.comの場合、ALB にアクセスするためのドメインはtest.example.comになります。 -
Query Source と TTL:デフォルト値のままにします。
-
[Record Value]: ALB インスタンスの DNS 名を入力します。
-
-
Change Resource Record Confirmation ダイアログボックスで、解決情報を確認し、OK をクリックします。
7. 構成を検証する
リクエストが正常な応答を受け取るには、次の条件を満たす必要があります。
-
動的転送コンポーネントは、リクエストからターゲット IP アドレスとポートを抽出できます (ポートが明示的に指定されていない場合は、フォールバックとして デフォルトポート が使用されます)。
-
IP アドレスとポートの組み合わせが、IP アドレス範囲サーバーグループの許可された範囲内に収まっていること。
-
その IP アドレスとポートでバックエンドサービスがリッスンしており、応答を返すこと。
リクエストに有効なターゲットアドレスが含まれる場合
プライマリ IP アドレスへの転送
curl -v \
-H "X-Target-Host: 172.16.10.100" \
-H "X-Target-Port: 80" \
https://test.example.com/echo
期待される応答:HTTP 200 と、本文に served: 172.16.10.100:80 が返されます。
セカンダリ IP アドレスへの転送 (異なる IP アドレスを検証)
curl -v \
-H "X-Target-Host: 172.16.10.101" \
-H "X-Target-Port: 80" \
https://test.example.com/echo
期待される応答:HTTP 200 と、本文に served: 172.16.10.101:80 が返されます。これは、ターゲット IP アドレスがリクエストごとに動的に変化することを証明しています。
異なるポートへの転送 (異なるポートを検証)
curl -v \
-H "X-Target-Host: 172.16.10.100" \
-H "X-Target-Port: 81" \
https://test.example.com/echo
期待される応答:HTTP 200 と、本文に served: 172.16.10.100:81 が返されます。これは、ターゲットポートもリクエストごとに動的に変化することを証明しています。
ポートが含まれない場合 (デフォルトポートのフォールバックを検証)
curl -v \
-H "X-Target-Host: 172.16.10.101" \
https://test.example.com/echo
期待される応答:HTTP 200 と、本文に served: 172.16.10.101:80 が返されます。リクエストにポートが含まれていないため、動的転送コンポーネントはフォールバックとしてデフォルトポート 80 を使用します。
リクエストにターゲットアドレスが含まれない場合
curl -v \
https://test.example.com/echo
期待される応答:HTTP 403 と、本文に endpoint not provided が返されます。動的転送コンポーネントは、リクエストからターゲット IP アドレスを抽出できません。
ターゲットアドレスまたはポートが許可された範囲外の場合
curl -v \
-H "X-Target-Host: 10.99.99.99" \
-H "X-Target-Port: 80" \
https://test.example.com/echocurl -v \
-H "X-Target-Host: 172.16.10.100" \
-H "X-Target-Port: 12345" \
https://test.example.com/echo
期待される応答:HTTP 403 と、本文に endpoint not allowed が返されます。抽出された IP アドレスまたはポートは、サーバーグループの許可された範囲内に収まっていないため、拒否されます。
追加情報
課金
-
ALB Extensible Edition:現在パブリックプレビュー中です。ユーザーは無料で試すことができます。ALB Extensible Edition インスタンスにバインドされた EIP には、独自の課金ルールがあり、EIP に対して料金が請求されます。
-
ECS インスタンス:詳細については、「ECS 課金の概要」をご参照ください。テスト目的で ECS インスタンスを作成する場合は、低スペックの従量課金インスタンスを作成し、速やかにリリースすることを推奨します。
-
ドメイン名とパブリック DNS 解決料金:ドメインプロバイダーからのドメイン名料金に加えて、Alibaba Cloud でパブリック DNS 解決を構成すると、パブリック権威 DNS 解決料金が発生します。
-
証明書料金:Alibaba Cloud で証明書を購入またはアップロードすると、サーバー証明書料金が発生します。
制限事項
-
動的転送のバックエンドプロトコルは、現在 HTTP のみをサポートしています。
-
IP アドレス範囲サーバーグループは、
22.0.0.0/8、33.0.0.0/8、100.0.0.0/8、127.0.0.0/8などのアドレス範囲の追加をサポートしていません。 -
単一の IP アドレス範囲サーバーグループは、デフォルトで最大 200 個の IP 範囲エントリをサポートします (各エントリは、IP 範囲とポート範囲の組み合わせです)。
ALB Extensible Edition の対応リージョン
|
エリア |
リージョン |
ゾーン |
|
中国 |
中国 (ウランチャブ) |
ゾーン A、ゾーン B、ゾーン C |
|
中国 (杭州) |
ゾーン J、ゾーン K |
|
|
中国 (北京) |
ゾーン I、ゾーン K、ゾーン L |
|
|
中国 (上海) |
ゾーン B、ゾーン F |
|
|
中国 (香港) |
ゾーン B、ゾーン C、ゾーン D |
|
|
アジアパシフィック |
シンガポール |
ゾーン A、ゾーン B、ゾーン C |
|
日本 (東京) |
ゾーン B、ゾーン C、ゾーン E |
|
|
マレーシア (クアラルンプール) |
ゾーン A、ゾーン B、ゾーン C |
|
|
ヨーロッパとアメリカ |
ドイツ (フランクフルト) |
ゾーン A、ゾーン B |
|
米国 (シリコンバレー) |
ゾーン A、ゾーン B |
|
|
中東 |
UAE (ドバイ) |
ゾーン A、ゾーン B |
ベストプラクティス
-
複数のターゲットアドレス抽出構成の適切な順序設定:複数のターゲットアドレス抽出構成を指定する場合、システムは最小のシーケンス番号から最大のシーケンス番号の順にそれらを照合します。最初に一致したものが有効になります。最も頻繁に一致し、最も制限の厳しい構成を最初に配置します。
-
許可するターゲット範囲を限定する:ビジネスの可用性を確保しながら、IP アドレス範囲とポート範囲を、ビジネスが実際に必要とするバックエンドのみに制限します。過度に広い範囲を構成しないようにします。
-
転送ルールを柔軟に使用する:IP アドレス範囲サーバーグループは、転送ルールの転送ターゲットとして機能できます。転送条件、サービス拡張、転送アクションと組み合わせて、複雑なトラフィックオーケストレーションのニーズに対応します。
よくある質問
すべてのリクエストで endpoint not allowed の 403 エラーが返される
IP アドレス範囲サーバーグループに正しい IP とポート範囲が構成されていること、およびリクエストで指定された対象 IP とポートがそれらの範囲内に収まっていることを確認してください。
すべてのリクエストで endpoint not provided の 403 エラーが返される
リクエストに X-Target-Host および X-Target-Port ヘッダーが含まれているかどうかを確認してください。これはサービス拡張の構成で確認できます。