【问题标题】:Authenticating Cloud Scheduler in a Java Application在 Java 应用程序中对 Cloud Scheduler 进行身份验证
【发布时间】:2021-11-05 14:12:17
【问题描述】:

我正在使用 Java SDK for google cloud scheduler 创建一些计划作业。这是已作为另一个问题的一部分发布的应用程序代码的link。该应用程序基本上创建了一个 Cloud Scheduler 作业,每次运行时都会触发 VertexAI 上的自定义训练作业。现在,调度程序对 VertexAI 的调用以创建自定义作业已使用服务帐户进行身份验证。我的问题是关于创建 Cloud Scheduler 作业本身的应用程序代码的身份验证。我已将此应用程序设置为 maven 项目,并创建了一个可执行 jar。该应用程序本身在我的本地工作站上运行。以下是我的观点/问题:

  1. 当我创建一个 docker 映像并将这个 jar 和服务帐户密钥复制到映像中,然后将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为指向容器内的密钥时,应用程序运行正常并且 Cloud Scheduler 作业得到已创建。
  2. 当我执行与上述相同的操作时,除了我只是在 powershell 中执行 jar(使用指向服务帐户密钥的 GOOGLE_APPLICATION_CREDENTIALS 环境变量),权限被拒绝。
  3. 与 2 相同,只是我只是使用 eclipse 的“运行应用程序”按钮运行应用程序。

如何在无需在 docker 容器中运行的情况下进行身份验证以运行应用程序。有没有一种方法可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量的情况下进行身份验证,即直接在应用程序代码本身中进行身份验证。示例代码/示例的链接会有所帮助。

编辑: 对于第 2 点,问题是环境变量名称中的拼写错误。对于第3点,您可以直接在eclipse中设置环境变量,如@RJC的答案中所述。

【问题讨论】:

  • 你的问题不够精确。您是否尝试在工作站上运行您的代码?有或没有容器?使用您自己的用户凭据或服务帐户凭据(通过服务帐户密钥文件)?

标签: java google-cloud-platform google-authentication google-cloud-scheduler


【解决方案1】:

我的机器上没有 Eclipse,但我找到了related answer,您可以在其中在 IDE 本身中添加特定的环境变量。我建议您尝试执行以下操作,看看是否可以解决问题。

还有另一种不使用GOOGLE_APPLICATION_CREDENTIALS 进行身份验证的方法,即在代码中明确指向您的服务帐户文件。我创建了一个示例代码,它可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 的情况下检索作业名称。通过在初始化CloudSchedulerClient 时指定凭据设置来完成身份验证。

这是我最后所做的:

  1. 使用 gcloud iam service-accounts keys create serviceaccount.json --iam-account=NAME@PROJECT_ID.iam.gserviceaccount.com 将为将在 CredentialsProvider 中使用的服务帐户生成 JSON 文件。
  2. 创建一个CredentialsProvider 对象,该对象将调用创建的服务帐户的 JSON 文件。
try {
    JobName name = JobName.of("[PROJECT]", "[LOCATION]", "[JOB]");
    
    CredentialsProvider credentialsProvider =
    FixedCredentialsProvider.create(
    ServiceAccountCredentials.fromStream(new FileInputStream("/path/to/serviceaccount.json")));
            
    CloudSchedulerSettings cloudSchedulerSettings = CloudSchedulerSettings.newBuilder().setCredentialsProvider(credentialsProvider).build();
    
    CloudSchedulerClient cloudSchedulerClient = CloudSchedulerClient.create(cloudSchedulerSettings);
    
    System.out.println(cloudSchedulerClient.getJob(name).toString()); // To display the output
    cloudSchedulerClient.close();
    
} catch (IOException e) {
    e.printStackTrace();       
}

如需更多指导,请点击API reference 自定义凭据。

请注意,如果处理不当,您使用的服务帐户可能会被未经授权的人读取。我的建议是只为您的服务帐户设置执行任务所需的权限。您还可以关注此best practices 来管理您的凭据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 2013-03-09
    • 2023-03-11
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多