我正在使用 GCP Cloud SQL 實體來獲取資料。當使用其公共 IP 地址訪問此 SQL 實體時,連接正在發生并且資料可見。但由于安全限制,我只能通過私有 IP 地址訪問它。
我按照 Google 檔案中所說的通過私有 IP 地址進行連接的代碼進行了更改:(https://cloud.google.com/sql/docs/postgres/connect-app-engine-standard#private-ip_1)(https:// cloud.google.com/vpc/docs/configure-serverless-vpc-access#java-8 )
- 在ConnectionPoolContextListener.java檔案中: iptypes=Private 添加
config.addDataSourceProperty("ipTypes", "PRIVATE");
- 在appengine-web.xml檔案中:添加了無服務器 vpc 連接器元素
- 在gitlab-ci.yml檔案中:添加部署連接器服務的行
deploy_env-name: script:-gcloud app deploy src/main/webapp/WEB-INF/appengine-web.xml
這些更改不起作用,并且進行的 API 呼叫失敗,導致 CORS 錯誤(跨源資源共享錯誤預檢缺少允許源頭)(請參閱螢屏截圖) UI CORS 錯誤
應用引擎日志如下: com.zaxxer.hikari.pool.HikariPool throwPoolInitializationException: HikariPool-1 - 池初始化期間的例外。(HikariPool.java:587) org.postgresql.util.PSQLException:連接嘗試失敗。...引起:java.io.IOException:連接被拒絕
使用公共 IP 地址時一切正常,也沒有 CORS 錯誤。但是由于私有 IP 地址連接失敗,不確定這里出了什么問題。
資料庫連接代碼:
private DataSource createConnectionPool() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(String.format("jdbc:postgresql://google/%s",
DB_NAME));
config.setUsername(DB_USER);
config.setPassword(DB_PASS);
config.addDataSourceProperty("socketFactory",
"com.google.cloud.sql.postgres.SocketFactory");
config.addDataSourceProperty("cloudSqlInstance",
CLOUD_SQL_CONNECTION_NAME);
config.addDataSourceProperty("ipTypes", "PRIVATE");
config.setMaximumPoolSize(10);
config.setMinimumIdle(5);
config.setConnectionTimeout(10000); // 10 seconds
config.setIdleTimeout(600000); // 10 minutes
config.setMaxLifetime(1800000); // 30 minutes
DataSource pool = new HikariDataSource(config);
return pool;
}
uj5u.com熱心網友回復:
我之前創建的 VPC 連接器有問題。我創建了一個與 cloudsql 實體具有相同網路和區域的新 VPC 連接器,并分配了一個 IP 地址范圍,現在這個資料庫連接正在發生,資料正在加載,CORS 錯誤已經消失。
因此,要通過 App 引擎的私有 IP 地址連接到 SQL 實體,我只需要進行以下更改:
- 創建無服務器 VPC 連接器。
- 在 appengine.yml 檔案中添加 vpc-connector 元素
- 在 ConnectionPoolContextListener.java 檔案中包含屬性“iptypes”
uj5u.com熱心網友回復:
這就是問題所在。連接字串中有一個錯誤:
// Not correct
config.setJdbcUrl(String.format("jdbc:postgresql://google/%s", DB_NAME));
// Should be
config.setJdbcUrl(String.format("jdbc:postgresql:///%s", DB_NAME));
有關詳細資訊,請參閱檔案:https : //github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory/blob/main/docs/jdbc-postgres.md#creating-the-jdbc-url。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/319002.html
上一篇:GoogleAppEngine上的Angular12Universal錯誤:./my-app/server/main.js:語法錯誤:“(”意外
下一篇:當值為零時獲取開始和結束日期時間
