我正在关注这个文档: 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);
});
});
这是我的防火墙
default
:
我可能会错过什么?
虽然相似,但它们仍然不同,您引用的代码示例适用于 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);
});
});