単純なJavaサーブレットアプリをGCPAppEngineにデプロイしました。同じGCPの下で、GCP CloudSQLのMySQLインスタンスを作成しました。
誰かがHTTPPostリクエストを行ったときに、MySQLサーバーに値を保存したいと思います。ただし、私のJavaアプリはGCPCloudSQLに接続できません。
CloudSQLページにAll apps in this project. All authorized.
と表示されますが、同じGCPプロジェクトの下にあるにもかかわらず、私のJavaアプリは接続できません。
すべてのネットワークを追加すると、正しく機能します。しかし、私はこれをしたくありません:
AppEngineからCloudSQLに接続できない理由は何ですか?実行する必要のある構成はありますか?
ホワイトリストに登録しないでください0.0.0.0/0
-これにより、任意のIPアドレスがインスタンスへの接続を試行できるようになります。
Cloud SQL JDBC Socket Factory を使用することをお勧めします。 Socket Factoryは、サービスアカウントの資格情報を使用して、インスタンスへの接続を認証します。
App Engineからの接続に関するこれらの手順 ページをチェックして、正しいAPIが有効になっていて、サービスアカウントに正しいアクセス許可が付与されていることを確認することもできます。
すべてのIPをホワイトリストに登録しないでください。これにより、インターネット上の誰もがSQLインスタンスにアクセスできるようになります。
Googleは、UNIXソケットを介したAppEngineからCloudSQLへの接続を処理します。ローカルから接続するには、AppEngineから接続するときにINSTANCE_CONNECTION_NAME
を使用することになっていますが、ホストをlocalhost
として指定し、ソケットパスを/cloudsql/<INSTANCE_CONNECTION_NAME>
として追加する必要があります。これはNodeJSの場合です。
Javaのようなもの
// Configure which instance and what database user to connect with.
config.setJdbcUrl(String.format("jdbc:mysql:///%s", DB_NAME));
config.setUsername(DB_USER); // e.g. "root", "postgres"
config.setPassword(DB_PASS); // e.g. "my-password"
// For Java users, the Cloud SQL JDBC Socket Factory can provide authenticated connections.
// See https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory for details.
config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory");
config.addDataSourceProperty("cloudSqlInstance", CLOUD_SQL_CONNECTION_NAME);
config.addDataSourceProperty("useSSL", "false");
残りのすべての構成は同じままです。同じ ここ の詳細なドキュメントを見てください。
私はしばらくの間、構成で正常に実行されています。