来自S3的云存储转移服务停留在“此转移即将开始”

时间:2016-03-15 17:00:22

标签: google-cloud-storage

我们的一部分应用程序通过存储转移服务API启动从Amazon S3到Google Cloud Storage的转移。我们已经成功运行了几个月,直到昨天我们的转移停止工作。我们可以看到在控制台中启动了传输,但它无限期地挂起了一个历史项目,声明:“此传输正在开始...”我们有一个后台进程轮询传输状态,我们看到返回状态为“transfer_calculating”

在尝试调试此问题时,我们通过storage console设置转移。我们使用了与我们的应用程序使用的相同的AWS访问密钥ID /秘密访问密钥,并且传输成功完成。这使我们相信问题与传输服务API或启动API调用的代码隔离开来。

转移工作代码:

TransferJob tjob = new TransferJob()
    .setDescription(description)
    .setStatus('ENABLED')
    .setProjectId(transferGoogleProject)
    .setTransferSpec(
    new TransferSpec()
        .setGcsDataSink(new GcsData().setBucketName(googleStorageBucket))
        .setAwsS3DataSource(
        new AwsS3Data()
            .setBucketName(s3Bucket)
            .setAwsAccessKey(new AwsAccessKey().setAccessKeyId(transferAwsKey).setSecretAccessKey(transferAwsSecret)))
        .setObjectConditions(new ObjectConditions().setIncludePrefixes(s3Keys))
        .setTransferOptions(
        new TransferOptions()
            .setDeleteObjectsFromSourceAfterTransfer(false)
            .setOverwriteObjectsAlreadyExistingInSink(true)
            .setDeleteObjectsUniqueInSink(false)))
    .setSchedule(
    new Schedule()
        .setScheduleStartDate(date)
        .setScheduleEndDate(date)
        .setStartTimeOfDay(time))

tjob = storagetransfer.transferJobs().create(tjob).execute()

图书馆配置:

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.19.1</version>
</dependency>
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-bigquery</artifactId>
    <version>v2-rev191-1.19.1</version>
</dependency>
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-storage</artifactId>
    <version>v1-rev26-1.19.1</version>
</dependency>
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-storagetransfer</artifactId>
    <version>v1-rev3-1.19.1</version>
</dependency>
<dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client</artifactId>
    <version>1.19.0</version>
</dependency>
<dependency>
    <groupId>com.google.http-client</groupId>
    <artifactId>google-http-client</artifactId>
    <version>1.19.0</version>
</dependency>
<dependency>
    <groupId>com.google.http-client</groupId>
    <artifactId>google-http-client-jackson2</artifactId>
    <version>1.19.0</version>
</dependency>

我们在开发环境中将版本提升了1.21.0但转移仍然停留在“此转移正在开始......”

此时我们陷入了困境,其他任何人都遇到了这个问题?

4 个答案:

答案 0 :(得分:1)

根据@ mayur-deshpande在谷歌提供的反馈(谢谢!),我们的问题源于传递给需要以UTC为单位的setStartTimeOfDay()的时间值。到目前为止,我们已经使用了creating transfers development guide

以下代码段中规定的美国/太平洋地区
/**
 * Specify times below using US Pacific Time Zone.
 */
private static final String START_DATE = "YYYY-MM-DD";
private static final String START_TIME = "HH:MM:SS";

由于时差,我们在请求中发送的时间已经过去,因此转移处于启动状态,直到第二天我们的时间到来。我们看到这种情况发生在请求最终完成时。

day的setStartTime()的javadoc确实指出需要使用UTC:

/**
 * The time in UTC at which the transfer will be scheduled to start in a day. Transfers may start
 * later than this time. If not specified, transfers are scheduled to start at midnight UTC.
 * @param startTimeOfDay startTimeOfDay or {@code null} for none
 */
public Schedule setStartTimeOfDay(TimeOfDay startTimeOfDay)

上面引用的示例代码应反映此要求,因此我将在github存储库中提出问题。

此外,由于我们只进行一次转移,因此我们确保将未来一分钟的开始时间设置为考虑服务器之间的细微时间差异:

DateTime now = new DateTime().plusMinutes(1)
Date date = new Date().setDay(now.dayOfMonth).setMonth(now.monthOfYear).setYear(now.year)
TimeOfDay time = new TimeOfDay().setHours(now.hourOfDay).setMinutes(now.minuteOfHour).setSeconds(0)

答案 1 :(得分:1)

请注意,在API中,StartTimeOfDay是UTC的参考(请参阅API参考:https://cloud.google.com/storage/transfer/reference/rest/v1/transferJobs#Schedule)。您通过电子邮件发送给我们的请求指定了基于UTC的过去一小时。请以UTC格式指定StartTimeOfDay。如果您只想立即启动一次性工作,只需将StartTimeOfDay字段留空即可。

另请注意,Google Cloud UI允许客户在本地时区指定StartTimeOfDay,这与API不同。

答案 2 :(得分:0)

我也有这个问题。通过Google Storage网页传输提交作品,但通过api已完全停止工作。

我甚至尝试使用Google Storage Oauth网页尝试提交,但它也以同样的方式失败。

答案 3 :(得分:0)

我发现存储转移服务非常具有挑战性。有很多细微差别。清理文档并以清晰的方式将所有信息放在一个易于查找的位置将非常有用。

对我之后的任何人的概述:

1)创建服务帐户

2)通过IAM,为服务帐户提供角色Project-&gt; Editor

3)从github.com/GoogleCloudPlatform/java-docs-samples/blob/master/storage/storage-transfer/src/main/java/com/google/cloud/storage/storagetransfer/samples上的示例代码开始/

  • 3a)只需要关注自己的三个类:AwsRequester, TransferJobUtils&amp; RetryHttpInitializerWrapper

    3b)创建一个Storagetransfer客户端,需要 google-api-services-storagetransfer jar,用来连接你的秘密 JSON文件

  • 3c)创建一个TransferJob对象来提交作业,这就是你所在的位置 设置projectId和Schedule至少需要设置的位置 日期并留空时间立即提交,但你做 需要创建一个时间表

    3d)创建一个TransferSpec对象,它将拥有你的大部分内容 配置选项。选项的映射不明确。您 将需要使用JSON API文档https://cloud.google.com/storage/transfer/reference/rest/v1/TransferSpec, 并匹配Java API中的名称。至少,你会想要 填充:AWS桶&amp;凭证,GCS汇等......样本 给你这个。但你也想设置 ObjectConditions.setIncludePrefixes与字符串列表相同 通过用户界面的方式。

4)不要试图理解主页面,cloud.google.com/storage/transfer/create-client,只读一次。它只是没有帮助真正使它工作。

HTH?