Elastic Compute Service (ECS) インスタンスでアプリケーションの複数バージョンを実行する場合、フリート全体を再デプロイすることなく、バージョンを分離し、トラフィックを選択的にルーティングし、カナリアリリースを実行する方法が必要です。Enterprise Distributed Application Service (EDAS) のインスタンスグループを使用すると、ECS インスタンスをパーティション分割して、各グループが異なるアプリケーションバージョンを実行できるようになります。その後、グループ間でトラフィックをシフトさせ、小規模なグループで新しいバージョンを検証し、残りのグループにプロモートすることができます。
このトピックでは、EDAS Java SDK を使用した 5 つの操作について説明します。
クイックスタート
次の例では、Beta という名前のインスタンスグループを作成し、それをアプリケーションバージョンに関連付け、結果として得られるグループ ID を出力します。プレースホルダー ID はご自身の値に置き換えてください。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.InsertDeployGroupRequest;
import com.aliyuncs.edas.model.v20170801.InsertDeployGroupResponse;
public class QuickStart {
public static void main(String[] args) throws Exception {
String regionId = "cn-hangzhou";
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
InsertDeployGroupRequest request = new InsertDeployGroupRequest();
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
request.setGroupName("Beta");
request.setInitPackageVersionId("3fc52328-8746-4422-a742-94e0cfc7****");
InsertDeployGroupResponse response = client.getAcsResponse(request);
System.out.println("GroupName=" + response.getDeployGroupEntity().getGroupName()
+ "\nId=" + response.getDeployGroupEntity().getId());
}
}期待される出力:
GroupName=Beta
Id=941be68c-4aac-48a1-88fe-c9ad1502****インスタンスのグループ間移動、JVM および Tomcat の設定、グループの削除などの詳細な操作については、以降のセクションをご参照ください。
インスタンスグループの仕組み
EDAS コンソールでアプリケーションを作成すると、EDAS は自動的にデフォルトグループ (_DEFAULT_GROUP) を作成します。このデフォルトグループは削除できず、単一バージョンのデプロイメントには十分です。
複数バージョンのデプロイメントの場合は、バージョンを分離するために追加のグループを作成します。たとえば、itemcenter という名前のアプリケーションが 10 台の ECS インスタンスで実行されているとします。6 台のインスタンスはデフォルトグループに属し、4 台はベータグループに属します。各グループは、独自の JVM、Tomcat、起動テンプレート、および Server Load Balancer (SLB) 設定を持つことができます。
事前準備
このトピックのいずれかの操作を呼び出す前に、次のものが揃っていることを確認してください。
EDAS SDK for Java がインストール済みです。詳しくは、「EDAS SDK for Java を使用して EDAS API を呼び出す」をご参照ください。
アプリケーションが実行されているリージョン ID (例:
cn-hangzhou)(条件付き) インスタンスグループを作成する場合、アプリケーションバージョン ID。ListHistoryDeployVersion を呼び出し、
PackageVersion.Idの値を使用します。(条件付き) ECS インスタンスをグループ間で移動する場合、Elastic Compute Container (ECC) ID。ListApplicationEcc を呼び出し、
EccIdの値を使用します。ECS インスタンスが作成されていること (例:
i-bp13o01lzmbsvhsl****)ECS クラスターが作成されていること。詳細については、「API オペレーションを呼び出して ECS クラスターを作成する」をご参照ください。すでにクラスターがある場合は、ListCluster を呼び出し、
ClusterIdの値 (例:369d06d7-450b-4f3d-bf75-9536fcd9****) を使用します。
共通のクライアント設定
このトピックのすべての例は、同じクライアント初期化を共有します。いずれかの操作を実行する前に、一度だけ設定してください。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;
// アプリケーションが実行されているリージョン ID に置き換えます
String regionId = "cn-hangzhou";
// 環境変数から AccessKey 認証情報を取得します
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);コードを実行する前に、次の環境変数を設定してください。
| 変数 | 説明 |
|---|---|
ALIBABA_CLOUD_ACCESS_KEY_ID | ご利用の Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID |
ALIBABA_CLOUD_ACCESS_KEY_SECRET | ご利用の Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret |
インスタンスグループの作成
InsertDeployGroup を呼び出してインスタンスグループを作成し、アプリケーションバージョンに関連付けます。
パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| AppId | String | はい | アプリケーション ID。 |
| GroupName | String | はい | グループ名。英字、数字、アンダースコア (_)、ピリオド (.) を使用できます。最大 64 文字です。 |
| InitPackageVersionId | String | はい | グループを初期化するためのデプロイパッケージバージョン ID。ListHistoryDeployVersion を呼び出して取得します。 |
サンプルコード
import com.aliyuncs.edas.model.v20170801.InsertDeployGroupRequest;
import com.aliyuncs.edas.model.v20170801.InsertDeployGroupResponse;
InsertDeployGroupRequest request = new InsertDeployGroupRequest();
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
request.setGroupName("Beta");
request.setInitPackageVersionId("3fc52328-8746-4422-a742-94e0cfc7****");
try {
InsertDeployGroupResponse response = client.getAcsResponse(request);
System.out.println("GroupName=" + response.getDeployGroupEntity().getGroupName()
+ "\nId=" + response.getDeployGroupEntity().getId());
} catch (com.aliyuncs.exceptions.ClientException e) {
// 一般的なエラー:
// - Invalid AppId:指定されたアプリケーションが存在しません。
// - Duplicate GroupName:この名前のグループはすでに存在します。
e.printStackTrace();
}サンプルレスポンス
GroupName=Beta
Id=941be68c-4aac-48a1-88fe-c9ad1502****結果の確認
ListDeployGroup を呼び出し、新しいグループ名がレスポンスに含まれているかどうかを確認します。
{
"DeployGroupList": {
"DeployGroup": [
{
"GroupName": "Beta",
"AppId": "6bbc57a2-a017-4bec-b521-49a15bd3****",
"GroupId": "941be68c-4aac-48a1-88fe-c9ad1502****"
}
]
},
"Message": "success",
"Code": 200
}ECS インスタンスの別グループへの移動
ChangeDeployGroup を呼び出して、ECS インスタンスをあるインスタンスグループから別のインスタンスグループに移動します。
API 呼び出しごとに移動できる ECS インスタンスは 1 つだけです。
パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| AppId | String | はい | アプリケーション ID。 |
| EccInfo | String | はい | ECS インスタンスの ECC ID。ListApplicationEcc を呼び出して取得します。 |
| GroupName | String | はい | ターゲットグループ名。_DEFAULT_GROUP を使用して、インスタンスをデフォルトグループに戻します。 |
| ForceStatus | Boolean | いいえ | ECC のデプロイパッケージバージョンがターゲットグループと異なる場合に移動を強制します。デフォルト:false。 |
サンプルコード
import com.aliyuncs.edas.model.v20170801.ChangeDeployGroupRequest;
import com.aliyuncs.edas.model.v20170801.ChangeDeployGroupResponse;
ChangeDeployGroupRequest request = new ChangeDeployGroupRequest();
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
request.setEccInfo("4009a824-ce33-4ba0-9ca2-346249a9****");
request.setGroupName("Beta");
request.setForceStatus(true);
try {
ChangeDeployGroupResponse response = client.getAcsResponse(request);
System.out.println("Message=" + response.getMessage()
+ "\nChangeOrderId=" + response.getChangeOrderId());
} catch (com.aliyuncs.exceptions.ClientException e) {
// 一般的なエラー:
// - Invalid EccInfo:指定された ECC が存在しません。
// - Version mismatch:移動を強制するには、ForceStatus を true に設定します。
e.printStackTrace();
}サンプルレスポンス
Message=success結果の確認
ListApplicationEcc を呼び出し、ECS インスタンスの GroupId がターゲットグループと一致することを確認します。
{
"EccInfoList": {
"EccInfo": [
{
"EcuId": "8287bcf6-cde3-4377-8906-086d2c32****",
"GroupId": "941be68c-4aac-48a1-88fe-c9ad1502****",
"AppId": "6bbc57a2-a017-4bec-b521-49a15bd3****",
"EccId": "02cdcdfa-f22b-45e6-8a0f-a738c766****"
}
]
},
"Message": "success",
"Code": 200
}グループの JVM パラメーター設定
UpdateJvmConfiguration を呼び出して、特定のインスタンスグループの Java 仮想マシン (JVM) パラメーターを設定します。
パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| AppId | String | はい | アプリケーション ID。 |
| GroupId | String | はい | インスタンスグループ ID。ListDeployGroup を呼び出して取得します。 |
| MinHeapSize | Integer | いいえ | 初期ヒープサイズ (MB)。 |
| MaxHeapSize | Integer | いいえ | 最大ヒープサイズ (MB)。 |
| MaxPermSize | Integer | いいえ | Permanent 世代サイズ (MB)。 |
| Options | String | いいえ | カスタム JVM オプション (例:-Dproperty=value)。 |
サンプルコード
import com.aliyuncs.edas.model.v20170801.UpdateJvmConfigurationRequest;
import com.aliyuncs.edas.model.v20170801.UpdateJvmConfigurationResponse;
UpdateJvmConfigurationRequest request = new UpdateJvmConfigurationRequest();
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
request.setGroupId("941be68c-4aac-48a1-88fe-c9ad1502****");
request.setMinHeapSize(500);
request.setMaxHeapSize(500);
request.setMaxPermSize(500);
request.setOptions("-Dproperty=value");
try {
UpdateJvmConfigurationResponse response = client.getAcsResponse(request);
System.out.println("Message=" + response.getMessage());
} catch (com.aliyuncs.exceptions.ClientException e) {
// 一般的なエラー:
// - Invalid GroupId:指定されたインスタンスグループが存在しません。
e.printStackTrace();
}サンプルレスポンス
Message=success結果の確認
GetJvmConfiguration を呼び出して、更新された JVM 設定を確認します。
{
"Message": "success",
"JvmConfiguration": {
"Options": "-Dproperty=value",
"MaxPermSize": 500,
"MaxHeapSize": 500,
"MinHeapSize": 500
},
"Code": 200
}グループの Tomcat パラメーター設定
UpdateContainerConfiguration を呼び出して、特定のインスタンスグループの Tomcat コンテナパラメーターを設定します。
パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| AppId | String | はい | アプリケーション ID。 |
| GroupId | String | はい | インスタンスグループ ID。ListDeployGroup を呼び出して取得します。 |
| ContextPath | String | いいえ | Tomcat コンテキストパス。有効な値:空の文字列、null、WAR パッケージ名、ROOT (ルートディレクトリ)、またはカスタム文字列。 |
| HttpPort | Integer | いいえ | アプリケーションポート (例:8080)。 |
| MaxThreads | Integer | いいえ | 最大スレッド数。 |
| URIEncoding | String | いいえ | URI エンコーディングスキーム。有効な値:ISO-8859-1、GBK、GB2312、UTF-8。 |
| UseBodyEncoding | Boolean | いいえ | URI クエリパラメーターにリクエストボディのエンコーディングスキームを使用するかどうか。デフォルト:false。 |
サンプルコード
import com.aliyuncs.edas.model.v20170801.UpdateContainerConfigurationRequest;
import com.aliyuncs.edas.model.v20170801.UpdateContainerConfigurationResponse;
UpdateContainerConfigurationRequest request = new UpdateContainerConfigurationRequest();
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
request.setGroupId("941be68c-4aac-48a1-88fe-c9ad1502****");
request.setContextPath("");
request.setHttpPort(8080);
request.setMaxThreads(20);
request.setURIEncoding("ISO-8859-1");
request.setUseBodyEncoding(true);
try {
UpdateContainerConfigurationResponse response = client.getAcsResponse(request);
System.out.println("Message=" + response.getMessage());
} catch (com.aliyuncs.exceptions.ClientException e) {
// 一般的なエラー:
// - Invalid GroupId:指定されたインスタンスグループが存在しません。
e.printStackTrace();
}サンプルレスポンス
Message=success結果の確認
GetContainerConfiguration を呼び出して、更新された Tomcat 設定を確認します。
{
"Message": "success",
"ContainerConfiguration": {
"HttpPort": 8080,
"ContextPath": "ROOT",
"UseBodyEncoding": true,
"URIEncoding": "ISO-8859-1",
"MaxThreads": 20
},
"Code": 200
}インスタンスグループの削除
DeleteDeployGroup を呼び出してインスタンスグループを削除します。
ECS インスタンスを含むインスタンスグループは削除できません。まず、すべてのインスタンスを別のグループに移動してください。詳細については、「ECS インスタンスの別グループへの移動」をご参照ください。
パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| AppId | String | はい | アプリケーション ID。 |
| GroupName | String | はい | 削除するインスタンスグループの名前。 |
サンプルコード
import com.aliyuncs.edas.model.v20170801.DeleteDeployGroupRequest;
import com.aliyuncs.edas.model.v20170801.DeleteDeployGroupResponse;
DeleteDeployGroupRequest request = new DeleteDeployGroupRequest();
request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
request.setGroupName("Beta");
try {
DeleteDeployGroupResponse response = client.getAcsResponse(request);
System.out.println("Message=" + response.getMessage()
+ "\nData=" + response.getData());
} catch (com.aliyuncs.exceptions.ClientException e) {
// 一般的なエラー:
// - Group not empty:削除する前に、すべてのインスタンスを別のグループに移動してください。
// - Invalid GroupName:指定されたグループが存在しません。
e.printStackTrace();
}サンプルレスポンス
Message=success
Data=1結果の確認
ListDeployGroup を呼び出し、削除されたグループがレスポンスに表示されなくなったことを確認します。
{
"DeployGroupList": {
"DeployGroup": [
{
"GroupName": "_DEFAULT_GROUP",
"AppId": "6bbc57a2-a017-4bec-b521-49a15bd3****",
"GroupId": "941be68c-4aac-48a1-88fe-c9ad1502****"
}
]
},
"Message": "success",
"Code": 200
}エラー処理
すべての EDAS SDK オペレーションは、ClientException (無効なパラメーターやネットワークの問題などのクライアント側エラー) または ServerException (サーバー側エラー) をスローします。次の表に、一般的なエラーシナリオとソリューションを示します。
| 操作 | エラーシナリオ | ソリューション |
|---|---|---|
InsertDeployGroup | グループ名の重複 | 別のグループ名を選択するか、ListDeployGroup を使用して既存のグループをクエリします。 |
InsertDeployGroup | 無効な InitPackageVersionId | ListHistoryDeployVersion を呼び出して、有効なバージョン ID を取得します。 |
ChangeDeployGroup | ECC とターゲットグループ間のバージョン不一致 | ForceStatus を true に設定して、移動を強制します。 |
ChangeDeployGroup | 無効な EccInfo | ListApplicationEcc を呼び出して、有効な ECC ID を取得します。 |
DeleteDeployGroup | グループに ECS インスタンスが含まれている | 削除する前に、すべてのインスタンスを別のグループに移動します。 |
| すべての操作 | 無効な AppId | アプリケーションが存在し、アクセス権があることを確認してください。 |
関連 API
| 操作 | 説明 |
|---|---|
| InsertDeployGroup | インスタンスグループを作成します。 |
| ChangeDeployGroup | ECS インスタンスを別のグループに移動します。 |
| UpdateJvmConfiguration | インスタンスグループの JVM パラメーターを設定します。 |
| UpdateContainerConfiguration | インスタンスグループの Tomcat パラメーターを設定します。 |
| デプロイグループの削除 | インスタンスグループを削除します。 |
| ListDeployGroup | アプリケーションのインスタンスグループをクエリします。 |
| ListHistoryDeployVersion | 過去のデプロイメントバージョンをクエリします。 |
| ListApplicationEcc | アプリケーションの ECC 情報をクエリします。 |
| GetJvmConfiguration | インスタンスグループの JVM 設定をクエリします。 |
| GetContainerConfiguration | インスタンスグループの Tomcat 設定をクエリします。 |
| ListCluster | ECS クラスターをクエリします。 |