资源编排服务中通过资源栈创建和删除VPC资源
引导式阅读
Python
资源编排服务中通过资源栈创建和删除VPC资源
作者
c***r
上架时间
2023-11-09 11:24:53

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。更多信息请查看访问密钥
    • Aos SDK期望用户主动传入project_id,若未传入project_id,Aos SDK将选择您对应region下默认项目的project_id。更多信息请查看IAM基本概念
  • 3.获取您期望使用的目标终端节点
  • 4.预先准备您的模板文件(HCL语法文本描述文件,支持tf、tf.json、zip包文件格式,用于描述您的云资源)
  • 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语法模板以及您的资源栈名称。

# 认证用的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 = "<YOUR PROJECT ID>" # HCL语法文本描述文件,支持tf、tf.json文件格式 template_body = "<YOUR TEMPLATE>" # stack_name是唯一的,用于标识您的资源栈 stack_name = "<YOUR STACK NAME>"

通过AOS SDK创建一个Client,资源编排服务为region级别服务,将在您选择的region下生成目标资源。

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来获取资源栈的状态。

@staticmethod def create_and_deploy_stack(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 = create_stack_request_body response = [] try: response = client.create_stack(create_stack_request) print("create stack return: " + str(response)) except ClientRequestException as e: print("create stack failed with exception: " + str(e)) raise e stack_id = response.stack_id deploy_stack_request = DeployStackRequest() deploy_stack_request.client_request_id = str(uuid.uuid4()) deploy_stack_request.stack_name = stack_name deploy_stack_request_body = DeployStackRequestBody() deploy_stack_request_body.template_body = template_body deploy_stack_request.body = deploy_stack_request_body try: response = client.deploy_stack(deploy_stack_request) print("deploy stack return: " + str(response)) except ClientRequestException as e: print("deploy 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("create and deploy stack time out and will be exit") raise UnExpectedException("create and deploy stack time out ") print("waiting for create and deploy stack ...") try: time.sleep(5) except Exception as e: print("waiting for create and deploy stack throw exception: " + str(e)) raise UnExpectedException("waiting for create and deploy stack throw exception") response = client.get_stack_metadata(get_stack_metadata_request) if response.status != "DEPLOYMENT_IN_PROGRESS": print("get stack metadata return: " + str(response)) break print("create and deploy stack in progress...") return stack_id

您可以通过ListStackResource来获得生成的资源详细信息。

@staticmethod def list_stack_resource(client, stack_id, stack_name): list_stack_resources_request = ListStackResourcesRequest() list_stack_resources_request.client_request_id = str(uuid.uuid4()) list_stack_resources_request.stack_id = stack_id list_stack_resources_request.stack_name = stack_name response = client.list_stack_resources(list_stack_resources_request) print("list stack resources return: " + str(response))

您可以通过调用DeleteStack来删除资源栈并释放其生成的资源,资源编排将花费一段时间为您处理请求,同样可以使用GetStackMetadata来获取资源栈状态。

@staticmethod def delete_stack(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 client.delete_stack(delete_stack_request) 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") raise UnExpectedException("delete stack time out and will be exit") print("waiting for delete stack ...") try: time.sleep(5) client.get_stack_metadata(get_stack_metadata_request) except ClientRequestException as e: if e.status_code == 404: print("delete complete!!!") return print("delete stack throw exception: " + str(e)) raise e except Exception as e: print("waiting for delete stack throw exception: " + str(e)) raise UnExpectedException("waiting for delete stack throw exception")

5. 参考

更多信息请参考:API Explorer

6. 修订记录

发布日期 文档版本 修订说明
2023-09-27 1.0 文档首次发布