使用 TypeORM 使用 IAM 凭证连接到 Amazon RDS PostgresQL 代理

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 代理。

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

İbr*_*ran 2

我终于在 AWS 文档中找到了为 PG 设置数据库用户的说明。在此发布此信息以供那些也无法找到它们的人使用。

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;
Run Code Online (Sandbox Code Playgroud)