GCP Postgres 拒绝来自 App Engine nodejs 的连接
GCP Postgres refusing connection from App Engine nodejs
我正在按照 Strapi on CGP App Engine (nodejs- standard env) 的教程进行操作,但无法启动应用程序,因为 GCP Postgres 实例(Public IP)拒绝连接 Error: connect ECONNREFUSED 127.0.0.1:5432
。
为什么我很困惑
- GCP 服务原则权限:
<project_name>@appspot.gserviceaccount.com
对 App Engine default service account
具有 Cloud SQL Client
,因此这应该适用于所有 App Engine 服务。
- 我有其他 App Engine 服务 (python) 成功连接到其他 Postgres 数据库。这告诉我我有正确的权限,
Cloud SQL Admin API
启用,以及正确的 username/password.
- 该代码在链接 GCP Postgres 数据库时在本地 (Docker) 工作,但仅使用 TCP 路由,而不是 Unix 套接字 SQL 代理:
../../cloud_sql_proxy -instances=<project_name>:europe-west1:<sql_instance_name>=tcp:5432 & (sleep 5 && yarn strapi start)
我可以登录本地托管的 Strapi 应用程序、添加用户等,所做的更改会反映在 GCP Postgres 数据库中。
- 本地部署 (docker-compose.yml) 和应用引擎 (app.yml) 之间的唯一区别是我如何设置环境变量。
#Dockerfile
FROM node:14-buster
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && apt-get update -y && apt-get install google-cloud-sdk -y
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
#docker-compose.yml
version: "3.8"
services:
dev:
build: .
ports:
- "1337:1337"
volumes:
- .:/src
command: ["yarn", "run", "start"]
working_dir: /src
environment:
NODE_ENV: "production"
DATABASE_NAME: '<database name>'
DATABASE_USERNAME: '<username>'
DATABASE_PASSWORD: '<password>'
INSTANCE_CONNECTION_NAME: '<project_name>:europe-west1:<instance_name>'
# app.yml
runtime: nodejs14
instance_class: F2
service: strapi
env_variables:
HOST: '0.0.0.0'
NODE_ENV: 'local'
DATABASE_NAME: '<database name>'
DATABASE_USERNAME: '<username>'
DATABASE_PASSWORD: '<password>'
INSTANCE_CONNECTION_NAME: '<project_name>:europe-west1:<instance_name>'
beta_settings:
cloud_sql_instances: '<project_name>:europe-west1:<instance_name>'
nodejs项目中定义连接的代码,来自Strapi教程:
module.exports = ({ env }) => ({
defaultConnection: 'default',
connections: {
default: {
connector: 'bookshelf',
settings: {
client: 'postgres',
socketPath: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
database: env('DATABASE_NAME'),
username: env('DATABASE_USERNAME'),
password: env('DATABASE_PASSWORD'),
},
options: { }
},
},
});
我错过了什么?我还能检查什么?有人请帮我结束这种疯狂。
为我修复的是以下内容:
- 转到我的 App 引擎默认服务主体并为其指定以下角色(如所述here)
- 云SQL客户端
- 云端SQL编辑器
- 云SQL管理员
- 在以下默认连接设置中将 socketPath 键更改为 'host':
module.exports = ({ env }) => ({
defaultConnection: 'default',
connections: {
default: {
connector: 'bookshelf',
settings: {
client: 'postgres',
----> socketPath: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
database: env('DATABASE_NAME'),
username: env('DATABASE_USERNAME'),
password: env('DATABASE_PASSWORD'),
},
options: { }
},
},
});
我正在按照 Strapi on CGP App Engine (nodejs- standard env) 的教程进行操作,但无法启动应用程序,因为 GCP Postgres 实例(Public IP)拒绝连接 Error: connect ECONNREFUSED 127.0.0.1:5432
。
为什么我很困惑
- GCP 服务原则权限:
<project_name>@appspot.gserviceaccount.com
对App Engine default service account
具有Cloud SQL Client
,因此这应该适用于所有 App Engine 服务。 - 我有其他 App Engine 服务 (python) 成功连接到其他 Postgres 数据库。这告诉我我有正确的权限,
Cloud SQL Admin API
启用,以及正确的 username/password. - 该代码在链接 GCP Postgres 数据库时在本地 (Docker) 工作,但仅使用 TCP 路由,而不是 Unix 套接字 SQL 代理:
../../cloud_sql_proxy -instances=<project_name>:europe-west1:<sql_instance_name>=tcp:5432 & (sleep 5 && yarn strapi start)
我可以登录本地托管的 Strapi 应用程序、添加用户等,所做的更改会反映在 GCP Postgres 数据库中。
- 本地部署 (docker-compose.yml) 和应用引擎 (app.yml) 之间的唯一区别是我如何设置环境变量。
#Dockerfile
FROM node:14-buster
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && apt-get update -y && apt-get install google-cloud-sdk -y
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
#docker-compose.yml
version: "3.8"
services:
dev:
build: .
ports:
- "1337:1337"
volumes:
- .:/src
command: ["yarn", "run", "start"]
working_dir: /src
environment:
NODE_ENV: "production"
DATABASE_NAME: '<database name>'
DATABASE_USERNAME: '<username>'
DATABASE_PASSWORD: '<password>'
INSTANCE_CONNECTION_NAME: '<project_name>:europe-west1:<instance_name>'
# app.yml
runtime: nodejs14
instance_class: F2
service: strapi
env_variables:
HOST: '0.0.0.0'
NODE_ENV: 'local'
DATABASE_NAME: '<database name>'
DATABASE_USERNAME: '<username>'
DATABASE_PASSWORD: '<password>'
INSTANCE_CONNECTION_NAME: '<project_name>:europe-west1:<instance_name>'
beta_settings:
cloud_sql_instances: '<project_name>:europe-west1:<instance_name>'
nodejs项目中定义连接的代码,来自Strapi教程:
module.exports = ({ env }) => ({
defaultConnection: 'default',
connections: {
default: {
connector: 'bookshelf',
settings: {
client: 'postgres',
socketPath: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
database: env('DATABASE_NAME'),
username: env('DATABASE_USERNAME'),
password: env('DATABASE_PASSWORD'),
},
options: { }
},
},
});
我错过了什么?我还能检查什么?有人请帮我结束这种疯狂。
为我修复的是以下内容:
- 转到我的 App 引擎默认服务主体并为其指定以下角色(如所述here)
- 云SQL客户端
- 云端SQL编辑器
- 云SQL管理员
- 在以下默认连接设置中将 socketPath 键更改为 'host':
module.exports = ({ env }) => ({
defaultConnection: 'default',
connections: {
default: {
connector: 'bookshelf',
settings: {
client: 'postgres',
----> socketPath: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
database: env('DATABASE_NAME'),
username: env('DATABASE_USERNAME'),
password: env('DATABASE_PASSWORD'),
},
options: { }
},
},
});