【问题标题】:Setting GOOGLE_APPLICATION_CREDENTIALS in Spring在春季设置 GOOGLE_APPLICATION_CREDENTIALS
【发布时间】:2018-05-01 18:08:08
【问题描述】:

我正在尝试使用 Spring 从 Google Storage Buckets 访问文件,最终目标是使用 MultiResourceItemReader 从存储桶中读取多个 XML 文件。当 XML 文件在我的机器上本地(不是 GCP)时,我目前正在使用 Spring 处理这个过程

现在,我想做同样的事情,但不是我机器上的 XML 文件,而是 GCP 存储桶中的文件。我可以访问 Spring 之外的存储桶内容,一次一个文件。例如,这一点测试代码允许我访问存储桶,然后查看存储桶中的文件。在这个 sn-p 中,我通过 JSON 密钥文件设置凭据。 (不是环境变量)

public static void storageDriver() throws IOException {
// Load credentials from JSON key file. If you can't set the GOOGLE_APPLICATION_CREDENTIALS
// environment variable, you can explicitly load the credentials file to construct the
// credentials.

    String name = "";
    String bucketName = "";
    String bucketFileName = "";
    String bucketFullPath = "";
    Resource myBucker;
    GoogleCredentials credentials;
    File credentialsPath = new File("mycreds.json");  
    try (FileInputStream serviceAccountStream = new FileInputStream(credentialsPath)) {
        credentials = ServiceAccountCredentials.fromStream(serviceAccountStream);
    }


    Storage storage = StorageOptions.newBuilder()
            .setCredentials(credentials)
            .setProjectId("myProject")
            .build()
            .getService();

    for (Bucket bucket:storage.list().iterateAll()){
        if(bucket.getName().equalsIgnoreCase("myGoogleBucket")){
            bucketName = bucket.getName();
            System.out.println(bucket);
            for (Blob blob : bucket.list().iterateAll()){
                bucketFileName = blob.getName();
                bucketFullPath = "gs://"+bucketName+"/"+bucketFileName;
                System.out.println(bucketFullPath);

            }
        }
    };

但是,当我尝试对 Spring 执行以下操作时,Spring 抱怨我没有定义 GOOGLE_APPLICATION_CREDENTIALS。 (当然我不这样做,因为我是以编程方式进行的。

例如,我将添加

@Value("gs://myGoogleBucket")
private Resource[] resources;

应用程序默认凭据不可用。如果在 Google Compute Engine 中运行,它们就可用。否则,必须定义环境变量GOOGLE_APPLICATION_CREDENTIALS 指向定义凭据的文件。

【问题讨论】:

  • 在使用 Intellij 时,在运行/调试配置中,我定义了环境变量 GOOGLE_APPLICATION_CREDENTIALS 并让它指向我正在通过代码执行的 json 文件。如果我通过 IDE 运行它,这将超过 Spring 运行时错误。除了通过环境变量设置凭证 json 文件之外,还有其他方法可以告诉 Spring 凭证 json 文件是什么。它也不喜欢我之前展示的代码。如果我要将其部署到服务器而不是在本地运行,这将是至关重要的信息。
  • 更深入地了解这一点。 ,如何通过Spring访问存储桶“列表”(Bucket中的文件)以使用MultiResourceItemReader?换句话说,我如何让 Spring 的行为就像 google 存储就像计算机上的目录一样。

标签: java spring google-cloud-storage


【解决方案1】:

Spring Cloud GCP 简化了您的 GCS 配置。

您可以将Storage support 添加到您的应用中。然后,通过spring.cloud.gcp.storage.credentials.location 属性或logging in with application default credentials using the Google Cloud SDK 指定服务帐户凭据的位置。

这将自动为您提供完全配置的 Storage 对象,而 @Value(gs://YOUR-BUCKET/YOUR-FILE) 之类的东西应该可以正常工作。

【讨论】:

  • 这通过使用 spring-cloud-gcp-starter-storage 依赖项和 spring.cloud.gcp.storage.credentials.location 属性解决了 GOOGLE_APPLICATION_CREDENTIALS 问题。但是,访问存储桶内的多个文件的主要问题仍然存在。例如@Value("gs://myGoogleBucket/*.xml")private Resource[] resources;
  • 好像有两个问题合二为一。 spring-cloud-gcp 为从 GCS 批量下载文件提供的唯一类似支持是 Spring Integration channel adapters。我们目前不为 @Value("gs://myGoogleBucket/*.xml") 之类的案例提供支持。
  • 问题不是如何使用 Spring 访问存储桶中的单个文件,而是如何访问存储桶中的多个文件以使用 MultiResourceItemReader 类。你 (Joao) 是说 Spring 在 google 存储方面不支持这一点吗?
  • 目前,spring-cloud-gcp 项目不支持这种模式资源解析。这是tracking issue,请随时在那里贡献!
【解决方案2】:

我尝试了很多方法,但最后这段来自 spring 文档的摘录对我有用:

由于设置日志记录的方式,application.properties 中定义的 GCP 项目 ID 和凭据将被忽略。相反,您应该将 GOOGLE_CLOUD_PROJECTGOOGLE_APPLICATION_CREDENTIALS 环境变量分别设置为项目 ID 和凭据私钥位置。如果您使用的是 Google Cloud SDK,则可以轻松地做到这一点,分别使用 gcloud config set project [YOUR_PROJECT_ID]gcloud auth application-default login 命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2019-05-02
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多