Облачный SQL-прокси и недостаточное разрешение

Я пытаюсь развернуть свое приложение Spring Boot/JHipster на Контейнерном движке Google (GKE). Я выяснил большинство вещей, но у меня проблема с экземпляром базы данных (экземпляр PostgreSQL, работающий на Google Cloud SQL, с прокси-сервером Google SQL).

Я следовал инструкциям здесь и здесь, чтобы настроить мое приложение.

  1. Я настроил свой экземпляр PostreSQL в облаке и создал базу данных и пользователя своего приложения.
  2. Я создал службу SQL с ролью Cloud SQL Client - я взял ключ JSON и использовал его для создания своих облачных учетных данных экземпляра. Я также создал свои cloudql-db-учетные данные.
  3. Я добавил дополнительные биты в свой файл развертывания yaml. Я в основном клонировал файл yaml из этого примера GitHub и заменил все ссылки на wordpress своим собственным изображением Docker (размещенным в реестре контейнеров Google). Я также обновил блок прокси, вот так:

Фрагмент deploy.yaml:

  - image: gcr.io/cloudsql-docker/gce-proxy:1.09
      name: cloudsql-proxy
          command: ["/cloud_sql_proxy", "--dir=/cloudsql",
                    "-instances=[my-project]:us-central1:[my-sql-instance-id]=tcp:5432",
                    "-credential_file=/secrets/cloudsql/credentials.json"]

Наконец, я обновил свой yaml-файл конфигурации Spring Boot следующим образом:

datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:postgresql://google/[my-database]?socketFactory=com.google.cloud.sql.postgres.SocketFactory&socketFactoryArg=[my-project]:us-central1:[my-sql-instance-id]
    username: ${DB_USER}
    password: ${DB_PASSWORD}

Когда я kubectl create В моем развертывании образ развертывается, но приложение не запускается. Вот что заметно из моего журнала:

Caused by: java.lang.RuntimeException: Unable to retrieve information about Cloud SQL instance [[my-project]:us-central1:[my-sql-instance-id]]
    at com.google.cloud.sql.core.SslSocketFactory.obtainInstanceMetadata(SslSocketFactory.java:411)
    at com.google.cloud.sql.core.SslSocketFactory.fetchInstanceSslInfo(SslSocketFactory.java:284)
    at com.google.cloud.sql.core.SslSocketFactory.getInstanceSslInfo(SslSocketFactory.java:264)
    at com.google.cloud.sql.core.SslSocketFactory.createAndConfigureSocket(SslSocketFactory.java:183)
    at com.google.cloud.sql.core.SslSocketFactory.create(SslSocketFactory.java:152)
    at com.google.cloud.sql.postgres.SocketFactory.createSocket(SocketFactory.java:50)
    at org.postgresql.core.PGStream.<init>(PGStream.java:60)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:52)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:216)
    at org.postgresql.Driver.makeConnection(Driver.java:404)
    at org.postgresql.Driver.connect(Driver.java:272)
    ... 37 common frames omitted
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Insufficient Permission",
    "reason" : "insufficientPermissions"
  } ],
  "message" : "Insufficient Permission"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
    at com.google.cloud.sql.core.SslSocketFactory.obtainInstanceMetadata(SslSocketFactory.java:372)
    ... 48 common frames omitted

Эта ошибка "Недостаточно прав доступа" часто появляется в Stackru, но я не нашел вопроса, который бы точно соответствовал моему сценарию. Это похоже на общую ошибку уровня OAuth. Мне кажется, что я дважды проверил свою установку на соответствие инструкциям, и я не уверен, где я могу найти какие-либо дополнительные подсказки.

Есть идеи?

Обновить:

Благодаря указателю Вадима мне удалось преодолеть проблему "Недостаточное разрешение". К сожалению, мое приложение все еще терпит неудачу при загрузке, когда оно пытается установить соединение с базой данных (в частности, когда Liquibase пытается установить соединение с БД для запуска сценариев миграции).

Моя новая ошибка на уровне сокета в драйвере:

liquibase.exception.DatabaseException: org.postgresql.util.PSQLException: The connection attempt failed.
    at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:390)
    at io.github.jhipster.config.liquibase.AsyncSpringLiquibase.initDb(AsyncSpringLiquibase.java:82)
    at io.github.jhipster.config.liquibase.AsyncSpringLiquibase.afterPropertiesSet(AsyncSpringLiquibase.java:72)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
    ... 24 common frames omitted
Caused by: org.postgresql.util.PSQLException: The connection attempt failed.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:272)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:52)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:216)
    at org.postgresql.Driver.makeConnection(Driver.java:404)
    at org.postgresql.Driver.connect(Driver.java:272)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:86)
    at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:71)
    at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:385)
    ... 28 common frames omitted
Caused by: java.net.SocketException: already connected
    at java.net.Socket.connect(Socket.java:569)
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:673)
    at org.postgresql.core.PGStream.<init>(PGStream.java:61)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
    ... 37 common frames omitted

2 ответа

Решение

Вадим решил проблему, о которой я спрашивал, но вторая проблема - проблема с уже подключенным сокетом - была в конце концов выяснена одним из моих сотрудников.

Корень проблемы сокета связан с конфигурацией источника данных. Оказывается, я смешиваю и сопоставляю два разных механизма доступа к среде Cloud SQL.

  1. Использование Cloud SQL Proxy; а также
  2. Использование Google Socket Factory

Поскольку я успешно настроил Cloud SQL Proxy, мне не нужен этот странный URL-адрес JDBC в моей среде Spring Boot. Я могу подключиться используя 127.0.0.1:5432, вот так:

datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:postgresql://127.0.0.1:5432/[my-database-name]
    username: ${DB_USER}
    password: ${DB_PASSWORD}

Теперь, когда я заменил свой URL JDBC, мое приложение успешно подключается.

Это немного старый, но использование Cloud SQL Proxy не является решением.

У меня была такая же проблема с java.net.SocketException: already connected при использовании Google Socket Factory с Spring Boot.

Я смог исправить это после обновления драйвера postgresql до последней версии (org.postgresql:postgresql:42.2.1 на момент написания).

Другие вопросы по тегам