如何主动触发特定文件夹的反向同步

本文介绍如何通过云存储网关主动触发特定文件夹的反向同步。

前提条件

已创建共享。具体操作,请参见创建共享

操作步骤

您可以通过调用TriggerGatewayRemoteSyncRequest接口来实现主动触发特定文件夹的反向同步。

说明

云存储网关Python SDK兼容Python2和Python3,下文以Python3版本为例具体说明。

  1. 安装Python SDK。

    pip install aliyun-python-sdk-core
    pip install aliyun-python-sdk-sgw
  2. 主动触发特定文件夹的反向同步,完整代码如下所示,您可以自行根据实际情况修改代码内容。

    #!/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>
  3. 由于主动触发反向同步是一个异步的长时间的过程,所以需要通过不断轮询任务接口来获知主动反向同步任务是否完成,完整代码如下所示,您可以自行根据实际情况修改代码内容。

    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>