Как использовать идентификатор рабочей нагрузки gcp в приложении java springboot?
Ниже я установил переменную в application.properties и попытался использовать экземпляр службы по умолчанию:
private static void testListGCPBucket() String configPath) throws IOException {
Storage storage = StorageOptions.getDefaultInstance().getService();
System.out.println("Buckets:");
Page<Bucket> buckets = storage.list();
for (Bucket bucket : buckets.iterateAll()) {
System.out.println(bucket.toString());
}
System.out.println("completed...");
}
содержимое файла application.config :
GOOGLE_APPLICATION_CREDENTIALS= путь к классам:config.json
Но это не работает, я получаю ошибку ниже:
Caused by: com.google.api.client.http.HttpResponseException: 403 Forbidden
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/proj-workload-id-svc-acct@idmp-mii-dev-ddb5.iam.gserviceaccount.com:generateAccessToken
{
"error": {
"code": 403,
"message": "The caller does not have permission",
"errors": [
{
"message": "The caller does not have permission",
"domain": "global",
"reason": "forbidden"
}
],
"status": "PERMISSION_DENIED"
}
}
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1116)
at com.google.auth.oauth2.ImpersonatedCredentials.refreshAccessToken(ImpersonatedCredentials.java:441)
... 36 more
1 ответ
Насколько я понимаю, при использовании DefaultService он будет смотреть на переменные вашей среды. Установка его в application.properties не изменит ваши переменные среды.
Вместо этого вам нужно будет указать на свой файл. Добавив его в свой application.properties, он не будет подхвачен.
Credentials credentials = GoogleCredentials
.fromStream(new FileInputStream("yourJsonConfig"));
Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
Или, согласно официальной документации, вы можете использовать Spring Cloud GCC Starter и настроить его с помощью файла application.properties.
2 Полномочия
CredentialsProvider - это функциональный интерфейс, который возвращает учетные данные для аутентификации и авторизации вызовов клиентских библиотек Google Cloud.
открытый интерфейс CredentialsProvider {Credentials getCredentials() выбрасывает исключение IOException; }
Программа запуска Spring Cloud GCP автоматически настраивает CredentialsProvider. Он использует свойство spring.cloud.gcp.credentials.location для поиска закрытого ключа OAuth2 учетной записи службы Google. Имейте в виду, что это свойство является ресурсом Spring, поэтому файл учетных данных может быть получен из ряда различных мест, таких как файловая система, путь к классам, URL-адрес и т. Д. В следующем примере указывается свойство местоположения учетных данных в файловой системе.
spring.cloud.gcp.credentials.location = файл: /usr/local/key.json
Кроме того, вы можете установить учетные данные, напрямую указав свойство spring.cloud.gcp.credentials.encoded-key. Значение должно быть закрытым ключом учетной записи в кодировке base64 в формате JSON.
Если эти учетные данные не указаны в свойствах, стартер пытается найти учетные данные из нескольких мест:
Credentials file pointed to by the GOOGLE_APPLICATION_CREDENTIALS environment variable Credentials provided by the Google Cloud SDK gcloud auth application-default login command Google App Engine built-in credentials Google Cloud Shell built-in credentials Google Compute Engine built-in credentials
Если ваше приложение работает на Google App Engine или Google Compute Engine, в большинстве случаев вам следует опустить свойство spring.cloud.gcp.credentials.location и вместо этого позволить Spring Cloud GCP Starter получить правильные учетные данные для этих сред. В App Engine Standard используются учетные данные учетной записи службы App Identity, в App Engine Flexible используются учетные данные учетной записи службы Flexible, а в Google Compute Engine используется учетная запись службы Compute Engine по умолчанию.