使用 JAVA 以编程方式到 Google 云存储的 S3 对象(公共 URL)[关闭]

Posted

技术标签:

【中文标题】使用 JAVA 以编程方式到 Google 云存储的 S3 对象(公共 URL)[关闭]【英文标题】:S3 object (public URL ) to Google cloud storage programmatically using JAVA [closed] 【发布时间】:2020-04-20 21:52:16 【问题描述】:

想要使用 Java 以编程方式将文件从 AWS S3(公共 URL 可用)传输到 Google 云存储。

每个 S3 文件都是由第三方自动生成的,并且每天都会提供 URL。为了完全访问这些数据,我想将这些文件传输到我们的 Google 云存储以进行进一步分析。

无法在预定时间创建传输作业,因为 S3 URL 是随机的,我们会在每日检索时知道。

我在 java 中找不到任何与 gsutil 相关的代码。

【问题讨论】:

请添加您目前尝试过的代码。 【参考方案1】:

您可以使用this guide 中的谷歌库。为了开始传输数据,您首先需要创建一个传输作业。传输作业管理和协调您的数据传输。您可以从 Google Cloud Console 创建传输作业,如文档中的 here 所述,或者您可以通过以下方式以编程方式执行此操作:

package com.google.cloud.storage.storagetransfer.samples;

import com.google.api.services.storagetransfer.v1.Storagetransfer;
import com.google.api.services.storagetransfer.v1.model.AwsAccessKey;
import com.google.api.services.storagetransfer.v1.model.AwsS3Data;
import com.google.api.services.storagetransfer.v1.model.Date;
import com.google.api.services.storagetransfer.v1.model.GcsData;
import com.google.api.services.storagetransfer.v1.model.Schedule;
import com.google.api.services.storagetransfer.v1.model.TimeOfDay;
import com.google.api.services.storagetransfer.v1.model.TransferJob;
import com.google.api.services.storagetransfer.v1.model.TransferSpec;
import java.io.IOException;
import java.io.PrintStream;

/**
 * Creates a one-off transfer job from Amazon S3 to Google Cloud Storage.
 */
public final class AwsRequester 
  /**
   * Creates and executes a request for a TransferJob from Amazon S3 to Cloud Storage.
   *
   * <p>The @code startDate and @code startTime parameters should be set according to the UTC
   * Time Zone. See:
   * https://developers.google.com/resources/api-libraries/documentation/storagetransfer/v1/java/latest/com/google/api/services/storagetransfer/v1/model/Schedule.html#getStartTimeOfDay()
   *
   * @return the response TransferJob if the request is successful
   * @throws InstantiationException
   *           if instantiation fails when building the TransferJob
   * @throws IllegalAccessException
   *           if an illegal access occurs when building the TransferJob
   * @throws IOException
   *           if the client failed to complete the request
   */
  public static TransferJob createAwsTransferJob(
      String projectId,
      String jobDescription,
      String awsSourceBucket,
      String gcsSinkBucket,
      String startDate,
      String startTime,
      String awsAccessKeyId,
      String awsSecretAccessKey)
      throws InstantiationException, IllegalAccessException, IOException 
    Date date = TransferJobUtils.createDate(startDate);
    TimeOfDay time = TransferJobUtils.createTimeOfDay(startTime);
    TransferJob transferJob =
        new TransferJob()
            .setDescription(jobDescription)
            .setProjectId(projectId)
            .setTransferSpec(
                new TransferSpec()
                    .setAwsS3DataSource(
                        new AwsS3Data()
                            .setBucketName(awsSourceBucket)
                            .setAwsAccessKey(
                                new AwsAccessKey()
                                    .setAccessKeyId(awsAccessKeyId)
                                    .setSecretAccessKey(awsSecretAccessKey)))
                    .setGcsDataSink(new GcsData().setBucketName(gcsSinkBucket)))
            .setSchedule(
                new Schedule()
                    .setScheduleStartDate(date)
                    .setScheduleEndDate(date)
                    .setStartTimeOfDay(time))
            .setStatus("ENABLED");

    Storagetransfer client = TransferClientCreator.createStorageTransferClient();
    return client.transferJobs().create(transferJob).execute();
  

  public static void run(PrintStream out)
      throws InstantiationException, IllegalAccessException, IOException 
    String projectId = TransferJobUtils.getPropertyOrFail("projectId");
    String jobDescription = TransferJobUtils.getPropertyOrFail("jobDescription");
    String awsSourceBucket = TransferJobUtils.getPropertyOrFail("awsSourceBucket");
    String gcsSinkBucket = TransferJobUtils.getPropertyOrFail("gcsSinkBucket");
    String startDate = TransferJobUtils.getPropertyOrFail("startDate");
    String startTime = TransferJobUtils.getPropertyOrFail("startTime");
    String awsAccessKeyId = TransferJobUtils.getEnvOrFail("AWS_ACCESS_KEY_ID");
    String awsSecretAccessKey = TransferJobUtils.getEnvOrFail("AWS_SECRET_ACCESS_KEY");

    TransferJob responseT =
        createAwsTransferJob(
            projectId,
            jobDescription,
            awsSourceBucket,
            gcsSinkBucket,
            startDate,
            startTime,
            awsAccessKeyId,
            awsSecretAccessKey);
    out.println("Return transferJob: " + responseT.toPrettyString());
  

  /**
   * Output the contents of a successfully created TransferJob.
   */
  public static void main(String[] args) 
    try 
      run(System.out);
     catch (Exception e) 
      e.printStackTrace();
    
  

【讨论】:

有些人可能会对在这种情况下确实需要使用一次性转移作业这一事实感到困惑,因此您可能想解释一下为什么会这样。

以上是关于使用 JAVA 以编程方式到 Google 云存储的 S3 对象(公共 URL)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将文件从 Azure Blob Storage 传输到 Google Cloud Storage

从 Google BigQuery 导出到 CloudSQL?

使用 spark 将 parquet 数据从 Google 云存储加载到 BigQuery

从 Cloud Function (python) 写入 Google Cloud Storage

以编程方式检测文件夹是不是为云本地文件夹

Appium:如何在开始测试运行 appium-testng 之前使用 java 在 aws 设备场设备上以编程方式创建 google 帐户