Alibaba Cloud Elastic Compute Service (ECS) met à votre disposition diverses API et kits de développement logiciel (SDK) pour créer et gérer des instances ECS par programmation. Cette approche améliore l'efficacité opérationnelle et permet d'automatiser vos systèmes. Cette rubrique explique comment utiliser le SDK Java V2.0 pour créer une instance ECS, exécuter un script via Cloud Assistant, puis libérer les ressources associées.
Prérequis
Une clé AccessKey associée à un compte Alibaba Cloud dispose de toutes les autorisations sur l'ensemble des ressources. La divulgation d'une telle clé expose votre environnement à des risques de sécurité majeurs. Nous vous recommandons d'utiliser la clé AccessKey d'un utilisateur Resource Access Management (RAM) disposant uniquement des autorisations minimales requises. Pour plus d'informations, consultez la rubrique Créer une clé AccessKey.
-
Accordez à l'utilisateur RAM les autorisations nécessaires pour gérer les ressources Elastic Compute Service (ECS) et Virtual Private Cloud (VPC). L'exemple de code présenté dans cette rubrique crée des ressources telles que des instances, des VPC et des vSwitches. Attribuez les politiques suivantes :
Produits cloud
Autorisations à accorder
Virtual Private Cloud (VPC)
Cet exemple utilise la politique système : AliyunVPCFullAccess
Elastic Compute Service (ECS)
Cet exemple utilise la politique système : AliyunECSFullAccess
L'exemple de code de cette rubrique récupère la clé AccessKey depuis les variables d'environnement du système pour s'authentifier auprès des services Alibaba Cloud. Pour en savoir plus, consultez la section Configurer les variables d'environnement sous Linux, macOS et Windows.
-
Téléchargez les SDK ECS et VPC. Cette rubrique détaille l'installation des SDK via l'ajout de dépendances Maven. Pour découvrir d'autres méthodes d'installation, reportez-vous aux guides Installer le SDK Java ECS et Installer le SDK Java VPC.
Créer une instance ECS
La création d'une instance ECS exige la définition de nombreux paramètres obligatoires, tels que l'ID du vSwitch, le groupe de sécurité ou l'image système. Vous pouvez soit réutiliser les identifiants de ressources existantes, soit invoquer les opérations OpenAPI suivantes pour provisionner ces éléments.
-
Créer un VPC
Un Virtual Private Cloud (VPC) constitue un réseau privé isolé logiquement dans le cloud, vous permettant de configurer et de gérer votre propre espace réseau.
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
CidrBlock
Plage CIDR du VPC : 192.168.0.0/16
-
Interroger les informations du VPC
Après l'appel à l'opération CreateVpc, le VPC nécessite un délai de configuration. Utilisez cette opération OpenAPI pour vérifier l'état du VPC. N'invoquez les opérations suivantes qu'une fois que le statut du VPC est passé à Available.
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
VpcId
ID du VPC : vpc-bp1aag0sb9s4i92i3****
-
Créer un vSwitch
Un vSwitch agit comme un commutateur réseau au sein d'un environnement virtualisé. Il émule les fonctions d'un switch physique afin d'établir la connectivité entre les machines virtuelles (VM) ainsi qu'entre les VM et le réseau physique.
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
ZoneId
Zone : cn-hangzhou-i
VpcId
ID du VPC : vpc-bp1aag0sb9s4i92i3****
CidrBlock
Plage CIDR du vSwitch : 192.168.0.0/24
-
Créer un groupe de sécurité
Un groupe de sécurité fonctionne comme un pare-feu virtuel régulant le trafic entrant et sortant des instances ECS.
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
VpcId
ID du VPC : vpc-bp1aag0sb9s4i92i3****
-
Ajouter une règle au groupe de sécurité
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
SecurityGroupId
ID du groupe de sécurité : sg-bp1esyhwfbqeyudt****
IpProtocol
Protocole : tcp
SourceCidrIp
Plage CIDR source : 0.0.0.0/0
PortRange
Plage de ports :
-
Pour une instance Linux : 22/22
-
Pour une instance Windows : 3389/3389
-
-
Créer une paire de clés SSH
Une paire de clés SSH Alibaba Cloud offre une méthode d'authentification sécurisée et pratique pour les connexions via le protocole Secure Shell (SSH). Elle assure à la fois la vérification d'identité et le chiffrement des communications, permettant une connexion distante sans mot de passe.
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
KeyPairName
Nom de la paire de clés : sdk-key-pair
-
Créer une instance ECS
ECS vous permet de déployer et d'exécuter rapidement des applications, d'ajuster les ressources avec flexibilité selon l'évolution de vos besoins métier, tout en bénéficiant d'une infrastructure informatique performante, sécurisée et économique. Ce service s'adapte à divers scénarios, notamment l'hébergement web, le développement d'applications ou le traitement de données.
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
ImageId
Image : utilisez l'image Alibaba Cloud Linux aliyun_3_x64_20G_scc_alibase_20220225.vhd.
InstanceType
Type d'instance : ecs.e-c1m2.xlarge.
SecurityGroupId
ID du groupe de sécurité : sg-bp1esyhwfbqeyudt****
VSwitchId
ID du vSwitch : vsw-bp1nzprm8h7mmnl8t****
InstanceName
Nom de l'instance : sdk-test
InstanceChargeType
Mode de facturation : l'instance est facturée en mode paiement à l'utilisation (PostPaid).
RemarqueAssurez-vous que le solde de votre compte est suffisant pour couvrir les frais.
KeyPairName
Nom de la paire de clés : sdk-key-pair
SystemDisk.Category
Type de disque système : cloud_essd
-
Interroger l'état de l'instance ECS
Suite à l'appel de l'opération RunInstances, l'instance ECS met un certain temps à démarrer. Vous ne pourrez effectuer des actions telles que les connexions à distance ou les déploiements d'applications qu'une fois l'instance passée à l'état Running. Utilisez cette opération OpenAPI pour suivre le statut de l'instance.
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
InstanceId
ID des instances : ["i-bp17f3kzgtzzj91r****"]
Voici un exemple complet illustrant ces étapes :
import com.aliyun.ecs20140526.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.vpc20160428.models.CreateVSwitchRequest;
import com.aliyun.vpc20160428.models.CreateVSwitchResponse;
import com.aliyun.vpc20160428.models.CreateVpcRequest;
import com.aliyun.vpc20160428.models.CreateVpcResponse;
import com.aliyun.vpc20160428.models.DescribeVpcsRequest;
import java.util.ArrayList;
import java.util.List;
public class EcsDemo {
public static void main(String[] args) {
String vpcId = null;
String vSwitchId = null;
String securityGroupId = null;
String instanceId = null;
com.aliyun.vpc20160428.Client vpcClient = null;
com.aliyun.ecs20140526.Client ecsClient = null;
try {
vpcClient = createVpcClient();
ecsClient = createEcsClient();
// Create a VPC.
vpcId = createVpc(vpcClient);
System.out.println("VPC create success, vpcId :" + vpcId);
// Proceed to the next step only after the VPC is in the Available state.
while (true) {
String status = describeVpc(vpcId, vpcClient);
if ("Available".equals(status)) {
break;
}
}
// Create a vSwitch.
vSwitchId = CreateVSwitch(vpcId, vpcClient);
System.out.println("VSwitch create success, vSwitchId :" + vSwitchId);
// Create a security group.
securityGroupId = createSecurityGroup(vpcId, ecsClient);
System.out.println("SecurityGroup create success, securityGroupId :" + securityGroupId);
// Add an inbound rule to the security group.
authorizeSecurityGroup(securityGroupId, ecsClient);
// Create a key pair. Note: Save the key pair information to log on to the ECS instance.
CreateKeyPairResponse keyPair = createKeyPair(ecsClient);
System.out.println("KeyPair create success, keyPairName :" + keyPair.body.keyPairName);
// Create an instance. The instance is running when its status is Running.
instanceId = createInstance(ecsClient, vSwitchId, securityGroupId);
System.out.println("ECS create success, instanceId :" + instanceId);
while (true) {
List<String> instanceIds = new ArrayList<>();
instanceIds.add(instanceId);
DescribeInstanceStatusResponse describeInstanceStatus = describeInstanceStatus(instanceIds, ecsClient);
List<DescribeInstanceStatusResponseBody.DescribeInstanceStatusResponseBodyInstanceStatusesInstanceStatus> instanceStatusList = describeInstanceStatus.body.instanceStatuses.instanceStatus;
if (instanceStatusList != null && !instanceStatusList.isEmpty()) {
String status = instanceStatusList.get(0).status;
if ("Running".equals(status)) {
break;
}
}
}
} catch (Exception e) {
// If some resources are created but others fail, add a proper handling mechanism, such as logging, rollback, or compensation.
System.out.println(e.getMessage());
}
}
public static class Constants {
// Name
public static final String NAME = "sdk-test";
// Region
public static final String REGION_ID = "cn-hangzhou";
// Zone
public static final String ZONE_ID = "cn-hangzhou-i";
// The CIDR blocks of the VPC and vSwitch to be created
public static final String CIDR_BLOCK_VPC = "192.168.0.0/16";
public static final String CIDR_BLOCK_VSWITCH = "192.168.0.0/24";
// Image
public static final String IMAGE_ID = "aliyun_3_x64_20G_scc_alibase_20220225.vhd";
// Instance type
public static final String INSTANCE_TYPE = "ecs.e-c1m2.xlarge";
// Disk type
public static final String SYSTEM_DISK_CATEGORY = "cloud_essd";
// Key pair name
public static final String KEY_PAIR_NAME = "sdk-key-pair";
// Endpoint
public static final class ENDPOINT {
public static final String VPC = "vpc.cn-hangzhou.aliyuncs.com";
public static final String ECS = "ecs.cn-hangzhou.aliyuncs.com";
}
// Billing method
public static final class INSTANCE_CHARGE_TYPE {
// Subscription
public static final String PRE_PAID = "PrePaid";
// Pay-as-you-go
public static final String POST_PAID = "PostPaid";
}
}
public static com.aliyun.vpc20160428.Client createVpcClient() throws Exception {
Config config = new Config();
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = Constants.ENDPOINT.VPC;
return new com.aliyun.vpc20160428.Client(config);
}
public static com.aliyun.ecs20140526.Client createEcsClient() throws Exception {
Config config = new Config();
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = Constants.ENDPOINT.ECS;
return new com.aliyun.ecs20140526.Client(config);
}
/**
* Creates a virtual private cloud (VPC) network.
* This method calls the API of the VPC service to create a VPC network and returns the ID of the new VPC.
*
* @param vpcClient The VPC client.
* @return Returns the ID of the new VPC.
*/
public static String createVpc(com.aliyun.vpc20160428.Client vpcClient) {
try {
CreateVpcRequest createVpcRequest = new CreateVpcRequest()
.setRegionId(Constants.REGION_ID)
.setCidrBlock(Constants.CIDR_BLOCK_VPC)
.setVpcName(Constants.NAME);
CreateVpcResponse vpc = vpcClient.createVpc(createVpcRequest);
return vpc.body.vpcId;
} catch (Exception e) {
throw new RuntimeException("createVpc failed: " + e.getMessage());
}
}
/**
* Creates a vSwitch.
* This method creates a new vSwitch using the Alibaba Cloud VPC client. It configures the required request parameters, such as the region ID, zone ID,
* CIDR block, VPC ID, and vSwitch name, then sends the request and returns the ID of the new vSwitch.
*
* @param vpcId The ID of the VPC in which to create the vSwitch.
* @param vpcClient The VPC client.
* @return Returns the ID of the new vSwitch.
*/
public static String CreateVSwitch(String vpcId, com.aliyun.vpc20160428.Client vpcClient) {
try {
CreateVSwitchRequest createVSwitchRequest = new CreateVSwitchRequest()
.setRegionId(Constants.REGION_ID)
.setZoneId(Constants.ZONE_ID)
.setCidrBlock(Constants.CIDR_BLOCK_VSWITCH)
.setVpcId(vpcId)
.setVSwitchName(Constants.NAME);
CreateVSwitchResponse vSwitch = vpcClient.createVSwitch(createVSwitchRequest);
return vSwitch.body.vSwitchId;
} catch (Exception e) {
throw new RuntimeException("CreateVSwitch failed: " + e.getMessage());
}
}
/**
* Creates a security group.
*
* @param vpcId The ID of the VPC.
* @param ecsClient The ECS client.
* @return The ID of the created security group.
*/
public static String createSecurityGroup(String vpcId, com.aliyun.ecs20140526.Client ecsClient) {
try {
CreateSecurityGroupRequest createSecurityGroupRequest = new CreateSecurityGroupRequest()
.setRegionId(Constants.REGION_ID)
.setVpcId(vpcId)
.setSecurityGroupName(Constants.NAME);
CreateSecurityGroupResponse securityGroup = ecsClient.createSecurityGroup(createSecurityGroupRequest);
return securityGroup.body.securityGroupId;
} catch (Exception e) {
throw new RuntimeException("createSecurityGroup failed: " + e.getMessage());
}
}
/**
* Authorizes a security group rule to allow specific inbound traffic.
* For example, allow access from any IP address (0.0.0.0/0) over TCP on port 22 (SSH).
*
* @param securityGroupId The ID of the security group for which to authorize the rule.
* @param ecsClient The ECS client.
*/
public static void authorizeSecurityGroup(String securityGroupId, com.aliyun.ecs20140526.Client ecsClient) {
try {
AuthorizeSecurityGroupRequest.AuthorizeSecurityGroupRequestPermissions permission = new AuthorizeSecurityGroupRequest.AuthorizeSecurityGroupRequestPermissions()
.setIpProtocol("tcp")
.setPortRange("22/22")
.setSourceCidrIp("0.0.0.0/0");
List<AuthorizeSecurityGroupRequest.AuthorizeSecurityGroupRequestPermissions> permissions = new ArrayList<>();
permissions.add(permission);
AuthorizeSecurityGroupRequest authorizeSecurityGroupRequest = new AuthorizeSecurityGroupRequest()
.setRegionId(Constants.REGION_ID)
.setSecurityGroupId(securityGroupId)
.setPermissions(permissions);
ecsClient.authorizeSecurityGroup(authorizeSecurityGroupRequest);
} catch (Exception e) {
throw new RuntimeException("authorizeSecurityGroup failed: " + e.getMessage());
}
}
/**
* Creates an ECS instance.
*
* @param ecsClient The ECS client.
* @param vSwitchId The vSwitch ID.
* @param securityGroupId The security group ID.
* @return The ID of the new ECS instance.
*/
public static String createInstance(com.aliyun.ecs20140526.Client ecsClient, String vSwitchId, String securityGroupId) {
try {
RunInstancesRequest.RunInstancesRequestSystemDisk systemDisk = new RunInstancesRequest.RunInstancesRequestSystemDisk()
.setCategory(Constants.SYSTEM_DISK_CATEGORY);
RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
.setRegionId(Constants.REGION_ID)
.setImageId(Constants.IMAGE_ID)
.setInstanceType(Constants.INSTANCE_TYPE)
.setSecurityGroupId(securityGroupId)
.setVSwitchId(vSwitchId)
.setInstanceChargeType(Constants.INSTANCE_CHARGE_TYPE.POST_PAID)
.setInstanceName(Constants.NAME)
.setInternetMaxBandwidthOut(1)
.setSystemDisk(systemDisk)
.setKeyPairName(Constants.KEY_PAIR_NAME);
RunInstancesResponse resp = ecsClient.runInstances(runInstancesRequest);
return resp.body.getInstanceIdSets().getInstanceIdSet().get(0);
} catch (Exception e) {
throw new RuntimeException("createInstance failed: " + e.getMessage());
}
}
/**
* Creates a key pair using the specified security group ID.
*
* @param ecsClient The ECS client.
* @return Returns the response object for creating the key pair.
*/
public static CreateKeyPairResponse createKeyPair(com.aliyun.ecs20140526.Client ecsClient) {
try {
// Create a request object to create a key pair, and set the region ID and key pair name.
CreateKeyPairRequest createKeyPairRequest = new CreateKeyPairRequest()
.setRegionId(Constants.REGION_ID)
.setKeyPairName(Constants.KEY_PAIR_NAME);
// Send the request to create the key pair using the ECS client and return the response object.
return ecsClient.createKeyPair(createKeyPairRequest);
} catch (Exception e) {
// If the key pair fails to be created, throw a runtime exception that contains the error message.
throw new RuntimeException("createKeyPair failed: " + e.getMessage());
}
}
/**
* Queries the VPC status.
*
* @param vpcId The ID of the VPC.
* @param vpcClient The VPC client.
* @return Returns the status of the VPC.
*/
public static String describeVpc(String vpcId, com.aliyun.vpc20160428.Client vpcClient) {
try {
DescribeVpcsRequest request = new DescribeVpcsRequest()
.setRegionId(Constants.REGION_ID)
.setVpcId(vpcId);
return vpcClient.describeVpcs(request).body.vpcs.getVpc().get(0).status;
} catch (Exception e) {
// If an exception occurs, throw a custom exception.
throw new RuntimeException("describeVpc failed: " + e.getMessage());
}
}
/**
* Queries ECS instance information based on a list of instance IDs.
*
* @param instanceIds A list of instance IDs.
* @param ecsClient The ECS client.
* @return Returns the response object that contains the instance status information.
*/
public static DescribeInstanceStatusResponse describeInstanceStatus(List<String> instanceIds, com.aliyun.ecs20140526.Client ecsClient) {
try {
DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest()
.setRegionId(Constants.REGION_ID)
.setInstanceId(instanceIds);
return ecsClient.describeInstanceStatus(request);
} catch (Exception e) {
throw new RuntimeException("describeInstanceStatus failed: " + e.getMessage());
}
}
}
Maintenance sans mot de passe
Cloud Assistant, outil natif d'automatisation des opérations fourni par Elastic Compute Service (ECS), permet d'exécuter des commandes par lots (Shell, PowerShell, Batch, etc.) sans nécessiter de mots de passe, de connexions manuelles ou de serveurs de rebond. Cette solution facilite l'exécution de scripts automatisés, la surveillance de processus, l'installation ou la désinstallation de logiciels, le démarrage ou l'arrêt de services, ainsi que l'application de correctifs ou de mises à jour de sécurité. Pour approfondir le sujet, consultez la rubrique Présentation de Cloud Assistant.
Par exemple, pour installer Java et Tomcat sur une instance ECS, invoquez l'opération RunCommand :
|
API |
Paramètre |
Valeur d'exemple |
|
RegionId |
Région : cn-hangzhou |
|
|
Type |
Type de langage de la commande O&M : RunShellScript |
|
|
CommandContent |
Contenu de la commande :
|
|
|
Timeout |
Facultatif. Délai d'expiration pour l'exécution de la commande, exprimé en secondes. Exemple : 60 |
|
|
InstanceId |
ID des instances ECS : ["i-bp17f3kzgtzzj91r****"] |
L'extrait suivant propose une implémentation complète :
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.RunCommandRequest;
import com.aliyun.ecs20140526.models.RunCommandResponse;
import com.aliyun.teaopenapi.models.Config;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
public class CloudAssistant {
public static void main(String[] args) throws Exception {
Client ecsClient = createEcsClient();
List<String> instanceIds = new ArrayList<>();
instanceIds.add("i-bp17f3kzgtzzj91r****");
String commandContent = "#!/bin/bash\n" +
"if cat /etc/issue|grep -i Ubuntu ; then\n" +
"\tsudo apt-get update\n" +
"\tsudo apt-get install -y default-jdk\n" +
"\tsudo apt-get install -y tomcat9\n" +
"else\n" +
" yum install -y java\n" +
"\tyum install -y tomcat\n" +
"fi";
System.out.println("commandContent: " + commandContent);
runCommand(commandContent, instanceIds, ecsClient);
}
public static class Constants {
// Region
public static final String REGION_ID = "cn-hangzhou";
// Endpoint
public static final class ENDPOINT {
public static final String VPC = "vpc.cn-hangzhou.aliyuncs.com";
public static final String ECS = "ecs.cn-hangzhou.aliyuncs.com";
}
// Command type
public static final class COMMAND_TYPE {
// A shell command for a Linux instance.
public static final String RUN_SHELL_SCRIPT = "RunShellScript";
// A batch command for a Windows instance.
public static final String RUN_BAT_SCRIPT = "RunBatScript";
// A PowerShell command for a Windows instance.
public static final String RUN_POWERSHELL_SCRIPT = "RunPowerShellScript";
}
}
public static com.aliyun.ecs20140526.Client createEcsClient() throws Exception {
Config config = new Config();
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = Constants.ENDPOINT.ECS;
return new com.aliyun.ecs20140526.Client(config);
}
public static void runCommand(String commandContent, List<String> instanceIds, com.aliyun.ecs20140526.Client ecsClient) {
try {
RunCommandRequest request = new RunCommandRequest();
request.setRegionId(Constants.REGION_ID);
// RunShellScript specifies a shell command for a Linux instance.
request.setType(Constants.COMMAND_TYPE.RUN_SHELL_SCRIPT);
request.setCommandContent(commandContent);
request.setInstanceId(instanceIds);
request.setTimeout(60L);
RunCommandResponse runCommandResponse = ecsClient.runCommand(request);
System.out.println(new Gson().toJson(runCommandResponse));
} catch (Exception e) {
throw new RuntimeException("runCommand failed:" + e);
}
}
}
Libérer les ressources
Lorsque vous n'avez plus besoin des ressources provisionnées, utilisez les opérations OpenAPI suivantes pour les supprimer.
Invoquez les opérations appropriées selon vos besoins. Cet exemple supprime l'intégralité des ressources créées lors des étapes précédentes.
-
Supprimer l'instance ECS
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
InstanceId
ID de l'instance : i-bp17f3kzgtzzj91r****
-
Supprimer la paire de clés SSH
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
KeyPairNames
Nom de la paire de clés SSH : ["sdk-key-pair"]
-
Supprimer le groupe de sécurité
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
SecurityGroupId
ID du groupe de sécurité : sg-bp1esyhwfbqeyudt****
-
Supprimer le vSwitch
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
VSwitchId
ID du vSwitch : vsw-bp1nzprm8h7mmnl8t****
-
Supprimer le VPC
API
Paramètre
Valeur d'exemple
RegionId
Région : cn-hangzhou
VpcId
ID du VPC : vpc-bp1aag0sb9s4i92i3****
Voici un exemple de code illustrant cette procédure :
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.vpc20160428.models.DeleteVSwitchRequest;
import com.aliyun.vpc20160428.models.DeleteVpcRequest;
import com.google.gson.Gson;
import java.util.Collections;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class DeleteResources {
public static void main(String[] args) {
String vpcId = "vpc-bp1aag0sb9s4i92i3****";
String vSwitchId = "vsw-bp1nzprm8h7mmnl8t****";
String securityGroupId = "sg-bp1esyhwfbqeyudt****";
String instanceId = "i-bp17f3kzgtzzj91r****";
String keyPairName = "sdk-key-pair";
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
try {
com.aliyun.ecs20140526.Client ecsClient = createEcsClient();
com.aliyun.vpc20160428.Client vpcClient = createVpcClient();
// Delete the ECS instance.
executorService.schedule(() -> deleteInstance(instanceId, ecsClient), 1, TimeUnit.SECONDS);
// Delete the key pair.
executorService.schedule(() -> deleteKeyPairs(keyPairName, ecsClient), 1, TimeUnit.SECONDS);
// Delete the security group.
executorService.schedule(() -> deleteSecurityGroup(securityGroupId, ecsClient), 60, TimeUnit.SECONDS);
// Delete the vSwitch.
executorService.schedule(() -> deleteVSwitch(vSwitchId, vpcClient), 60, TimeUnit.SECONDS);
// Delete the VPC.
executorService.schedule(() -> deleteVpc(vpcId, vpcClient), 65, TimeUnit.SECONDS);
} catch (Exception e) {
System.err.println("An error occurred: " + e.getMessage());
// Handle exceptions. Releasing an instance takes time. Some resources may be deleted while others are not. Add a proper mechanism to handle data for failed deletions.
} finally {
executorService.shutdown();
}
}
public static class Constants {
// Endpoint
public static final class ENDPOINT {
public static final String VPC = "vpc.cn-hangzhou.aliyuncs.com";
public static final String ECS = "ecs.cn-hangzhou.aliyuncs.com";
}
// Region
public static final String REGION_ID = "cn-hangzhou";
}
public static com.aliyun.vpc20160428.Client createVpcClient() throws Exception {
Config config = new Config();
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = Constants.ENDPOINT.VPC;
return new com.aliyun.vpc20160428.Client(config);
}
public static com.aliyun.ecs20140526.Client createEcsClient() throws Exception {
Config config = new Config();
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = Constants.ENDPOINT.ECS;
return new com.aliyun.ecs20140526.Client(config);
}
/**
* Deletes the specified virtual private cloud (VPC) resource.
*
* @param vpcId The ID of the VPC to delete.
* @param vpcClient The VPC client.
*/
public static void deleteVpc(String vpcId, com.aliyun.vpc20160428.Client vpcClient) {
try {
System.out.println("VPC is deleting, please wait...");
DeleteVpcRequest deleteVpcRequest = new DeleteVpcRequest()
.setRegionId(Constants.REGION_ID)
.setVpcId(vpcId);
vpcClient.deleteVpc(deleteVpcRequest);
} catch (Exception e) {
throw new RuntimeException("DeleteVpc failed: " + e.getMessage());
}
}
/**
* Deletes the specified vSwitch.
*
* @param vSwitchId The ID of the vSwitch.
* @param vpcClient The VPC client.
*/
public static void deleteVSwitch(String vSwitchId, com.aliyun.vpc20160428.Client vpcClient) {
System.out.println("VSwitch is deleting, please wait...");
try {
DeleteVSwitchRequest deleteVSwitchRequest = new DeleteVSwitchRequest()
.setRegionId(Constants.REGION_ID)
.setVSwitchId(vSwitchId);
vpcClient.deleteVSwitch(deleteVSwitchRequest);
} catch (Exception e) {
throw new RuntimeException("DeleteVSwitch failed: " + e.getMessage());
}
}
/**
* Deletes the specified security group.
*
* @param securityGroupId The ID of the security group to delete.
* @param ecsClient The ECS client.
*/
public static void deleteSecurityGroup(String securityGroupId, Client ecsClient) {
System.out.println("SecurityGroup is deleting, please wait...");
try {
DeleteSecurityGroupRequest deleteSecurityGroupRequest = new DeleteSecurityGroupRequest()
.setRegionId(Constants.REGION_ID)
.setSecurityGroupId(securityGroupId);
ecsClient.deleteSecurityGroup(deleteSecurityGroupRequest);
} catch (Exception e) {
throw new RuntimeException("DeleteSecurityGroup failed: " + e.getMessage());
}
}
/**
* Deletes the ECS instance.
*
* @param instanceId The ID of the ECS instance to delete.
* @param ecsClient The ECS client.
*/
public static void deleteInstance(String instanceId, Client ecsClient) {
System.out.println("ECS instance is deleting, please wait...");
try {
DeleteInstanceRequest request = new DeleteInstanceRequest()
.setForce(true)
.setInstanceId(instanceId);
ecsClient.deleteInstance(request);
} catch (Exception e) {
throw new RuntimeException("DeleteInstance failed: " + e.getMessage());
}
}
/**
* Deletes the key pair using the specified ECS client.
*
* @param keyPairName The key pair name.
* @param ecsClient The ECS client.
*/
public static void deleteKeyPairs(String keyPairName, Client ecsClient) {
System.out.println("KeyPair is deleting, please wait...");
try {
// Create a request to delete the key pair, and set the region ID and key pair name.
DeleteKeyPairsRequest deleteKeyPairsRequest = new DeleteKeyPairsRequest()
.setRegionId(Constants.REGION_ID)
.setKeyPairNames(new Gson().toJson(Collections.singletonList(keyPairName)));
ecsClient.deleteKeyPairs(deleteKeyPairsRequest);
} catch (Exception e) {
// If the key pair fails to be deleted, throw a runtime exception that contains the error message.
throw new RuntimeException("DeleteKeyPairs failed: " + e.getMessage());
}
}
}