すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:インスタンスにログインせずにJavaを使用してECSインスタンスを管理

最終更新日:Aug 26, 2024

Cloud Assistantを使用すると、複数のECS (Elastic Compute Service) インスタンスでコマンドを同時に実行できます。 コマンドには、シェル、バッチ、またはPowerShellコマンドを使用できます。 このトピックでは、ECS SDK for Javaを使用してCloud Assistant Agentのステータスを確認し、Cloud Assistantコマンドを実行し、Cloud Assistantコマンドの実行結果を照会する方法について説明します。

前提条件

  • ECSインスタンスのステータスが実行中 (実行中) です。 SDK For Javaを使用してECSインスタンスのステータスを確認する方法については、「ECSインスタンスの照会」をご参照ください。

  • SDK for Java 2.0が開発環境にインストールされています。 必要な依存関係がMavenプロジェクトに追加されます。 詳細については、MVNリポジトリを参照して、Mavenの最新バージョンをご覧ください。

  • シェル、バッチ、またはPowerShellコマンドは、インスタンス構成と実行する操作に基づいてコンパイルされます。

手順

  1. アカウントのAccessKey IDとAccessKeyシークレットで構成されるAccessKeyペアを取得し、リージョンIDを照会します。

    詳細については、「リージョンとゾーン」および「AccessKeyペアの取得」をご参照ください。

  2. RunCommandBestPracticeクラスを作成して、1つ以上のECSインスタンスでCloud Assistantコマンドを実行します。

    RunCommandBestPracticeクラスは、次のアクションを実行します。

    1. Cloud Assistant Agentのステータスを確認します。

      Cloud Assistant Agentは、実行中 状態の場合にのみリモートコマンドを実行できます。 このステップでは、RunCommandBestPracticeクラスは、Cloud Assistant Agent実行中 状態であるかどうかをチェックし、チェック結果に基づいてアクションを実行します。

      • Cloud Assistant Agentのステータスが 実行中 でない場合は、後でもう一度お試しください。

      • Cloud Assistant Agentのステータスが 実行中 の場合は、次の手順に進みます。

    2. 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******"
    	}
    }
  3. 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
}