jen*_*gel 8 postgresql proxy amazon-rds typeorm amazon-rds-proxy
我试图弄清楚如何使用 TypeORM 在 lambda 函数中连接到 RDS PG 代理(因此建立连接没有问题)。我能够使用 Lambda 函数成功连接到 RDS 实例 - 但是,当我将信息指向代理(更改 Lambda 函数内的环境变量)时,我遇到了以下错误:
{
"errorType": "Error",
"errorMessage": "read ECONNRESET",
"code": "ECONNRESET",
"errno": "ECONNRESET",
"syscall": "read",
"stack": [
"Error: read ECONNRESET",
" at TCP.onStreamRead (internal/stream_base_commons.js:205:27)"
]
}
Run Code Online (Sandbox Code Playgroud)
这是用于创建与 TypeORM 连接的代码:
const config = getDBConfig();
connection = await createConnection(config);
// Retrieve database connection options
const getDBConfig = (): ConnectionOptions => {
// Use IAM-based authentication to connect
const signer = new RDS.Signer({
region: "us-east-1",
username: process.env.USERNAME,
hostname: process.env.HOSTNAME,
port: 5432,
});
// Retrieve password dynamically from RDS
const token = signer.getAuthToken({
username: process.env.USERNAME,
});
// Return configuration object
return {
username: process.env.USERNAME,
host: process.env.HOSTNAME,
port: 5432,
password: token,
ssl: {
ca: fs.readFileSync("./config/rds-ca-2019-root.pem").toString(),
},
type: "postgres",
database: "postgres",
synchronize: false,
entities: [],
};
};
Run Code Online (Sandbox Code Playgroud)
就两个环境变量而言,HOSTNAME 等于 RDS 代理提供的 URL,USERNAME 是为 RDS Proxy 分配的 secret 中的用户名。Lambda 函数和 RDS 代理都被授予管理员访问权限,只是为了确保那里没有干扰(我知道这很可怕,一旦我开始工作就会减少特权!)。代理的 IAM 身份验证已设置为必需。
2020 年 8 月 14 日更新
本文解释了如何使用 TypeORM 连接 RDS MySQL 代理,但仍然没有弄清楚如何连接到 RDS PG 代理。
我终于在 AWS 文档中找到了为 PG 设置数据库用户的说明。在此发布此信息以供那些也无法找到它们的人使用。
基本上您只需将用户添加到现有rds_iam组即可。
CREATE USER lambda;
GRANT ALL PRIVILEGES ON DATABASE postgres TO lambda;
GRANT rds_iam TO lambda;
Run Code Online (Sandbox Code Playgroud)