VPC ダイレクト接続は、VPC (Virtual Private Cloud) 内のクライアントがパブリックゲートウェイをバイパスして EAS サービスインスタンスに直接アクセスできるようにする、パフォーマンス専有型のサービス呼び出しメソッドです。このトピックでは、VPC ダイレクト接続の仕組み、設定方法、および公式 SDK を使用するか、カスタム呼び出しロジックを実装してサービスを呼び出す方法について説明します。
機能概要
シナリオ
パフォーマンス専有型の要件: 画像または音声認識サービスなど、QPS (クエリ/秒) が多い高トラフィックサービスの場合、ダイレクト接続によってアクセスパフォーマンスが大幅に向上します。
低レイテンシーへの感度: オンラインレコメンデーションや金融リスク管理など、応答時間に対する厳しい要件があるサービスの場合、ダイレクト接続によってレイテンシーを効果的に削減できます。
仕組み
コアメカニズムには以下が含まれます:
ネットワーク接続性: サービスに VPC を設定すると、EAS は各サービスインスタンスに対して無料の補助 Elastic Network Interface (ENI) を作成し、指定された VPC と vSwitch にアタッチします。これにより、VPC と EAS サービスインスタンス間のネットワーク接続が確立されます。これにより、VPC 内のクライアントはゲートウェイを経由せずに EAS サービスインスタンスに直接アクセスできるため、レイヤー 4 SLB とレイヤー 7 ネットワーク転送を回避できます。
サービスディスカバリ: EAS は、クライアントがすべてのサービスインスタンスの
IP:PORTペアのリアルタイムリストを取得できるサービスディスカバリメカニズムを提供します。このリストに基づいて、クライアントはロードバランシングとフェールオーバーを実装できます。
準備
サービスを呼び出す前に、サービスに VPC が設定されていることを確認してください。詳細については、「ネットワーク設定」をご参照ください。
各 ENI は vSwitch 内の IP アドレスを 1 つ占有します。IP アドレスの要件を満たすために、vSwitch で利用可能な IP アドレスの数がサービスインスタンスの数以上であることを確認してください。
セキュリティグループルールを追加して、ネットワークの隔離とアクセスの制御を実装します。
重要ECS インスタンスなどのクライアントと EAS サービスインスタンス間のネットワークアクセスは、セキュリティグループルールによって制御されます。
デフォルトでは、基本セキュリティグループ内のインスタンスは、内部ネットワークを介して相互に通信できます。EAS サービスの VPC ダイレクト接続を設定する際に、EAS サービスにアクセスする必要がある ECS インスタンスが配置されているセキュリティグループを選択できます。
異なるセキュリティグループを使用するには、ECS インスタンス間の通信を許可するようにセキュリティグループルールを設定する必要があります。詳細については、「クラシックネットワーク内の異なるセキュリティグループのインスタンス間のアクセスを許可する」をご参照ください。
公式 SDK を使用した呼び出し (推奨)
公式 EAS SDK は、サービスディスカバリ、ロードバランシング、フェールオーバーリトライなどの複雑なロジックをカプセル化しています。VPC ダイレクト接続を介してサービスを呼び出すには、このメソッドを使用することをお勧めします。
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 は EAS サービスのリージョンです。 ENDPOINT = "123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com" # 実際の 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 依存関係を追加します。
プロジェクトに EAS SDK for Java を統合するには、pom.xml ファイルに eas-sdk 依存関係を追加します。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 メソッドを使用し、ドメイン名を 123**********.vpc.{region_id}.pai-eas.aliyuncs.com に設定します。123********** を UID に置き換えます。たとえば、中国 (上海) のリージョン 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); // EAS を介して文字列を返します。 try { String response = client.predict(request); System.out.println(response); } catch (Exception e) { e.printStackTrace(); } // クライアントをシャットダウンします。 client.shutdown(); return; } }
Golang SDK を使用した呼び出し
Golang SDK を使用してサービスを呼び出すと、Go パッケージマネージャがコンパイル中に GitHub から SDK を自動的にダウンロードします。したがって、事前に Golang SDK をインストールする必要はありません。詳細については、「Golang SDK ガイド」をご参照ください。
次のコードは、公式 Golang SDK を使用してサービスを呼び出す方法を示しています:
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
// アクセス用のドメイン名を 123**********.vpc.{region_id}.pai-eas.aliyuncs.com に設定します。123********** を UID に置き換えます。たとえば、中国 (上海) のリージョン 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
EAS は、VPC 環境でのサービスディスカバリ用の HTTP API を提供します。この API にアクセスすることで、サービスのすべてのバックエンドインスタンスの IP アドレス、ポート、および重みのリストを取得できます。
URL フォーマット:
http://<Alibaba Cloud アカウント ID>.vpc.<RegionID>.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_exampleアドレスの 123********** をご自身の UID に置き換えるようにしてください。
次のコードは、返されたバックエンドサービスアドレスのリストを示しています:
{
"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
}
]
}
}詳細な実装ロジック
堅牢なカスタムクライアント呼び出しには、次の 3 つのコアコンポーネントが含まれている必要があります:
インスタンスリストをローカルにキャッシュし、定期的にリフレッシュする
重要サービスディスカバリサービスはバイパスサービスです。推論リクエストごとにサービスディスカバリ API を呼び出さないでください。
クライアントは、バックグラウンドスレッドを開始し、サービスディスカバリ API を定期的に (たとえば 5〜10 秒ごとに) 呼び出します。
成功時: HTTP ステータスコードが 200 で、返されたインスタンスリストが空でない場合、ローカルキャッシュを新しいリストで上書きします。
失敗時: API 呼び出しが失敗した場合 (たとえば、タイムアウトや 200 以外のステータスコードが原因)、または呼び出しが空のリストを返した場合、ローカルキャッシュを引き続き使用する必要があります。キャッシュをクリアしないでください。これにより、サービスの可用性が確保されます。
リクエストのロードバランシング
推論リクエストを開始するたびに、ローカルキャッシュからターゲットインスタンスを選択します。重み付きラウンドロビンなどのアルゴリズムを使用することをお勧めします。ビジネスロジックに基づいてインスタンスを選択することもできます。
失敗時のリトライ
リクエストを開始したときに接続が失敗した場合、サービスインスタンスが異常である可能性があります (たとえば、ユーザーインスタンスがクラッシュしたなど)。クライアントはリトライする必要があります。ローカルキャッシュに複数のインスタンスが含まれている場合は、キャッシュから別のインスタンスを取得してリクエストをリトライします。
完全な実装フローについては、Python SDK の実装をご参照ください。
参考資料
他のサービス呼び出しメソッドの詳細については、「呼び出し方法の概要」をご参照ください。