【发布时间】:2020-11-24 00:45:38
【问题描述】:
我试图弄清楚如何使用 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)"
]
}
这是用于创建与 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: [],
};
};
就这两个环境变量而言,HOSTNAME 等于 RDS 代理提供的 URL,USERNAME 是在密钥中为 RDS 代理分配的用户名。 Lambda 函数和 RDS 代理都被授予了管理员访问权限,只是为了确保那里没有干扰(我知道这很可怕,一旦我开始工作就会降低权限!)。 IAM 身份验证已设置为代理所需。
2020 年 8 月 14 日更新
本文介绍了如何将 RDS MySQL Proxy 与 TypeORM 连接,但仍然没有弄清楚如何连接到 RDS PG Proxy。
【问题讨论】:
-
我遇到了同样的问题,即使在我的机器上也无法正常工作。就我而言,我使用的是 Postgres,我只能认为它是 pg 驱动程序或 NodeJS 本身的问题。通过使用 JDBC 的 RDBMS 工具连接工作正常。
-
您实际上只能连接到 VPC 内的 RDS 代理!因此,如果您尝试在本地计算机上运行它,我认为您永远无法让它工作。我绝对认为这可能是某种驱动程序问题,我只是想知道是否有解决方法。将能够在 Lambda 函数中使用一个不错的 ORM 来创建无服务器应用程序@EdmundoRodrigues
-
我设置了 VPN,因此我可以访问 VPC 资源。同样,它适用于我的 RDSMS 工具(Datagrip,使用 JDBC),这是 pg-driver/nodejs 的问题,我不知道......
-
不错!那肯定会起作用哈哈。可能会开始挖掘内部结构以开始弄清楚这一点......
标签: postgresql proxy amazon-rds typeorm amazon-rds-proxy