# 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 | 文档首次发布 |