4. 代码示例
声明您的Access Key、Secret Key、VPC资源的HCL语法模板以及您的资源栈名称。
Copied!
ak = os.environ["HUAWEICLOUD_SDK_AK"]
sk = os.environ["HUAWEICLOUD_SDK_SK"]
project_id = "<YOUR PROJECT ID>"
template_body = "<YOUR TEMPLATE>"
stack_name = "<YOUR STACK NAME>"
通过AOS SDK创建一个Client,资源编排服务为region级别服务,将在您选择的region下生成目标资源。
Copied!
auth = BasicCredentials(
project_id=project_id,
ak=ak,
sk=sk
)
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来获取资源栈的状态。
Copied!
@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来获得生成的资源详细信息。
Copied!
@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来获取资源栈状态。
Copied!
@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")
1. 示例简介
华为云提供了AOS服务端SDK,您可以直接集成服务端SDK来调用资源编排的相关API,从而实现对资源的快速操作。
该示例展示了如何通过Python语言版本AOS SDK使用资源栈快速创建您的资源。
2. 开发前准备
3. 安装SDK
使用 pip 安装 SDK 依赖包。
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. 修订记录