无法使用 node-postgres 连接到 Cloud SQL
Can't connect to Cloud SQL using node-postgres
我一直在尝试使用 pg
模块连接到我的云 SQL 实例,但到目前为止还没有成功。
我在网上看了很多,但对这个话题了解不多。我也想在某个时候在 Cloud 运行 上部署我的 Express 应用程序,并将其连接到我的 Cloud SQL 实例,但我不知道该怎么做。
这是我不明白的事情列表,希望得到简要解释:
- 什么是 Unix 套接字连接,为什么要在正常连接上使用它们?
- 什么是云 SQL 代理?我需要使用它吗?如果是,为什么?
- 我是否需要做任何额外的工作才能从 Cloud 运行 连接到我的 Cloud SQL 实例?
以下是我尝试使用 pg.Client
对象的所有连接对象和连接字符串:
- 第一个连接字符串:
postgresql+psycopg2://postgres:password@/cloudsql/myapp:us-central1:mydb?host=/var/lib/postgresql
- 第二个连接字符串:
postgresql://postgres:password@hostip:5432/myapp:us-central1:mydb
- 第三个连接字符串:
postgresql://postgres:password@hostip:5432/sarcdb
- 连接对象:
{ host: "/cloudsql/myapp:us-central1:mydb", username: "postgres", password: "password", database: "mydb" }
所有这些都给我一个 Connection terminated unexpectedly
错误。
Cloud Functions documentation for Node.js & Cloud SQL(向下滚动到 PostgreSQL)包含有关构建连接字符串和凭据所需的额外配置的适用信息。
一旦为您的应用准备好,您需要add the Cloud SQL instance to your Cloud Run service才能使用该连接字符串访问数据库。
此处直接从文档中复制代码示例,使用 Cloud 运行 1 的 max
配置可能跟不上其他并发设置。
const pg = require('pg');
/**
* TODO(developer): specify SQL connection details
*/
const connectionName =
process.env.INSTANCE_CONNECTION_NAME || '<YOUR INSTANCE CONNECTION NAME>';
const dbUser = process.env.SQL_USER || '<YOUR DB USER>';
const dbPassword = process.env.SQL_PASSWORD || '<YOUR DB PASSWORD>';
const dbName = process.env.SQL_NAME || '<YOUR DB NAME>';
const pgConfig = {
max: 1,
user: dbUser,
password: dbPassword,
database: dbName,
};
if (process.env.NODE_ENV === 'production') {
pgConfig.host = `/cloudsql/${connectionName}`;
}
// Connection pools reuse connections between invocations,
// and handle dropped or expired connections automatically.
let pgPool;
exports.postgresDemo = (req, res) => {
// Initialize the pool lazily, in case SQL access isn't needed for this
// GCF instance. Doing so minimizes the number of active SQL connections,
// which helps keep your GCF instances under SQL connection limits.
if (!pgPool) {
pgPool = new pg.Pool(pgConfig);
}
pgPool.query('SELECT NOW() as now', (err, results) => {
if (err) {
console.error(err);
res.status(500).send(err);
} else {
res.send(JSON.stringify(results));
}
});
// Close any SQL resources that were declared inside this function.
// Keep any declared in global scope (e.g. mysqlPool) for later reuse.
};
What are Unix socket connections and why should I use them over normal connections?
一个Unix domain socket是进程间通信的套接字。如果您可以在 TCP 连接和 Unix 域套接字之间的通信之间进行选择,Unix 域套接字可能更快。
What is a Cloud SQL Proxy? Do I need to use it? If so, why?
云 SQL 代理允许您使用服务帐户的 IAM 权限对连接进行身份验证以连接到您的数据库。
由于 Cloud SQL 是一个云数据库,它需要(默认情况下)某种形式的身份验证来帮助它保持安全。与自我管理的 SSL 证书或列入白名单的 IP 地址相比,代理是一种更安全的连接方法。
Would I need to do any extra work to connect to my Cloud SQL instance from Cloud Run?
Cloud 运行 为您处理 运行 代理,但您需要执行以下操作:
- 启用云 SQL 管理员 API
- 将 Cloud SQL 实例添加到您的 运行 部署(follow these steps)。
- 确保服务帐户 运行 您的代码具有
Cloud SQL Client
IAM 权限(这是在第 2 步为默认服务帐户完成的)
- 配置您的应用程序以连接
/cloudsql/INSTANCE_CONNECTION_NAME
我一直在尝试使用 pg
模块连接到我的云 SQL 实例,但到目前为止还没有成功。
我在网上看了很多,但对这个话题了解不多。我也想在某个时候在 Cloud 运行 上部署我的 Express 应用程序,并将其连接到我的 Cloud SQL 实例,但我不知道该怎么做。
这是我不明白的事情列表,希望得到简要解释:
- 什么是 Unix 套接字连接,为什么要在正常连接上使用它们?
- 什么是云 SQL 代理?我需要使用它吗?如果是,为什么?
- 我是否需要做任何额外的工作才能从 Cloud 运行 连接到我的 Cloud SQL 实例?
以下是我尝试使用 pg.Client
对象的所有连接对象和连接字符串:
- 第一个连接字符串:
postgresql+psycopg2://postgres:password@/cloudsql/myapp:us-central1:mydb?host=/var/lib/postgresql
- 第二个连接字符串:
postgresql://postgres:password@hostip:5432/myapp:us-central1:mydb
- 第三个连接字符串:
postgresql://postgres:password@hostip:5432/sarcdb
- 连接对象:
{ host: "/cloudsql/myapp:us-central1:mydb", username: "postgres", password: "password", database: "mydb" }
所有这些都给我一个 Connection terminated unexpectedly
错误。
Cloud Functions documentation for Node.js & Cloud SQL(向下滚动到 PostgreSQL)包含有关构建连接字符串和凭据所需的额外配置的适用信息。
一旦为您的应用准备好,您需要add the Cloud SQL instance to your Cloud Run service才能使用该连接字符串访问数据库。
此处直接从文档中复制代码示例,使用 Cloud 运行 1 的 max
配置可能跟不上其他并发设置。
const pg = require('pg');
/**
* TODO(developer): specify SQL connection details
*/
const connectionName =
process.env.INSTANCE_CONNECTION_NAME || '<YOUR INSTANCE CONNECTION NAME>';
const dbUser = process.env.SQL_USER || '<YOUR DB USER>';
const dbPassword = process.env.SQL_PASSWORD || '<YOUR DB PASSWORD>';
const dbName = process.env.SQL_NAME || '<YOUR DB NAME>';
const pgConfig = {
max: 1,
user: dbUser,
password: dbPassword,
database: dbName,
};
if (process.env.NODE_ENV === 'production') {
pgConfig.host = `/cloudsql/${connectionName}`;
}
// Connection pools reuse connections between invocations,
// and handle dropped or expired connections automatically.
let pgPool;
exports.postgresDemo = (req, res) => {
// Initialize the pool lazily, in case SQL access isn't needed for this
// GCF instance. Doing so minimizes the number of active SQL connections,
// which helps keep your GCF instances under SQL connection limits.
if (!pgPool) {
pgPool = new pg.Pool(pgConfig);
}
pgPool.query('SELECT NOW() as now', (err, results) => {
if (err) {
console.error(err);
res.status(500).send(err);
} else {
res.send(JSON.stringify(results));
}
});
// Close any SQL resources that were declared inside this function.
// Keep any declared in global scope (e.g. mysqlPool) for later reuse.
};
What are Unix socket connections and why should I use them over normal connections?
一个Unix domain socket是进程间通信的套接字。如果您可以在 TCP 连接和 Unix 域套接字之间的通信之间进行选择,Unix 域套接字可能更快。
What is a Cloud SQL Proxy? Do I need to use it? If so, why?
云 SQL 代理允许您使用服务帐户的 IAM 权限对连接进行身份验证以连接到您的数据库。
由于 Cloud SQL 是一个云数据库,它需要(默认情况下)某种形式的身份验证来帮助它保持安全。与自我管理的 SSL 证书或列入白名单的 IP 地址相比,代理是一种更安全的连接方法。
Would I need to do any extra work to connect to my Cloud SQL instance from Cloud Run?
Cloud 运行 为您处理 运行 代理,但您需要执行以下操作:
- 启用云 SQL 管理员 API
- 将 Cloud SQL 实例添加到您的 运行 部署(follow these steps)。
- 确保服务帐户 运行 您的代码具有
Cloud SQL Client
IAM 权限(这是在第 2 步为默认服务帐户完成的) - 配置您的应用程序以连接
/cloudsql/INSTANCE_CONNECTION_NAME