无法使用节点发布连接到云 SQL



我一直在尝试使用pg模块连接到我的 Cloud SQL 实例,但到目前为止还没有成功。

我在网上看了很多,但对这个话题了解不多。我还想在某个时候在Cloud Run上部署我的Express应用程序,并让它连接到我的Cloud SQL实例,但我不知道如何做到这一点。

以下是我不明白的事情列表,并希望简要解释一下:

  1. 什么是Unix套接字连接,为什么我应该在普通连接上使用它们?
  2. 什么是云 SQL 代理?我需要使用它吗?如果是这样,为什么?
  3. 我是否需要执行任何额外的工作才能从 Cloud Run 连接到我的 Cloud SQL 实例?

以下是我尝试过使用pg.Client对象的所有连接对象和连接字符串:

  1. 第一个连接字符串:postgresql+psycopg2://postgres:password@/cloudsql/myapp:us-central1:mydb?host=/var/lib/postgresql
  2. 第二个连接字符串:postgresql://postgres:password@hostip:5432/myapp:us-central1:mydb
  3. 第三个连接字符串:postgresql://postgres:password@hostip:5432/sarcdb
  4. 连接对象:{ host: "/cloudsql/myapp:us-central1:mydb", username: "postgres", password: "password", database: "mydb" }

所有这些都给了我一个Connection terminated unexpectedly错误。

> Node.js & Cloud SQL 的 Cloud Functions 文档(向下滚动到 PostgreSQL(包含有关构建连接字符串和凭据所需的其他配置的适用信息。

为应用设置好后,需要将 Cloud SQL 实例添加到 Cloud Run 服务,然后它才能使用该连接字符串访问数据库。

下面直接从文档中复制代码示例,使用 Cloud Run 时,max1 的配置可能无法与其他并发设置保持同步。

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.
};
什么是

Unix套接字连接,为什么我应该使用它们而不是普通连接?

Unix 域套接字是用于进程间通信的套接字。如果您可以在TCP连接和Unix域套接字之间进行通信,则Unix域套接字可能会更快。

什么是云 SQL 代理?我需要使用它吗?如果是这样,为什么?

Cloud SQL 代理允许您使用服务账户的 IAM 权限对连接进行身份验证以连接到数据库。

由于Cloud SQL是一个云数据库,因此(默认情况下(它需要某种形式的身份验证来帮助其保持安全。与自我管理的 SSL 证书或列入白名单的 IP 地址相比,代理是一种更安全的连接方法。

我是否需要执行任何额外的工作才能从 Cloud Run 连接到我的 Cloud SQL 实例?

Cloud Run 负责为您运行代理,但您需要执行以下操作:

  1. 启用云 SQL 管理员 API
  2. 将云 SQL 实例添加到运行部署(按照以下步骤操作(。
  3. 确保运行代码的服务账户具有Cloud SQL ClientIAM 权限(这是在步骤 2 中为默认服务账户完成的(
  4. 将应用程序配置为与/cloudsql/INSTANCE_CONNECTION_NAME连接

相关内容

  • 没有找到相关文章

最新更新