【问题标题】:AWS Lambda connect via PG.js to RDS Postgres database (connection made, no timeout, but no database?)AWS Lambda 通过 PG.js 连接到 RDS Postgres 数据库(已建立连接,没有超时,但没有数据库?)
【发布时间】:2020-03-14 02:51:57
【问题描述】:

我的 lambda 函数正在尝试连接到 RDS PostGreSQL 数据库。由于我使用https://serverless.com/ 来部署该功能(设置我的云端),因此它将 LF 放在与 RDS DB 不同的 VPC 中。

不是什么大问题。如果您阅读:https://docs.aws.amazon.com/lambda/latest/dg/services-rds-tutorial.html 您会看到您可以使用子网和安全组 ID 设置 serverless.yml 文件(如下所示),然后为具有 AWSLambdaVPCAccessExecutionRole 的 Lambda 函数赋予一个角色(我为 VPC 和 Lambda 提供了完整的角色)。如果您不这样做,您将获得 ECONNREFUESED。

但即使在这样做之后,我也会收到一个 3D00 错误,它表示找不到名为“ysgdb”的数据库。但在 RDS 中,我看到它存在并且是公开的。

当数据库设置为本地 PostGreSQL 时,代码可以正常工作。

有什么想法可以下一步去哪里吗?

# serverless.yml

service: lambdadb
provider:
  name: aws
  stage: dev
  region: us-east-2
  runtime: nodejs10.x
functions:
  dbConn:
    # this is formatted as <FILENAME>.<HANDLER>
    handler: main.handler
    vpc:
      securityGroupIds:
        - sg-a1e6f4c3
      subnetIds:
        - subnet-53b45038
        - subnet-4a2a7830
        - subnet-1469d358
    events:
    - http:
        path: lambdadb
        method: post
        cors: true
    - http:
        path: lambdadb
        method: get
        cors: true

回复

{
  "statusCode": 200,
  "headers": {
    "Content-Type": "application/json"
  },
  "body": {
    "name": "error",
    "length": 90,
    "severity": "FATAL",
    "code": "3D000",
    "file": "postinit.c",
    "line": "880",
    "routine": "InitPostgres"
  },
  "isBase64Encoded": false
}

server.js

const aws = {
    user: "postgres",
    host: "ysgdb.cxeokcheapqj.us-east-2.rds.amazonaws.com",
    database: "ysgdb",
    password: "***",
    port: 5432
}

console.log(`PostgreSQL GET Function`)

const { Client } = require('pg')

const local = {
    user: "postgres",
    host: "localhost",
    database: "m3_db",
    password: "xxxx",
    port: 5432
}

const aws = {
    user: "postgres",
    host: "ysgdb.cxeokcheapqj.us-east-2.rds.amazonaws.com",
    database: "ysgdb",
    password: "xxxx",
    port: 5432
}

let response = {
    "statusCode": 200,
    "headers": {
        "Content-Type": "application/json"
    },
    "body": 'none',
    "isBase64Encoded": false
}

exports.handler = async (event, context, callback) => {
    const c = aws // switch to local for the local DB
    console.log(`aws credentials: ${JSON.stringify(c)}`)
    const client = new Client({
        user: c.user,
        host: c.host,
        database: c.database,
        password: c.password,
        port: c.port
    })
    try {
        await client.connect();
        console.log(`DB connected`)
    } catch (err) {
        console.error(`DB Connect Failed: ${JSON.stringify(err)}`)
        response.body = err
        callback(null, response)
    }

    client.query('SELECT NOW()', (err, res) => {
        if (err) {
            console.log('Database ' + err)
            response.body = err
            callback(null, response)
        } else {
            response.body = res
            callback(null, response)
        }
        client.end()
    })
}


if (process.env.USERNAME == 'ysg4206') {
    this.handler(null, null, (_, txt) => {console.log(`callback: ${JSON.stringify(txt)}`)})
} 

【问题讨论】:

  • 可能是一个显而易见的问题,但是那个特定的 db 是否与 lambda 在同一个 vpc 中?
  • 似乎当您进行无服务器部署时,它会将 lambda 放入它自己的 VPC。所以我按照以下说明进行操作:docs.aws.amazon.com/lambda/latest/dg/services-rds-tutorial.html(似乎没有办法将它放在同一个 VPC 中)。
  • 如您所见,我的 serverless.yml 添加了 DB VPC 所在的安全组和子域。我认为这足以提供跨 VPC 访问(lamda 函数的角色,也有 VPC 跨域执行)。
  • 嗨,您是否检查了用户 postgres 是否有权访问该数据库?因为如果连接没有超时,看起来像是数据库权限问题。
  • @pepo RDS 报告主用户名是 db:ysgdb 的 postgres,是的,我在创建密码时记下了密码。在放入安全组和子域之前,我遇到了超时。现在我没有。所以你的怀疑是好的。

标签: aws-lambda amazon-rds serverless-framework


【解决方案1】:

我找到了答案。虽然它显示了我的愚蠢,但我想在这里发布它以防其他人有同样的问题。

当我创建 RDS(自定义)PostGreSQL 时,我指定了我的数据库名称。我几乎不知道表单中的大约 20 个字段,还有一个您指定 dbname 的位置。如果你不这样做,它表示它不会创建数据库并且没有分配名称(控制台显示“-”作为名称。

名字是端点的第一部分。第二次指定的名称是数据库本身。

我在设置 RDS 时使用 PostGreSQL 进行安全/登录。

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2017-11-25
    相关资源
    最近更新 更多