在 Java 应用程序中验证 Cloud Scheduler
Authenticating Cloud Scheduler in a Java Application
我正在使用 Java SDK 为 google 云调度程序创建一些计划作业。这是已作为另一个问题的一部分发布的应用程序代码的 。该应用程序基本上创建了一个 Cloud Scheduler 作业,它每次 运行s 都会触发 VertexAI 上的自定义训练作业。现在,从调度程序调用 VertexAI 以创建自定义作业已使用服务帐户进行身份验证。我的问题是关于创建 Cloud Scheduler 作业本身的应用程序代码的身份验证。我已将此应用程序设置为 Maven 项目,并创建了一个可执行 jar。应用程序本身 运行 在我的本地工作站上。以下是我的points/questions:
- 当我创建一个 docker 镜像并复制这个 jar 和服务帐户密钥到镜像中,然后设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量指向容器内的密钥,然后应用程序 运行 正常,Cloud Scheduler 作业已创建。
- 当我像上面那样做时,除了我只是在 powershell 中执行 jar(GOOGLE_APPLICATION_CREDENTIALS 环境变量指向服务帐户密钥),权限被拒绝。
- 与 2 相同,除了我只是 运行 使用 eclipse“运行 App”按钮的应用程序。
如何才能在 运行 应用程序中进行身份验证,而不必在 docker 容器中 运行。有没有一种方法可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量的情况下进行身份验证,即直接在应用程序代码本身中进行身份验证。示例 code/examples 的链接会有所帮助。
编辑:
对于第 2 点,问题是环境变量名称中的拼写错误。对于第3点,您可以直接在eclipse中设置环境变量,如@RJC的回答所述。
我的机器上没有 Eclipse,但我找到了一个 related answer,您可以在其中添加一个特定的环境变量 IDE 本身。我建议您尝试执行以下操作,看看是否可以解决问题。
还有另一种不使用 GOOGLE_APPLICATION_CREDENTIALS
进行身份验证的方法,那就是在您的代码中明确指向您的服务帐户文件。我创建了一个示例代码,它可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 的情况下检索作业名称。身份验证是通过在初始化 CloudSchedulerClient
.
时指定凭据设置来完成的
这是我这边所做的:
- 使用
gcloud iam service-accounts keys create serviceaccount.json --iam-account=NAME@PROJECT_ID.iam.gserviceaccount.com
将为将在 CredentialsProvider 中使用的服务帐户生成 JSON 文件。
- 创建一个
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 自定义凭据。
请注意,您使用的服务帐户如果处理不当可能会被未经授权的人读取。我的建议是仅将您的服务帐户设置为执行 task/s 所需的权限。您还可以按照此 best practices 来管理您的凭据。
我正在使用 Java SDK 为 google 云调度程序创建一些计划作业。这是已作为另一个问题的一部分发布的应用程序代码的
- 当我创建一个 docker 镜像并复制这个 jar 和服务帐户密钥到镜像中,然后设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量指向容器内的密钥,然后应用程序 运行 正常,Cloud Scheduler 作业已创建。
- 当我像上面那样做时,除了我只是在 powershell 中执行 jar(GOOGLE_APPLICATION_CREDENTIALS 环境变量指向服务帐户密钥),权限被拒绝。
- 与 2 相同,除了我只是 运行 使用 eclipse“运行 App”按钮的应用程序。
如何才能在 运行 应用程序中进行身份验证,而不必在 docker 容器中 运行。有没有一种方法可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量的情况下进行身份验证,即直接在应用程序代码本身中进行身份验证。示例 code/examples 的链接会有所帮助。
编辑: 对于第 2 点,问题是环境变量名称中的拼写错误。对于第3点,您可以直接在eclipse中设置环境变量,如@RJC的回答所述。
我的机器上没有 Eclipse,但我找到了一个 related answer,您可以在其中添加一个特定的环境变量 IDE 本身。我建议您尝试执行以下操作,看看是否可以解决问题。
还有另一种不使用 GOOGLE_APPLICATION_CREDENTIALS
进行身份验证的方法,那就是在您的代码中明确指向您的服务帐户文件。我创建了一个示例代码,它可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 的情况下检索作业名称。身份验证是通过在初始化 CloudSchedulerClient
.
这是我这边所做的:
- 使用
gcloud iam service-accounts keys create serviceaccount.json --iam-account=NAME@PROJECT_ID.iam.gserviceaccount.com
将为将在 CredentialsProvider 中使用的服务帐户生成 JSON 文件。 - 创建一个
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 自定义凭据。
请注意,您使用的服务帐户如果处理不当可能会被未经授权的人读取。我的建议是仅将您的服务帐户设置为执行 task/s 所需的权限。您还可以按照此 best practices 来管理您的凭据。