错误:连接 ECONNREFUSED 127.0.0.1:5432 从 Cloud Functions 连接到 Cloud SQL for PostgreSQL

问题描述 投票:0回答:1

我正在关注这个文档: https://cloud.google.com/sql/docs/postgres/connect-instance-cloud-functions

文档似乎有点偏离,因为没有提到在云功能中创建连接器,但这是必需的。

我让它与 helloworld 示例一起使用,但是当我尝试连接到我的 AlloyDb 并获取用户时,我收到此错误:

Error: connect ECONNREFUSED 127.0.0.1:543

我设置了我的环境变量:

INSTANCE_UNIX_SOCKET : /cloudsql/{my-project-id}:us-east4:quickstart-instance 
DB_NAME: {db_name}
DB_USER: {db_user}
DB_PASS: {my_pwd}

我将运行时服务帐户设置为具有 AlloyDb_Admin 权限的帐户

这是我的功能: -package.json

{
  "dependencies": {
   "@google-cloud/functions-framework": "^3.0.0",
   "knex": "3.1.0",
   "pg": "8.11.5"
 }
}

-index.js

const Knex = require('knex');

functions.http('getUsers', async (req, res) => {

    const createUnixSocketPool = async config => {

        return Knex({
            client: 'pg',
            connection: {
            user: process.env.DB_USER, // e.g. 'my-user'
            password: process.env.DB_PASS, // e.g. 'my-user-password'
            database: process.env.DB_NAME, // e.g. 'my-database'
            host: process.env.INSTANCE_UNIX_SOCKET, // e.g. '/cloudsql/project:region:instance'
            },
            ...config,
        });
    };

    const knex = await createUnixSocketPool()

    knex('users').select('*')
    .then(rows => {
        console.log(rows);
    })
    .catch(err => {
        console.error(err);
    });
}); 

这是我的网络: enter image description here

这是我的连接器详细信息: enter image description here

这是我的防火墙

default
enter image description here

我可能会错过什么?

google-cloud-platform google-cloud-functions google-cloud-sql
1个回答
0
投票

Cloud SQLAlloyDB 是两种不同的产品。

虽然相似,但它们仍然不同,您引用的代码示例适用于 Cloud SQL,不能按原样适用于 AlloyDB。然而,一个非常相似的示例将会(我认为这是一个更容易理解的示例)。

由于 AlloyDB 默认使用数据库的私有 IP 地址,因此我建议直接通过 TCP 连接连接到 AlloyDB 实例的私有 IP 地址,如下所示:

您将需要使用环境变量

INSTANCE_HOST
而不是
INSTANCE_UNIX_SOCKET
,并将其作为实例的私有IP地址,您可以在AlloyDB概述页面

上找到该地址
const Knex = require('knex');

functions.http('getUsers', async (req, res) => {
    const knex = Knex({
        client: 'pg',
        connection: {
            host: process.env.INSTANCE_HOST, // AlloyDB IP (ex. 10.0.0.1)
            port: 5432,
            user: process.env.DB_USER,
            password: process.env.DB_PASS,
            database: process.env.DB_NAME,
        },
    });
    knex('users').select('*')
    .then(rows => {
        console.log(rows);
    })
    .catch(err => {
        console.error(err);
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.