# huaweicloud-RFS-DeployStackDemo-java **Repository Path**: HuaweiCloudDeveloper/huaweicloud-rfs-deploy-stack-demo-java ## Basic Information - **Project Name**: huaweicloud-RFS-DeployStackDemo-java - **Description**: 提供通过资源栈创建和删除VPC资源的代码示例,说明如何使用资源栈快速部署资源。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master-dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-07-25 - **Last Updated**: 2025-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 资源编排服务中通过资源栈创建和删除VPC资源(java版本) ## 功能介绍 华为云提供了AOS服务端SDK,您可以直接集成服务端SDK来调用资源编排的相关API,从而实现对资源的快速操作。 该示例展示了如何通过Java语言版本AOS SDK使用资源栈快速创建您的资源。 ## 前置条件 - 1.参考华为云开发工具包(SDK)引入AOS Java SDK - 2.要使用华为云Java SDK,您需要拥有云账号以及该账号对应的Access Key(AK)和 Secret Access Key(SK)。请在华为云控制台“我的凭证-访问密钥”页面上创建和查看您的AK&SK。更多信息请查看[访问密钥](https://support.huaweicloud.com/usermanual-ca/zh-cn_topic_0046606340.html)。 - Aos SDK期望用户主动传入project_id,若未传入project_id,Aos SDK将选择您对应region下默认项目的project_id。更多信息请查看[IAM基本概念](https://support.huaweicloud.com/productdesc-iam/iam_01_0023.html#section8)。 - 3.获取您期望使用的目标终端节点 - 4.预先准备您的模板文件(HCL语法文本描述文件,支持tf、tf.json、zip包文件格式,用于描述您的云资源) - 当前支持的provider版本请见[华为云官网](https://support.huaweicloud.com/productdesc-aos/rf_02_0006.html) - 模板书写说明详见[huaweicloud provider官网](https://registry.terraform.io/providers/huaweicloud/huaweicloud/latest) - 5.华为云AOS Java SDK 需要运行在Java 1.8及以上版本。 ### SDK获取和安装 使用maven安装华为云Aos Java SDK: ```xml com.huaweicloud.sdk huaweicloud-sdk-aos 3.1.49 ``` ## 示例代码 声明您的Access Key、Secret Key、VPC资源的HCL语法模板以及您的资源栈名称。 ```java // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); /*stack以project_id为单位进行管理*/ String projectId = ""; /*HCL语法文本描述文件,支持tf、tf.json文件格式*/ String templateBody = ""; /*stack_name是唯一的,用于标识您的资源栈*/ String stackName = ""; ``` 通过AOS SDK创建一个Client,资源编排服务为region级别服务,将在您选择的region下生成目标资源。 ```java ICredential auth = new BasicCredentials() .withProjectId(projectId) .withAk(ak) .withSk(sk); /*资源栈及其资源将创建在此region下,此处以CN_NORTH_4为例*/ AosClient client = AosClient.newBuilder() .withCredential(auth) .withRegion(AosRegion.CN_NORTH_4) .build(); ``` 您可以使用CreateStack单独创建资源栈。 ```java public static String createStack(AosClient client, String stackName) { CreateStackRequest createStackRequest = new CreateStackRequest(); createStackRequest.setClientRequestId(UUID.randomUUID().toString()); CreateStackRequestBody createStackRequestBody = new CreateStackRequestBody(); createStackRequestBody.setStackName(stackName); createStackRequest.setBody(createStackRequestBody); CreateStackResponse createStackResponse; try { createStackResponse = client.createStack(createStackRequest); System.out.println("create stack return: " + createStackResponse.toString()); return createStackResponse.getStackId(); } catch (ClientRequestException e) { System.out.println("create stack failed with exception: " + e); throw e; } } ``` 接下来您可以使用DeployStack部署资源栈,在此步骤你可以传入templateBody或templateUri,这将会触发部署资源栈,生成您HCL模板中的目标资源。若您想要传入多文件类型的模板,请使用templateUri传入zip包。 ```java public static void deployStack(AosClient client, String stackName, String stackId, String templateBody) { DeployStackRequest deployStackRequest = new DeployStackRequest(); deployStackRequest.setClientRequestId(UUID.randomUUID().toString()); deployStackRequest.setStackName(stackName); DeployStackRequestBody deployStackRequestBody = new DeployStackRequestBody(); deployStackRequestBody.setTemplateBody(templateBody); deployStackRequestBody.setStackId(stackId); deployStackRequest.setBody(deployStackRequestBody); try { DeployStackResponse deployStackResponse = client.deployStack(deployStackRequest); System.out.println("deploy stack return: " + deployStackResponse.toString()); } catch (ClientRequestException e) { System.out.println("deploy stack failed with exception: " + e); throw e; } } ``` DeployStack需要花费一段时间,资源编排将在后台为您异步处理请求,您可以通过GetStackMetadata来获取详细信息 ```java public static void getStackMetadata(AosClient client, String stackName, String stackId) { GetStackMetadataRequest getStackMetadataRequest = new GetStackMetadataRequest(); getStackMetadataRequest.setClientRequestId(UUID.randomUUID().toString()); getStackMetadataRequest.setStackName(stackName); getStackMetadataRequest.setStackId(stackId); long startTime = System.currentTimeMillis(); while (true) { long nowTime = System.currentTimeMillis(); if (nowTime - startTime > timeoutInterval) { System.out.println("deploy stack time out and will be exit"); throw new RuntimeException("deploy stack time out"); } System.out.println("waiting for deploy stack ..."); try { Thread.sleep(5000); } catch (InterruptedException e) { System.out.println("waiting for deploy stack throw exception: " + Arrays.toString(e.getStackTrace())); throw new RuntimeException("waiting for deploy stack throw exception"); } GetStackMetadataResponse getStackMetadataResponse = client.getStackMetadata(getStackMetadataRequest); if (getStackMetadataResponse.getStatus() != GetStackMetadataResponse.StatusEnum.DEPLOYMENT_IN_PROGRESS) { System.out.println("get stack metadata return: " + getStackMetadataResponse); break; } System.out.println("deploy stack in progress..."); } } ``` 您可以通过ListStackResource来获得生成的资源详细信息。 ```java public static void listStackResource(AosClient client, String stackName, String stackId) { ListStackResourcesRequest listStackResourcesRequest = new ListStackResourcesRequest(); listStackResourcesRequest.setClientRequestId(UUID.randomUUID().toString()); listStackResourcesRequest.setStackName(stackName); listStackResourcesRequest.setStackId(stackId); ListStackResourcesResponse listStackResourcesResponse = client.listStackResources(listStackResourcesRequest); System.out.println("list stack resources return: " + listStackResourcesResponse.toString()); } ``` 您可以通过调用DeleteStack来删除资源栈并释放其生成的资源,资源编排将花费一段时间为您处理请求,同样可以使用GetStackMetadata来获取资源栈状态。 ```java public static void deleteStack(AosClient client, String stackName) { DeleteStackRequest deleteStackRequest = new DeleteStackRequest(); deleteStackRequest.setClientRequestId(UUID.randomUUID().toString()); deleteStackRequest.setStackName(stackName); client.deleteStack(deleteStackRequest); GetStackMetadataRequest getStackMetadataRequest = new GetStackMetadataRequest(); getStackMetadataRequest.setClientRequestId(UUID.randomUUID().toString()); getStackMetadataRequest.setStackName(stackName); long startTime = System.currentTimeMillis(); while (true) { long nowTime = System.currentTimeMillis(); if (nowTime - startTime > timeoutInterval) { System.out.println("delete stack time out and will be exit"); throw new RuntimeException("delete stack time out"); } System.out.println("waiting for delete stack ..."); try { Thread.sleep(5000); client.getStackMetadata(getStackMetadataRequest); } catch (ClientRequestException e) { if (e.getHttpStatusCode() == 404) { System.out.println("delete complete!!!"); return; } System.out.println("delete stack throw exception: " + e); throw e; } catch (InterruptedException e) { System.out.println("waiting for delete stack throw exception: " + Arrays.toString(e.getStackTrace())); throw new RuntimeException("waiting for delete stack throw exception"); } } } ``` ## 参考 更多信息请参考[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/AOS/doc?api=CreateStack) ## 修订记录 | 发布日期 | 文档版本 | 修订说明 | |:----------:| :------: | :----------: | | 2023-08-30 | 1.0 | 文档首次发布 |