ALB Extended Edition は JSON Web トークン (JWT) インバウンド認証をサポートしています。リクエストをバックエンドの大規模言語モデル (LLM) サービスに転送する前にトークンを検証し、不正アクセスを拒否することで、ご利用の AI サービスを保護します。
アーキテクチャ
ALB Extended Edition インスタンスはクライアントからのリクエストを受信します。転送ルールは HTTP ヘッダーに基づいてリクエストをマッチングします。JWT 認証コンポーネントはサービス拡張によって転送ルールにリンクされ、転送アクションの前に実行されます。このコンポーネントは HTTP リクエストヘッダーから JWT を抽出し、リモートの JSON Web Key Set (JWKS) サーバーから取得した公開鍵を使用して検証を行います。検証が成功した場合、リクエストはバックエンドの AI サービスに転送されます。検証が失敗した場合や JWT が提供されていない場合は、ALB が直ちに HTTP ステータスコード 401 の応答を返し、リクエストの転送を停止します。
ALB Extended Edition インスタンス:負荷分散およびトラフィック転送を提供します。
AI サーバーグループ:バックエンドの LLM サービスに接続します。
HTTPS リスナー:クライアントからのリクエストを受信します。
転送ルール:HTTP ヘッダーの条件に基づいてリクエストをマッチングおよび転送します。
サービス拡張:JWT 認証コンポーネントを通じてインバウンド認証および転送制御を実装します。
JWKS サーバー:この例では、Nginx サーバーを使用して JWKS サーバーをシミュレートし、公開鍵情報を提供します。
適用範囲
ALB Extended Edition のパブリックプレビューへのアクセス権を取得済みです。
中国 (ウランチャブ) リージョンに VPC を作成済みです。この VPC 内に、ウランチャブゾーン A に vSwitch VSW1、ウランチャブゾーン B に vSwitch VSW2 を作成済みです。AI サーバーグループがパブリックの LLM API を呼び出せるようにするため、両方の vSwitch でパブリックネットワーク SNAT を有効化している必要があります。
VSW1 または VSW2 のいずれかに Alibaba Cloud Linux 3.2104 を実行する ECS インスタンスを作成済みです。ECS インスタンスのセキュリティグループは、VSW1 および VSW2 の CIDR ブロックからのトラフィックを許可している必要があります。
Alibaba Cloud Model Studio を有効化し、API キーを取得済みです。
カスタムドメイン名を登録済みです。本トピックでは ALB インスタンスを中国 (ウランチャブ) リージョンにデプロイするため、ご利用のドメイン名にはICP 登録が必要です。
ご利用のカスタムドメイン名と一致するサーバー証明書を準備済みです。Alibaba Cloud 以外で購入した証明書は、Alibaba Cloud 証明書サービスにアップロードされている必要があります。
操作手順
1. ALB Extended Edition インスタンスの作成
ALB コンソールにログインし、中国 (ウランチャブ) リージョンを選択して、ALB の作成 をクリックします。
購入ページで、以下の設定を行い、[今すぐ購入] をクリックします。
リージョン: 中国 (ウランチャブ) を選択します。
インスタンスネットワークタイプ: パブリック を選択します。
VPC および ゾーン: 対象の VPC を選択し、ウランチャブゾーン A および ウランチャブゾーン B をチェックし、対応する vSwitch を選択して、[パブリック IP の自動割り当て] を有効化します。
プロトコルバージョン: IPv4 を選択します。
機能バージョン (インスタンス料金): Extended Edition を選択します。
[注文内容の確認] ページで構成を確認し、[今すぐ有効化] をクリックします。
2. AI サーバーグループの作成
Alibaba Cloud Model Studio に接続する AI サーバーグループを作成します。
サーバーグループコンソールで、サーバーグループの作成 をクリックし、サーバーグループタイプ を AI サービス に設定し、
sgp-ai-qwenなどの名前を入力して、作成 をクリックします。サーバーグループが作成されました ダイアログボックスで、バックエンドサーバーの追加 をクリックします。
Add AI Service ダイアログボックスで、以下の設定を行い、OK をクリックします。
Model provider: Alibaba Cloud Model Studio を選択します。
Endpoint: Model provider を選択すると、このフィールドは自動的に入力されます。
API Key: Alibaba Cloud Model Studio の API キーを入力します。
3. リスナーの作成
ALB コンソールで、対象のインスタンス ID をクリックして インスタンスの詳細 ページを開きます。リスナー タブで、リスナーの作成 をクリックします。
[リスナーの構成] ステップで、リスナープロトコルの選択 を HTTPS に、リスニングポート を
443に設定して、次へ をクリックします。[SSL 証明書の構成] ステップで、ご利用のカスタムドメイン名と一致するサーバー証明書を選択し、次へ をクリックします。
[サーバーグループの選択] ステップで、AI サービス タイプおよび
sgp-ai-qwenサーバーグループを選択して、次へ をクリックします。選択したサーバーグループは、リスナーのデフォルトサーバーグループとして使用されます。他の転送ルールにマッチしないリクエストを処理します。必要に応じてサーバーグループを変更できます。
[構成の確認] ステップで設定を確認し、送信 をクリックします。
4. JWKS サーバーのデプロイ
ECS インスタンスに Nginx をデプロイして、JWT 公開鍵情報を提供する JWKS サーバーをシミュレートします。ALB インスタンスが VPC ネットワーク経由で JWKS サーバーにアクセスできることを確認してください。
4.1 JWT キーペアおよびトークンの生成
Python スクリプトを使用して、準拠した公開鍵 JSON ファイルおよびテスト用 JWT を生成します。
ECS インスタンスにログインし、必要な Python 依存関係をインストールします。Alibaba Cloud Linux にはデフォルトで Python 3 が含まれています。次のコマンドを実行して
jwcryptoライブラリをインストールします。sudo pip3 install --upgrade pip sudo pip3 install jwcrypto生成スクリプト
generate_jwt_jwks.pyを作成します。sudo vim generate_jwt_jwks.py次のコードをファイルにコピーします。
import json import time import sys # Check dependencies try: from jwcrypto import jwk, jwt except ImportError: print("Error: Library 'jwcrypto' is not installed.") print("Please run: pip3 install jwcrypto") sys.exit(1) def main(): print(">>> Start generating JWKS and JWT...\n") # --- Configuration --- KEY_ID = "aliyun-test-kid" # Key ID ISSUER = "http://your-nginx-server-ip" # Replace with actual Nginx IP or domain, or keep default SUBJECT = "test-user-001" # Test user identifier # --- 1. Generate RSA key pair (2048-bit) --- # Use RS256 algorithm key = jwk.JWK.generate(kty='RSA', size=2048, alg='RS256', use='sig', kid=KEY_ID) # --- 2. Export public key and save as jwks.json --- # Nginx reads this file to verify tokens public_key = key.export_public(as_dict=True) jwks_data = { "keys": [public_key] } jwks_filename = "jwks.json" with open(jwks_filename, "w") as f: json.dump(jwks_data, f, indent=4) print(f"[Success] JWKS file created: ./{jwks_filename}") print(f" Next step: Move this file to the Nginx directory.") # --- 3. Generate signed JWT (using private key) --- claims = { "sub": SUBJECT, "iss": ISSUER, "name": "Aliyun Doc User", "role": "admin", "iat": int(time.time()), # Set expiration to 100 years to avoid token expiry during testing "exp": int(time.time()) + 3600 * 24 * 365 * 100 } # Create and sign token token = jwt.JWT( header={"alg": "RS256", "kid": KEY_ID, "typ": "JWT"}, claims=claims ) token.make_signed_token(key) print("\n[Success] Test JWT generated (valid for 100 years):") print("-" * 60) print(token.serialize()) print("-" * 60) print("Action: Use this token for API request testing.") if __name__ == "__main__": main()スクリプトを実行してファイルを生成します。
sudo python3 generate_jwt_jwks.py生成されたトークン文字列を記録します。これはスクリプト出力内の
eyJ...で始まる長い文字列です。この文字列は検証ステップで使用します。
4.2 Nginx のインストールおよび構成
ECS インスタンスに Nginx をインストールし、前のステップで生成された jwks.json ファイルを提供するように構成します。
Nginx をインストールできます。
sudo yum install -y nginx sudo systemctl start nginx sudo systemctl enable nginx次のコマンドを実行してディレクトリを準備し、公開鍵 JSON ファイルを移動します。
# Create directory sudo mkdir -p /usr/share/nginx/html/auth # Move jwks.json sudo cp jwks.json /usr/share/nginx/html/auth/jwks.json # Set read permissions sudo chmod 644 /usr/share/nginx/html/auth/jwks.json次のコマンドを実行して、
/etc/nginx/default.d/ディレクトリにjwks.conf構成ファイルを作成します。sudo vim /etc/nginx/default.d/jwks.conf次の構成を追加します。
location /auth/v1 { # Disable caching to ensure clients always get the latest public key add_header Cache-Control "no-store, no-cache, must-revalidate"; # Set correct response type default_type application/json; # Use alias to point directly to the file alias /usr/share/nginx/html/auth/jwks.json; }次のコマンドを実行して Nginx 構成を検証し、構成ファイルを再読み込みします。
sudo nginx -t sudo systemctl reload nginx次のコマンドを実行して、JWKS サーバーが正しい情報を返すかどうかをテストします。
curl http://localhost:port/auth/v1コマンドは、
RSAアルゴリズム (alg: RS256) の公開鍵情報を含む JSON 形式のデータを返します。これにより、JWKS サービスが正常にデプロイされたことが確認されます。ECS インスタンスのプライベート IP アドレスを記録します。この IP アドレスはサービス拡張の構成時に使用します。
5. サービス拡張の作成
サービス拡張を作成し、JWT 認証コンポーネントを追加します。その後、リモート JWKS サーバーアドレスおよび JWT 抽出方法を構成します。
サービス拡張コンソールで、Create Service Extension をクリックします。Service Extension Configuration セクションで、Extension name に
jwt-auth-extensionなどの名前を入力します。Extension Type はデフォルトで プラグイン に設定されています。Component name ドロップダウンリストから JWT 認証 を選択し、必要なパラメーターを構成して、作成 をクリックします。
Remote Service:
http://<ECS プライベート IP>:<ポート>/auth/v1形式で JWKS サーバー URL を入力します。例:http://172.16.11.132:80/auth/v1。Cache Time: JWKS 公開鍵がキャッシュされる期間です。デフォルト値の 300 秒を維持します。
JWKS Token Configuration:
Type: By HTTP Header を選択します。
Key: デフォルト値は
Authorizationです。Value Prefix: デフォルト値の
Bearerを維持できます。
Timeout と Processing policy には、デフォルト値の
1000と終了を使用します。これらの値は必要に応じて調整できます。
6. 転送ルールの構成
リスナーの転送ルールを作成し、HTTP ヘッダー条件を追加して、サービス拡張を転送ルールに関連付けます。
ALB コンソールで、対象のインスタンス ID をクリックして インスタンスの詳細 ページに移動します。リスナー タブで、対象のリスナー ID をクリックして リスナーの詳細 ページに移動し、転送ルール タブをクリックします。
新しいルールの追加 をクリックし、以下の設定を行い、OK をクリックします。
転送条件: HTTP ヘッダー を選択し、キー を
kに、値 をvに設定します。k: vは例として使用されています。本番環境では、HTTP ヘッダーのキーと値のペアを構成するか、必要に応じて他の転送条件を使用できます。サービス拡張 (オプション): デフォルトオプションは 既存のサービス拡張を使用 です。ドロップダウンリストから
jwt-auth-extensionを選択します。転送操作: AI サーバーグループ
sgp-ai-qwenに 転送 します。
転送ルールが作成されると、HTTP ヘッダー k: v を含むリクエストがこのルールにマッチします。サービス拡張は Authorization ヘッダーから JWT を抽出し、リモート JWKS サーバーから公開鍵を取得して JWT を検証し、検証が成功した場合にリクエストを sgp-ai-qwen サーバーグループに転送します。
7. ドメイン名解決の構成
CNAME レコードを追加して、ご利用のカスタムドメイン名を ALB インスタンスの DNS 名にマッピングします。これにより、クライアントはご利用のカスタムドメイン名経由で ALB インスタンスにアクセスできます。
この例では Alibaba Cloud DNS を使用します。ご利用のドメイン名が Alibaba Cloud で登録されていない場合は、まずDNS コンソールにドメイン名を追加する必要があります。
ALB コンソールで、対象インスタンスの ドメイン名 をコピーします。
ドメイン名解決コンソールにログインします。管理対象のドメインを見つけ、Actions 列の 解決設定 をクリックします。解決設定 ページで、Add Record をクリックします。
以下の情報を使用して CNAME レコードを追加し、OK をクリックします。
Record Type: CNAME を選択します。
Hostname:
aiなどのプレフィックスを入力します。ルートドメインがexample.comの場合、ALB アクセスドメインはai.example.comになります。Query Source および TTL のデフォルト値を維持します。
Record Value: ALB インスタンスの DNS 名を入力します。
Change Resource Record Confirmation ダイアログボックスで設定を確認し、OK をクリックします。
8. 検証テスト
curl コマンドを使用してリクエストを送信し、JWT 認証を検証します。リクエストは以下の条件を満たしている必要があります。
サービス拡張に関連付けられた転送ルールにマッチするため、マッチングヘッダー
k: vを含めます。OpenAI 互換プロトコルに従います:リクエスト URI は
/v1/completions、/v1/chat/completions、または/v1/embeddingsである必要があり、全体的なフォーマットはプロトコル仕様に準拠している必要があります。
以下のテストコマンドでは、ai.example.com を例として使用しています。実際のステップ 7 で構成したドメイン名に置き換えてください。ドメイン名解決が有効になっていることを確認してください。有効な JWT トークンを含むリクエスト
リクエストには Authorization: Bearer <token> ヘッダーが含まれており、<token> はステップ 4.1 で生成された JWT です。
# 以下の <Token string> をステップ 4.1 のスクリプト出力から実際のトークンに置き換えてください
token="<Token string>"
curl -v \
-H "k: v" \
-H "Authorization: Bearer $token" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-turbo",
"messages": [
{
"role": "user",
"content": "Who are you"
}
]
}' \
https://ai.example.com/v1/chat/completionsリクエストが成功すると、システムは HTTP ステータスコード 200 および AI サービスからの応答を返します。
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "I am Qwen, a large-scale language model independently developed by Tongyi Lab under Alibaba Group. I can answer questions, create text, perform logical reasoning, programming, and more. Feel free to ask me anything, and I will do my best to help.",
"role": "assistant"
}
}
],
"created": 1767613123,
"id": "chatcmpl-01fb9300-df1d-98d1-9f5d-874fddebf13f",
"model": "qwen-turbo",
"object": "chat.completion",
"usage": {
"completion_tokens": 47,
"prompt_tokens": 14,
"prompt_tokens_details": {
"cached_tokens": 0
},
"total_tokens": 61
}
}無効な JWT トークンを含むリクエストまたは JWT トークンを含まないリクエスト
無効な JWT トークンを含むリクエスト
リクエストには Authorization: Bearer <token> ヘッダーが含まれていますが、<token> は有効な JWT ではありません。
token="wrong-jwt-token"
curl -v \
-H "k: v" \
-H "Authorization: Bearer $token" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-turbo",
"messages": [
{
"role": "user",
"content": "Who are you"
}
]
}' \
https://ai.example.com/v1/chat/completionsリクエストが失敗すると、システムは HTTP ステータスコード 401 および認証失敗を示すレスポンスボディを返します。
HTTP レスポンスヘッダー:
HTTP/2 401
www-authenticate: Bearer realm="https://ai.example.com/v1/chat/completions", error="invalid_token"
content-length: 79
content-type: text/plain
vary: Accept-Encoding
date: Wed, 21 Jan 2026 06:57:46 GMTHTTP レスポンスボディ (例):
Jwt verification failsJWT トークンを含まないリクエスト
リクエストには Authorization: Bearer <token> ヘッダーが含まれていません。
curl -v \
-H "k: v" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-turbo",
"messages": [
{
"role": "user",
"content": "Who are you"
}
]
}' \
https://ai.example.com/v1/chat/completionsリクエストが失敗すると、システムは HTTP ステータスコード 401 および JWT が不足していることを示すレスポンスボディを返します。
HTTP レスポンスヘッダー:
HTTP/2 401
www-authenticate: Bearer realm="https://ai.example.com/v1/chat/completions"
content-length: 14
content-type: text/plain
date: Wed, 21 Jan 2026 07:00:10 GMTHTTP レスポンスボディ:
Jwt is missing追加情報
課金詳細
ALB Extended Edition: この機能はパブリックプレビュー中です。無料で使用できます。
パブリックネットワークアクセス料金: インターネット NAT ゲートウェイはインスタンス料金および容量単位 (CU) 料金に基づいて課金されます。NAT ゲートウェイおよび ALB Extended Edition インスタンスにバインドされた EIP は、個別の課金ルールに従い、EIP 関連の料金が発生します。
ECS インスタンス: 詳細については、「ECS 課金概要」をご参照ください。テスト目的の場合、低スペックの従量課金インスタンスを作成し、テスト完了後にすぐにリリースすることを推奨します。
ドメイン名および DNS 解決料金: レジストラーに支払うドメイン名登録料金に加えて、Alibaba Cloud で DNS 解決を構成する際に権威 DNS 解決料金が発生します。
証明書料金: Alibaba Cloud で証明書を購入またはアップロードする際にサーバー証明書料金が発生します。
Model Studio モデル料金: Model Studio 大規模言語モデル API の呼び出しは課金対象です。
ALB Extended Edition をサポートするリージョン
エリア | リージョン | ゾーン |
中国 | 中国 (ウランチャブ) | ゾーン A、ゾーン B、およびゾーン C |
中国 (杭州) | ゾーン J およびゾーン K | |
アジア太平洋 | シンガポール | ゾーン A、ゾーン B、およびゾーン C |
ヨーロッパおよびアメリカ | ドイツ (フランクフルト) | ゾーン A およびゾーン B |
推奨事項
認証ソリューションのアップグレード: 本トピックでは、Nginx を使用して固定トークンを持つ JWKS サーバーをシミュレートしています。本番環境では、より高いセキュリティを実現するために、標準的な JWKS エンドポイントを提供する標準的な ID プロバイダー (IdP) をデプロイし、キーのローテーションおよびトークン発行を一元管理することを推奨します。
高可用性デプロイメント: 認証サービスを複数のゾーンにわたってまたはクラスターでデプロイすることを推奨します。これにより、認証またはビジネス運用を中断する可能性のある単一障害点を防止できます。
よくある質問
JWT 認証が失敗し、 Jwks remote fetch is failed というエラーが表示される
このエラーは、ALB インスタンスが検証のためにリモート JWKS サーバーから公開鍵を取得できないことを示しています。以下の手順を実行して問題をトラブルシューティングできます。
サービス拡張のリモートサービス URL が正しく、ECS インスタンスのプライベート IP アドレスを使用していることを確認します。
ALB インスタンスと ECS インスタンスが同じ VPC にあり、相互に通信できることを確認します。
ECS インスタンスのセキュリティグループルールおよびシステムファイアウォールが、VSW1 および VSW2 の CIDR ブロックからの Nginx サービスポートへのアクセスを許可していることを確認します。
JWKS サーバーが期待通りに実行されていることを確認します。ECS インスタンス上で
curlコマンドを実行してローカルテストを実施できます。
JWT 認証が構成されているが、トークンを含まないリクエストが依然として成功する
転送条件が実際のリクエストとマッチしており、認証済みリクエストが確実にルールにマッチするように十分な優先度を持っていることを確認します。
サービス拡張に JWT 認証コンポーネントが含まれており、転送ルールに正しく関連付けられていることを確認します。