2

Googleのコンテナエンジン(GKE)にSpring Boot/JHipsterアプリケーションをデプロイしようとしています。私はほとんどのことを理解しましたが、データベースインスタンス(Google Cloud SQL上で実行されているPostgreSQLインスタンス、Google SQL Proxyを使用)に問題があります。クラウドSQLプロキシと不十分な許可

私は、herehereの指示に従って、私のアプリをセットアップしました。

  1. 私はPostreSQLインスタンスをクラウドでセットアップし、自分のアプリケーションのデータベースとユーザーを作成しました。
  2. クラウドSQLクライアントの役割を持つSQLサービスを作成しました。JSONキーを取得し、クラウドSQLインスタンスの資格情報を作成するために使用しました。私もcloudsql-db-credentialsを作成しました。
  3. 私は追加のビットを私の配備のyamlファイルに追加しました。私は基本的にthis GitHub sampleからyamlファイルをクローンし、自分のDockerイメージ(Google Container Registryでホストされている)でwordpressへの参照をすべて置き換えました。

deployment.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ファイルを更新しました:

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 

この「十分な権限」エラーがStackOverflowの上で多くのことをポップアップし、私は私と全く同じシナリオだ質問を発見していません。一般的なOAuthレベルのエラーのようです。私は指示に反して私のセットアップを二度チェックしたような気がします。どこの追加手がかりもどこで探すことができるのか分かりません。

アイデア?

更新:ヴァディムのポインタへの

おかげで、私は「十分な権限」問題を乗り越えることができました。残念なことに、私のアプリは起動時にデータベースへの接続を試みるとき(特に、LiquibaseがDBに接続して移行スクリプトを実行しようとしたとき)に失敗します。

私の新しいエラーがドライバーでソケットレベルである: - ソケットすでに接続されている問題 -

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 
+0

GKEを設定するときにCloud SQLスコープを有効にしていることを再度確認します。https://medium.com/google-cloud/updating-google-container-engine-vm-scopes-with-zero-downtime-50bff87e5f80 – Vadim

+0

それは事を間違いなく変えた。私はまだJDBCの問題を抱えていますが、もはや不十分なパーミッションの問題ではありません。私の新しいエラーは 'java.net.SocketException:already connected'エラーです。これは私が推測しているのは何らかのプーリング問題です。私は遠くに進む方法についていくつかのアイデアを持っています。ありがとう! – bcholmes

答えて

3

ヴァディムは、私が尋ねた問題が、2番目の問題を解決したが、最終的により考え出しました私の同僚の一人。

ソケットの問題の根本原因は、データソースの設定に関連しています。私は、Cloud SQL環境にアクセスするための2つの異なるメカニズムをミキシングして照合していることが判明しました。

  1. Cloud SQLプロキシを使用する。そして、私は成功したクラウドSQLのプロキシ設定したため、Googleソケットファクトリ

を使用して

  • 、私は必要がないというのが私の春のブート環境での奇妙なJDBCのURL。今、私は私のJDBCのURLを交換してきたことを、私のアプリが正常に接続

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

    :私はそうのように、127.0.0.1:5432を使用して接続することができます。

  • 0

    これは少し古いですが、Cloud SQLプロキシを使用するのは解決策ではありません。

    Spring BootでGoogleソケットファクトリを使用しているときに私はjava.net.SocketException: already connectedと同じ問題が発生しました。

    postgresqlドライバを最新版(書込み時点でorg.postgresql:postgresql:42.2.1)にアップグレードした後、これを修正できました。

    関連する問題