VPC 専用接続は、サービスを呼び出すためのパフォーマンスの高い方法です。これにより、Virtual Private Cloud (VPC) 内のクライアントがパブリックゲートウェイをバイパスし、PAI-EAS サービスインスタンスに直接アクセスできるようになります。このトピックでは、その仕組みと設定方法について説明し、公式 SDK を使用したサービスの呼び出しやカスタムクライアントの構築に関する詳細な手順を解説します。
概要
ユースケース
高いパフォーマンス要件:画像認識や音声認識など、1 秒あたりのクエリ数 (QPS) が多い高トラフィックのサービスでは、専用接続によってアクセスパフォーマンスを大幅に向上させることができます。
レイテンシーに敏感なアプリケーション:オンラインレコメンデーションや金融リスク管理など、高速なレスポンスタイムが求められるサービスでは、専用接続によってレイテンシーを効果的に削減できます。
仕組み
VPC 専用接続は、次の 2 つのメカニズムに基づいています。
ネットワーク接続:サービスに VPC を設定すると、PAI-EAS は、指定された VPC および vSwitch 内の各サービスインスタンスに、無料の補助 Elastic Network Interface を作成してアタッチします。これにより、VPC と PAI-EAS サービスインスタンスの間に直接的なネットワークパスが確立されます。その結果、VPC 内のクライアントはゲートウェイを経由せずに PAI-EAS サービスインスタンスに直接アクセスでき、レイヤー 4 SLB およびレイヤー 7 ネットワーク転送を回避できます。
サービスディスカバリ: PAI-EAS は、クライアントがすべてのサービスインスタンスの
IP:PORTペアのリアルタイムリストを取得できるサービスディスカバリメカニズムを提供します。クライアントはこのリストを使用して、負荷分散とフェイルオーバーを実装できます。
リージョン間アクセスと課金
Q:リージョン間の VPC 内部アクセスとパブリックネットワークアクセスの違いは何ですか?
主な違いは、ゲートウェイのタイプによって異なります。
専用ゲートウェイ:VPC 接続の確立に加えて、PAI-EAS で追加の CEN 関連の設定手順を実行する必要があります。詳細については、「CEN を使用した専用ゲートウェイへのクロス VPC アクセス」をご参照ください。
Q:リージョン間の VPC 内部アクセスではトラフィックコストが発生しますか?それでも推奨されるのはなぜですか?
はい、リージョン間の内部ネットワークトラフィックには料金が発生します。それでも、本番環境では以下の理由から VPC 内部アクセスが推奨されます。
セキュリティ:トラフィックはパブリックインターネットを経由しないため、パブリックインターネットへの露出リスクが排除されます。
パフォーマンス:パブリックネットワークアクセスと比較して、レイテンシーが低く、接続がより安定しています。
コスト効率:リージョン間の内部ネットワークトラフィックコストは、通常、パブリックネットワークのエグレストラフィックコストよりも低くなります。
前提条件
開始する前に、サービスに VPC が設定されていることを確認してください。詳細については、「ネットワーク設定」をご参照ください。
各 Elastic Network Interface は vSwitch から 1 つの IP アドレスを消費します。vSwitch に、すべてのサービスインスタンスに割り当てるための十分な IP アドレスがあることを確認してください。
セキュリティグループのルールを設定して、ネットワークの分離とアクセス制御を管理します。
重要セキュリティグループのルールは、ECS インスタンスなどのクライアントと PAI-EAS サービス間のネットワークアクセスを制御します。
デフォルトでは、同じ基本セキュリティグループ内のインスタンスは、内部ネットワークを介して相互に通信できます。クライアントと PAI-EAS サービスを同じセキュリティグループに配置できます。
クライアントと PAI-EAS サービスが異なるセキュリティグループを使用する必要がある場合は、それらの間の通信を許可するルールを設定する必要があります。詳細については、「クラシックネットワーク内の異なるセキュリティグループのインスタンス間のアクセスを許可する」をご参照ください。
複数レプリカを持つサービス向けの安定したエンドポイント設定
サービスが複数のレプリカにスケールすると、バックエンドインスタンスの IP が変更される可能性があります。以下の方法を使用して、安定した接続アドレスを維持します。
基本原則:PAI-EAS は SLB を使用して、各サービスに統一されたサービスエンドポイントを公開します。バックエンドで実行されているレプリカの数に関係なく、クライアントはこの単一のアドレスに接続するだけであり、個々のインスタンスの IP の変更を追跡する必要はありません。
オプション 1 (推奨):バックエンドに IP 許可リストを設定したパブリックドメインを使用します。ピア VPC の IP 範囲からのトラフィックのみを許可するようにバックエンドを設定します。これにより、追加の DNS 設定なしで安定したドメインアドレスが提供されます。
オプション 2:ピア VPC で Alibaba Cloud PrivateZone を設定し、カスタムドメインを PAI-EAS プライベート IP アドレスに解決します。IP アドレスが変更された場合は、DNS レコードを更新するか、サービスディスカバリメカニズムを統合して解決を最新の状態に保つ必要があることに注意してください。
EAS コンテナから他の EAS サービスを呼び出す
EAS サービスがコンテナ内から別の EAS サービスを呼び出す必要がある場合は、次の点に注意してください。
401 エラーまたは接続失敗:これらは通常、コンテナアプリケーションがパブリックエンドポイントを使用して別の EAS サービスを呼び出すときに発生します。一般的な原因は、コンテナ環境のネットワーク制限または不正なトークン設定です。
推奨アプローチ:サービス間の呼び出しには VPC 内部アドレスを使用します。これにより、接続性が確保され、セキュリティが向上します。
代替案:パブリックエンドポイントを使用する必要がある場合は、専用ゲートウェイを設定します。これには追加の ALB コストがかかることに注意してください。
認証要件:使用するアドレスタイプに関係なく、すべてのリクエストには、リクエストヘッダーに有効な Authorization トークンを含める必要があります。
公式 SDK を使用したサービスの呼び出し (推奨)
コアロジック
VPC 専用接続を使用すると、クライアントはゲートウェイをバイパスしてサービスインスタンスに直接接続します。これは、クライアントが サービスディスカバリ、負荷分散、およびフェイルオーバーリトライ の処理を担当することを意味します。公式の PAI-EAS SDK は、このロジックをカプセル化しています。
サービスディスカバリ:SDK は初期化中にバックグラウンドスレッドを開始し、PAI-EAS サービスディスカバリ API を定期的に呼び出します。バックエンドインスタンスの
IP:PORTペアと重みのリストを取得してキャッシュします。API 呼び出しが失敗した場合、SDK は可用性を確保するために最後にキャッシュされたリストを引き続き使用します。負荷分散:各リクエストに対して、SDK は 加重ラウンドロビン アルゴリズムを使用してローカルキャッシュからターゲットインスタンスを選択します。重みは、サービスディスカバリ API から返されたインスタンスの重みによって決定されます。
フェイルオーバーリトライ:ネットワークエラー、接続タイムアウト、または 5xx レスポンスが原因でリクエストが失敗した場合、SDK はローカルキャッシュから 異なる インスタンスでリクエストを再試行します。複数インスタンスのデプロイでは、これにより、障害が発生した単一インスタンスによってリクエストが失敗するのを防ぎます。
SDK を使用せずにカスタムクライアントを構築する場合は、同等の機能を実装する必要があります。詳細については、「カスタムクライアントの構築」をご参照ください。
例
Python SDK
SDK をインストールまたはアップグレードします。
pip install -U eas-prediction --user詳細については、「Python SDK ガイド」をご参照ください。
呼び出しコードを記述します。
次のコードは、文字列を入力および出力として使用するプログラムの例を示しています。TensorFlow や PyTorch など、他の入力および出力形式を使用する例については、「Python SDK ガイド」をご参照ください。
#!/usr/bin/env python from eas_prediction import PredictClient from eas_prediction import StringRequest from eas_prediction import TFRequest from eas_prediction import ENDPOINT_TYPE_DIRECT # 実際のエンドポイントに置き換えてください。形式は {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com です。 # Uid は Alibaba Cloud アカウント ID、RegionId は PAI-EAS サービスのリージョン ID です。 ENDPOINT = "123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com" # PAI-EAS サービス名に置き換えてください。 SERVICE_NAME = "mnist_saved_model_example" # サービストークンに置き換えてください。トークンはサービス詳細ページで確認できます。トークンは環境変数または Key Management Service (KMS) を使用して管理することを推奨します。 TOKEN = "M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****" if __name__ == '__main__': client = PredictClient(ENDPOINT, SERVICE_NAME) client.set_token(TOKEN) client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # 専用接続を介してサービスにアクセスします。 client.init() # request = StringRequest('[{}]') req = TFRequest('predict_images') req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) resp = client.predict(req) print(resp)パラメーターの説明:
client = PredictClient()コンストラクタは、引数として VPC 専用接続エンドポイントとサービス名を受け取ります。VPC 専用接続エンドポイント:このエンドポイントはリージョン固有であり、
{Uid}.vpc.{RegionId}.pai-eas.aliyuncs.comの形式を使用します。{Uid}は Alibaba Cloud アカウント ID です。たとえば、中国 (上海) の VPC 専用接続エンドポイントは123**********.vpc.cn-shanghai.pai-eas.aliyuncs.comです。TOKEN:トークンは、サービス詳細ページの [呼び出し情報] で確認できます。
Java SDK
Maven の依存関係を追加します。
Maven プロジェクトで EAS Java SDK を使用するには、pom.xml ファイルの <dependencies> セクションに eas-sdk の依存関係を追加してください。最新バージョンについては、Maven リポジトリ を確認してください。
<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.20</version> </dependency>詳細については、「Java SDK ガイド」をご参照ください。
呼び出しコードを記述します。
import com.aliyun.openservices.eas.predict.http.PredictClient; import com.aliyun.openservices.eas.predict.http.HttpConfig; public class TestString { public static void main(String[] args) throws Exception { // クライアントオブジェクトが正しく共有されるように、起動時に作成および初期化します。リクエストごとに新しいクライアントを作成しないでください。 PredictClient client = new PredictClient(new HttpConfig()); // サービストークンに置き換えてください。トークンはサービス詳細ページの [呼び出し情報] で確認できます。 client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****"); // 専用接続の場合は、setDirectEndpoint メソッドを使用し、ドメイン名は {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com の形式にします。{Uid} はアカウント ID に置き換えてください。たとえば、中国 (上海) のリージョン ID は cn-shanghai です。 client.setDirectEndpoint("123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com"); // サービス名に置き換えてください。 client.setModelName("scorecard_pmml_example"); // 入力文字列を定義します。 String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]"; System.out.println(request); // PAI-EAS から文字列のレスポンスを取得します。 try { String response = client.predict(request); System.out.println(response); } catch (Exception e) { e.printStackTrace(); } // クライアントをシャットダウンします。 client.shutdown(); return; } }
Go SDK
Go SDK を使用する場合、Go パッケージマネージャーはコンパイル中に GitHub から SDK ソースコードを自動的にダウンロードします。事前にインストールする必要はありません。Go SDK の使用方法の詳細については、「Go SDK ガイド」をご参照ください。
次のコードは、Go SDK を使用してサービスを呼び出す方法を示しています。
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
// エンドポイントは {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com の形式で使用します。{Uid} をアカウント ID に置き換えて、サービスのリージョンと名前を指定します。たとえば、中国 (上海) のリージョン ID は cn-shanghai です。
client := eas.NewPredictClient("123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
// サービストークンに置き換えてください。トークンはサービス詳細ページの [呼び出し情報] で確認できます。
client.SetToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****")
client.SetEndpointType(eas.EndpointTypeDirect)
client.Init()
req := "[{\"fea1\": 1, \"fea2\": 2}]"
for i := 0; i < 100; i++ {
resp, err := client.StringPredict(req)
if err != nil {
fmt.Printf("failed to predict: %v\n", err.Error())
} else {
fmt.Printf("%v\n", resp)
}
}
}カスタムクライアントの構築
別のプログラミング言語を使用する必要がある場合や、カスタム要件がある場合は、これらのガイドラインに従って HTTP 呼び出しロジックを実装できます。
カスタムクライアントを構築する場合、サービスディスカバリ、負荷分散、フェイルオーバーリトライなどの複雑な耐障害性ロジックを処理する責任があります。クライアントの実装は、サービスの可用性に直接影響します。公式 SDK の使用を強く推奨します。プラットフォームのサービスレベルアグリーメント (SLA) は、不適切に実装されたクライアントによって引き起こされたサービスの中断には適用されません。
サービスディスカバリ API
PAI-EAS は、設定された VPC 内でのサービスディスカバリのための HTTP API を提供します。この API は、サービスのすべてのバックエンドインスタンスの IP アドレス、ポート、および重みのリストを返します。
URL:
http://.vpc. .pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ 認証:トークンは必要ありません。API は、サービス用に設定された VPC 内からのみアクセスできます。
ポーリング間隔:これはサイドチャネル API であり、バックグラウンドタスクによって定期的に (たとえば 5〜10 秒ごと) 呼び出す必要があります。推論リクエストごとにこの API を呼び出さないでください。これを行うと、パフォーマンスが著しく低下します。
例:
次の例は、中国 (杭州) にデプロイされ、2 つのインスタンスを持つ mnist_saved_model_example という名前のサービスをクエリする方法を示しています。
$ curl http://123**********.vpc.cn-hangzhou.pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example123********** をアカウント ID に置き換えてください。
次のレスポンスは、バックエンドサービスアドレスのリストを示しています。
{
"correlative": [
"mnist_saved_model_example"
],
"endpoints": {
"items": [
{
"app": "mnist-saved-model-example",
"ip": "172.16.XX.XX",
"port": 50000,
"weight": 100
},
{
"app": "mnist-saved-model-example",
"ip": "172.16.XX.XX",
"port": 50000,
"weight": 100
}
]
}
}トラブルシューティング:VPC ドメインへのアクセス失敗
現象:VPC ドメインには到達できませんが、サービスディスカバリ API によって返された直接 IP アドレスを介してサービスにアクセスできます。
一般的な原因:不正な curl コマンド構文。たとえば、URL が引用符で囲まれていないため、シェルが URL 内の & や ? などの特殊文字を誤って解釈します。
解決策:URL を二重引用符で囲み、IP アドレスまたは VPC ドメインを介して最小限のテストリクエストを実行して、接続を確認してください。
# VPC ドメインを使用してテストします (URL は二重引用符で囲む必要があります)
curl "http://123**********.vpc.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/your-service-name" \
-H "Authorization: your-token"
# 直接 IP アドレスを使用してテストします (サービスディスカバリ API のレスポンスから取得した IP に置き換えてください)
curl "http://172.16.XX.XX:50000/api/predict/your-service-name" \
-H "Authorization: your-token"実装要件
カスタムクライアントを構築する場合、サービスディスカバリ、負荷分散、およびフェイルオーバーリトライを処理する必要があります。完全なリファレンス実装については、Python SDK のソースコードをご参照ください。以下は、主要な実装要件です。
インスタンスリストをローカルにキャッシュし、定期的に更新する:バックグラウンドスレッドを開始して、サービスディスカバリ API を定期的に (たとえば 5〜10 秒ごと) 呼び出します。返されたリストでローカルにキャッシュされたインスタンスリストを上書きします。
重要サービスディスカバリ API はサイドチャネルサービスです。この API を推論リクエストごとに呼び出さないでください。API 呼び出しが失敗した場合、または空のリストが返された場合は、ローカルにキャッシュされたリストを引き続き使用する必要があります。キャッシュをクリアしないでください。これを怠ると、サービスが利用できなくなります。
リクエストの負荷分散:各推論リクエストに対して、ローカルキャッシュからインスタンスを選択します。加重ラウンドロビンアルゴリズムの使用を推奨しますが、ビジネスロジックに基づいてカスタムアルゴリズムを使用することもできます。
失敗したリクエストの再試行:接続エラー、タイムアウト、または 5xx レスポンスが原因でリクエストが失敗した場合、ローカルキャッシュから 異なる インスタンスでリクエストを再試行します。これには、少なくとも 2 つの利用可能なインスタンスが必要です。
関連ドキュメント
サービスの呼び出し方法の詳細については、「呼び出し方法の概要」をご参照ください。