Cloud Assistantを使用すると、複数のECS (Elastic Compute Service) インスタンスでコマンドを同時に実行できます。 コマンドには、シェル、バッチ、またはPowerShellコマンドを使用できます。 このトピックでは、ECS SDK for Javaを使用してCloud Assistant Agentのステータスを確認し、Cloud Assistantコマンドを実行し、Cloud Assistantコマンドの実行結果を照会する方法について説明します。
前提条件
Cloud Assistant Agentは、管理するECSインスタンスにインストールされています。 詳細については、「Cloud Assistant Agentのインストール」をご参照ください。
ALIBABA_CLOUD_ACCESS_KEY_ID環境変数とALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数は、コードランタイム環境で設定されます。 詳細については、「Linux、macOS、およびWindowsでの環境変数の設定」をご参照ください。
ECSインスタンスのステータスが実行中 (
実行中
) です。 SDK For Javaを使用してECSインスタンスのステータスを確認する方法については、「ECSインスタンスの照会」をご参照ください。SDK for Java 2.0が開発環境にインストールされています。 必要な依存関係がMavenプロジェクトに追加されます。 詳細については、MVNリポジトリを参照して、Mavenの最新バージョンをご覧ください。
シェル、バッチ、またはPowerShellコマンドは、インスタンス構成と実行する操作に基づいてコンパイルされます。
手順
アカウントのAccessKey IDとAccessKeyシークレットで構成されるAccessKeyペアを取得し、リージョンIDを照会します。
詳細については、「リージョンとゾーン」および「AccessKeyペアの取得」をご参照ください。
RunCommandBestPracticeクラスを作成して、1つ以上のECSインスタンスでCloud Assistantコマンドを実行します。
RunCommandBestPracticeクラスは、次のアクションを実行します。
Cloud Assistant Agentのステータスを確認します。
Cloud Assistant Agentは、実行中 状態の場合にのみリモートコマンドを実行できます。 このステップでは、RunCommandBestPracticeクラスは、Cloud Assistant Agentが 実行中 状態であるかどうかをチェックし、チェック結果に基づいてアクションを実行します。
Cloud Assistant Agentのステータスが 実行中 でない場合は、後でもう一度お試しください。
Cloud Assistant Agentのステータスが 実行中 の場合は、次の手順に進みます。
ECSインスタンスでCloud Assistantコマンドを実行します。
サンプルコード:
import com.aliyun.auth.credentials.Credential; import com.aliyun.auth.credentials.provider.StaticCredentialProvider; import com.aliyun.sdk.service.ecs20140526.models.RunCommandRequest; import com.aliyun.sdk.service.ecs20140526.models.RunCommandResponse; import com.aliyun.sdk.service.ecs20140526.AsyncClient; import com.google.gson.Gson; import darabonba.core.client.ClientOverrideConfiguration; import java.util.concurrent.CompletableFuture; public class RunCommand { public static void main(String[] args) throws Exception { // Configure credentials, including an AccessKey ID, an AccessKey secret, and a token. StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() // Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables are configured in the on-premises environment. .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")) //.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // Use a Security Token Service (STS) token. .build()); // Configure a client. AsyncClient client = AsyncClient.builder() // You must specify a region ID. .region("cn-nanjing") // Use a configured HTTP client. If no HTTP client is configured, Apache HttpClient is used. Apache HttpClient is the default HTTP client. .credentialsProvider(provider) // Configure the service-level settings. // Rewrite the client-level settings, including the endpoint and HTTP request parameters. .overrideConfiguration( ClientOverrideConfiguration.create() // Specify an endpoint. You can view endpoints at https://api.aliyun.com/product/Ecs. .setEndpointOverride("ecs.cn-nanjing.aliyuncs.com") ) .build(); // Configure the API request parameters. RunCommandRequest runCommandRequest = RunCommandRequest.builder() // The region ID. .regionId("cn-nanjing") // The type of the command. .type("RunShellScript") .commandContent("yourScript") // The script that you want to execute. .instanceId(java.util.Arrays.asList( // The IDs of instances. You must specify this parameter. "i-gc75qem27b6n******" )) // Rewrite the request-level settings, including the HTTP request parameters. // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders())) .build(); // Asynchronously obtain the response to the API request. CompletableFuture<RunCommandResponse> response = client.runCommand(runCommandRequest); // Synchronously obtain the response to the API request. RunCommandResponse resp = response.get(); System.out.println(new Gson().toJson(resp)); // Close the client. client.close(); } }
説明Cloud Assistant Agentが非実行状態のままである場合、次の操作を実行して問題のトラブルシューティングを行うことを推奨します。
Cloud Assistant Agentがインストールされているかどうかを確認します。 デフォルトでは、12月1日2017以降にパブリックイメージから作成されたECSインスタンスには、Cloud Assistant Agentがプリインストールされています。 Cloud Assistant AgentがECSインスタンスにインストールされていない場合は、インスタンスにCloud Assistant Agentをインストールします。 詳細については、「Cloud Assistant Agentのインストール」をご参照ください。
ネットワーク設定を確認します。 ECSインスタンスでドメイン名解決またはネットワークリクエストを実行でき、Cloud Assistantのエンドポイントに
https://{regionI d}.axt.aliyun.com
の形式でアクセスできることを確認してください。 {regionId} をECSインスタンスのリージョンIDに置き換えます。
次のような応答が返されます。 Cloud AssistantコマンドのタスクIDを示すInvokeIdの値を記録します。
{ "headers":{ "Keep-Alive":"timeout=25", "Access-Control-Expose-Headers":"*", "Access-Control-Allow-Origin":"*", "ETag":"1CT+jOmffBsGnpxVQRtwUaw5", "x-acs-request-id":"E14423A1-4D3C-5FA9-BE6D-E5D9E******", "Connection":"keep-alive", "Content-Length":"115", "Date":"Tue, 30 Jul 2024 05:28:59 GMT", "Content-Type":"application/json;charset=utf-8", "x-acs-trace-id":"1e73536caf966986c0de6******" }, "statusCode":200, "body":{ "commandId":"c-nj04s3ja******", "invokeId":"t-nj04s3j******", "requestId":"E14423A1-4D3C-5FA9-BE6D-E5D9E******" } }
DescribeInvocationsSample.javaクラスを作成して、コマンドが正常に実行されたかどうかを確認します。
import com.aliyun.auth.credentials.Credential; import com.aliyun.auth.credentials.provider.StaticCredentialProvider; import com.aliyun.sdk.service.ecs20140526.models.*; import com.aliyun.sdk.service.ecs20140526.*; import com.google.gson.Gson; import darabonba.core.client.ClientOverrideConfiguration; import java.util.concurrent.CompletableFuture; public class DescribeInvocations { public static void main(String[] args) throws Exception { StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() // Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables are configured in the on-premises environment. .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")) .build()); AsyncClient client = AsyncClient.builder() // You must specify a region ID. .region("cn-nanjing") .credentialsProvider(provider) .overrideConfiguration( ClientOverrideConfiguration.create() // Specify an endpoint. You can view endpoints at https://api.aliyun.com/product/Ecs. .setEndpointOverride("ecs.cn-nanjing.aliyuncs.com") ) .build(); DescribeInvocationsRequest describeInvocationsRequest = DescribeInvocationsRequest.builder() .regionId("cn-nanjing") // You must enter the task ID of the Cloud Assistant command that you recorded. .invokeId("t-nj04s3ja******") .build(); CompletableFuture<DescribeInvocationsResponse> response = client.describeInvocations(describeInvocationsRequest); DescribeInvocationsResponse resp = response.get(); System.out.println(new Gson().toJson(resp)); client.close(); } }
実行結果
次のような応答が返されます。 InvokeInstances操作を呼び出して、コマンドの実行ステータスと結果を表示できます。 詳細については、「DescribeInvocations」をご参照ください。
{
"body":{
"invocations":{
"invocation":[
{
"commandContent":"eW91clNjc******",
"commandDescription":"",
"commandId":"c-nj04s3j******",
"commandName":"cmd-2024-07-30",
"commandType":"RunShellScript",
"containerId":"",
"containerName":"",
"creationTime":"2024-07-30T05:28:59Z",
"frequency":"",
"invocationStatus":"Failed",
"invokeId":"t-nj04s3******",
"invokeInstances":{
"invokeInstance":[
{
"creationTime":"2024-07-30T05:28:59Z",
"dropped":0,
"errorCode":"ExitCodeNonzero",
"errorInfo":"the command execution exit code is not zero.",
"exitCode":127,
"finishTime":"2024-07-30T05:29:01Z",
"instanceId":"i-gc75qem27b6n5******",
"instanceInvokeStatus":"Finished",
"invocationStatus":"Failed",
"output":******
"repeats":1,
"startTime":"2024-07-30T05:29:00Z",
"stopTime":"",
"timed":false,
"updateTime":"2024-07-30T05:29:01Z"
}
]
},
"invokeStatus":"Finished",
"parameters":"{}",
"repeatMode":"Once",
"tags":{
"tag":[]
},
"terminationMode":"Process",
"timed":false,
"timeout":60,
"username":"",
"workingDir":""
}
]
},
"nextToken":"",
"pageNumber":1,
"pageSize":10,
"requestId":"7AB4D3FF-E251-5235-99C4-1A18099E0F01",
"totalCount":1
},
"headers":{
"Access-Control-Allow-Origin":"*",
"Access-Control-Expose-Headers":"*",
"Connection":"keep-alive",
"Content-Length":"1207",
"Content-Type":"application/json;charset=utf-8",
"Date":"Tue, 30 Jul 2024 05:41:14 GMT",
"ETag":"13/WTudylqHr+WPQBunND8g7",
"Keep-Alive":"timeout=25",
"Vary":"Accept-Encoding",
"x-acs-request-id":"7AB4D3FF-E251-5235-99C4******",
"x-acs-trace-id":"028dd251acfb4dbfceac9b56e******f"
},
"statusCode":200
}