# huaweicloud-RFS-ContinueDeployStackDemo-python **Repository Path**: HuaweiCloudDeveloper/huaweicloud-rfs-continue-deploy-stack-demo-python ## Basic Information - **Project Name**: huaweicloud-RFS-ContinueDeployStackDemo-python - **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 ## 1. 示例简介 华为云提供了AOS服务端SDK,您可以直接集成服务端SDK来调用资源编排的相关API,从而实现对资源的快速操作。 该示例展示了如何通过Python语言版本AOS SDK使用资源栈快速创建您的资源。 ## 2. 开发前准备 - 1.参考华为云开发工具包(SDK)引入AOS Python SDK - 2.要使用华为云Python 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 Python SDK 需要运行在Python 3.3及以上版本。 ## 3. 安装SDK 使用 pip 安装 SDK 依赖包。 ``` # 安装aos服务包 pip install huaweicloudsdkaos # 安装sdk核心包 pip install huaweicloudsdkcore ``` ## 4. 代码示例 声明您的Access Key、Secret Key、VPC资源的HCL语法模板以及您的资源栈名称。 ```python # 认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 ak = os.environ["HUAWEICLOUD_SDK_AK"] sk = os.environ["HUAWEICLOUD_SDK_SK"] # stack以project_id为单位进行管理 project_id = "" # HCL语法文本描述文件,支持tf、tf.json文件格式 template_body = "" # stack_name是唯一的,用于标识您的资源栈 stack_name = "" ``` 通过AOS SDK创建一个Client,资源编排服务为region级别服务,将在您选择的region下生成目标资源。 ```python auth = BasicCredentials( project_id=project_id, ak=ak, sk=sk ) # 资源栈及其资源将创建在此region下,此处以CN_NORTH_4为例 client = AosClient.new_builder() \ .with_credentials(credentials=auth) \ .with_region(region=AosRegion.CN_NORTH_4) \ .with_http_config(config) \ .build() ``` 您可以在创建资源栈阶段传入templateBody或templateUri,这将直接创建并触发资源栈的部署,生成您HCL模板中的目标资源。若您想要传入多文件类型的模板,请使用templateUri传入zip包。该过程需要花费一段时间,资源编排将在后台为您异步处理请求,您可以通过轮询GetStackMetadata来获取资源栈的状态。 ```python @staticmethod def create_and_deploy_stack(aos_client, stack_name, template_body): create_stack_request = CreateStackRequest() create_stack_request.client_request_id = str(uuid.uuid4()) create_stack_request_body = CreateStackRequestBody() create_stack_request_body.stack_name = stack_name create_stack_request_body.template_body = template_body create_stack_request.body = create_stack_request_body try: response = aos_client.create_stack(create_stack_request) print("create and deploy stack return: " + str(response)) stack_id = response.stack_id Example.get_stack_metadata(aos_client, stack_id, stack_name, "create and deploy stack") return stack_id except ClientRequestException as e: print("create and deploy stack failed with exception: " + str(e)) raise e ``` 此时若资源栈状态为DEPLOYMENT_FAILED,您可以通过ListStackEvents获取资源栈事件,用以获取失败原因。 ```python @staticmethod def list_stack_events(aos_client, stack_id, stack_name): list_stack_events_request = ListStackEventsRequest() list_stack_events_request.client_request_id = str(uuid.uuid4()) list_stack_events_request.stack_id = stack_id list_stack_events_request.stack_name = stack_name try: response = aos_client.list_stack_events(list_stack_events_request) print("list stack events return: " + str(response)) except ClientRequestException as e: print("list stack events failed with exception: " + str(e)) raise e ``` 修复错误后,可以通过ContinueDeployStack触发资源栈的继续部署。 ```python @staticmethod def continue_deploy_stack(aos_client, stack_id, stack_name): continue_deploy_stack_request = ContinueDeployStackRequest() continue_deploy_stack_request.client_request_id = str(uuid.uuid4()) continue_deploy_stack_request.stack_name = stack_name body = ContinueDeployStackRequestBody() body.stack_id = stack_id continue_deploy_stack_request.body = body try: response = aos_client.continue_deploy_stack(continue_deploy_stack_request) print("continue deploy stack return: " + str(response)) Example.get_stack_metadata(aos_client, stack_id, stack_name, "continue deploy stack") except ClientRequestException as e: print("continue deploy stack failed with exception: " + str(e)) raise e ``` 在使用完资源栈后,您可以通过调用DeleteStack来删除资源栈并释放其生成的资源,资源编排将花费一段时间为您处理请求,同样可以使用GetStackMetadata来获取资源栈状态。 ```python @staticmethod def delete_stack(aos_client, stack_id, stack_name): delete_stack_request = DeleteStackRequest() delete_stack_request.client_request_id = str(uuid.uuid4()) delete_stack_request.stack_id = stack_id delete_stack_request.stack_name = stack_name try: aos_client.delete_stack(delete_stack_request) except ClientRequestException as e: print("delete stack failed with exception: " + str(e)) raise e get_stack_metadata_request = GetStackMetadataRequest() get_stack_metadata_request.client_request_id = str(uuid.uuid4()) get_stack_metadata_request.stack_id = stack_id get_stack_metadata_request.stack_name = stack_name start_time = datetime.now().timestamp() while True: now_time = datetime.now().timestamp() if now_time - start_time > Example.__timeout_interval: print("delete stack time out and will be exit") return try: time.sleep(5) print("waiting for delete stack...") aos_client.get_stack_metadata(get_stack_metadata_request) except ClientRequestException as e: if e.status_code == 404: print("delete stack complete!!!") return print("delete stack failed with exception: " + str(e)) raise e except Exception as e: print("waiting delete stack failed with exception: " + str(e)) raise UnExpectedException(str(e)) ``` ## 5. 参考 更多信息请参考:[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/AOS/doc?api=CreateStack) ## 6. 修订记录 | 发布日期 | 文档版本 | 修订说明 | |:----------:| :------: | :----------: | | 2023-09-26 | 1.0 | 文档首次发布 |