本文介绍如何通过云存储网关主动触发特定文件夹的反向同步。
前提条件
已创建共享。具体操作,请参见创建共享。
操作步骤
您可以通过调用TriggerGatewayRemoteSyncRequest接口来实现主动触发特定文件夹的反向同步。
云存储网关Python SDK兼容Python2和Python3,下文以Python3版本为例具体说明。
安装Python SDK。
pip install aliyun-python-sdk-core pip install aliyun-python-sdk-sgw
主动触发特定文件夹的反向同步,完整代码如下所示,您可以自行根据实际情况修改代码内容。
#!/usr/bin/env python3 from aliyunsdkcore.client import AcsClient from aliyunsdksgw.request.v20180511 import TriggerGatewayRemoteSyncRequest def trigger_gateway_remote_sync(): # 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 # AccessKey ID和AccessKey Secret是RAM用户访问阿里云ECS服务API的密钥,具有该账户完全的权限,请妥善保管,避免泄露。 # 将<AccessKey ID>、<AccessKey Secret>变量替换为您的阿里云账号对应的AccessKey ID以及AccessKey Secret。 # 将<RegionId>变量替换为您正在使用的网关实例所属的地域ID。 client = AcsClient('<AccessKey ID>', '<AccessKey Secret>', '<RegionId>') # 调用TriggerGatewayRemoteSyncRequest接口触发主动反向同步。 request =TriggerGatewayRemoteSyncRequest.TriggerGatewayRemoteSyncRequest() request.set_GatewayId("<Gateway Id>") request.set_IndexId("<Index Id>") request.set_Path("<Path>") result = client.do_action_with_exception(request) print(result) if __name__ == "__main__": trigger_gateway_remote_sync()
重要参数说明如下:
说明Gateway Id是需要触发主动反向同步的网关ID。
Index Id是需要触发主动反向同步的共享ID,如果是NFS共享,假设共享名字为test1,则Index Id为“NFStest1”,如果是SMB共享,假设共享名字为test2,则Index Id为“SMBtest2”。
Path是需要触发主动反向同步的特定的挂载点内的文件夹。
当创建共享时没有指定OSS Bucket子目录,则Path为OSS Bucket子目录。
例如:假设需要反向同步的特定文件夹在OSS上的路径为
oss://<bucket name>/dir
,其中<bucket name>为OSS Bucket的名称,则Path为/dir
。当创建共享时已指定OSS Bucket子目录,则Path为该子目录的相对路径。
例如:假设需要反向同步的特定文件夹在OSS上的路径为
oss://<bucket name>/<prefix>/dir
,其中<bucket name>为OSS Bucket的名称,<prefix>为共享指定的OSS Bucket子目录,则Path为/dir
。如果您需要触发共享根目录的反向同步,则Path为空或者“/"。
输出结果示例如下:
<?xml version='1.0' encoding='UTF-8'?> <TriggerGatewayRemoteSyncResponse> <TaskId>t-000cbzf2v72pcall****</TaskId> <Message>successful</Message> <RequestId>72191BD9-10AF-43BA-B1B5-4677F992DA3E</RequestId> <Code>200</Code> <Success>true</Success> </TriggerGatewayRemoteSyncResponse>
由于主动触发反向同步是一个异步的长时间的过程,所以需要通过不断轮询任务接口来获知主动反向同步任务是否完成,完整代码如下所示,您可以自行根据实际情况修改代码内容。
from aliyunsdksgw.request.v20180511 import DescribeTasksRequest def describe_tasks(): client = AcsClient('<AccessKey ID>', '<AccessKey Secret>', '<RegionId>') request = DescribeTasksRequest.DescribeTasksRequest() request.set_TaskId("<Task Id>") # Task Id可以通过解析上一步的XML格式的输出结果获取,即示例中的“t-000cbzf2v72pcall****”。 request.set_TargetId("<Gateway Id>") # Gateway Id是需要触发主动反向同步的网关ID。 result = client.do_action_with_exception(request) print(result) if __name__ == "__main__": describe_tasks()
输出结果示例如下,可以通过XML解析获取字段Progress的值,如果Progress为100表示任务已经完成,如果Progress为-1表示任务失败,如果Progress在0和100之间表示任务正在执行中。
<?xml version='1.0' encoding='UTF-8'?> <DescribeTasksResponse> <TotalCount>1</TotalCount> <Tasks> <SimpleTask> <Progress>100</Progress> <TaskId>t-000cbzf2v72pcall****</TaskId> <CreatedTime>1622194647</CreatedTime> <StateCode>task.state.completed</StateCode> <UpdatedTime>1622194656</UpdatedTime> <StageCode>completed</StageCode> <Name>task.name.operate_gateway.trigger_remote_sync</Name> </SimpleTask> </Tasks> <RequestId>0CE0F47E-1664-468E-AE95-8FC86A9C8BB3</RequestId> <Message>successful</Message> <PageSize>10</PageSize> <PageNumber>1</PageNumber> <Code>200</Code> <Success>true</Success> </DescribeTasksResponse>