11

我试图弄清楚如何使用 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。

https://dev.to/vikasgarghb/rds-proxy-via-sam-15gn

4

1 回答 1

0

我终于在 AWS 文档中找到了为 PG 设置 DB 用户的说明。在这里为任何也找不到它们的人发布此信息。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.DBAccounts.html#UsingWithRDS.IAMDBAuth.DBAccounts.PostgreSQL

基本上,您只需要将用户添加到现有rds_iam组。

CREATE USER lambda;
GRANT ALL PRIVILEGES ON DATABASE postgres TO lambda;
GRANT rds_iam TO lambda;
于 2021-11-11T08:44:58.213 回答