Aws lambda AWS Lambda通过PG.js连接到RDS Postgres数据库(连接成功,没有超时,但没有数据库?)

Aws lambda AWS Lambda通过PG.js连接到RDS Postgres数据库(连接成功,没有超时,但没有数据库?),aws-lambda,amazon-rds,serverless-framework,Aws Lambda,Amazon Rds,Serverless Framework,我的lambda函数正在尝试连接到RDS PostGreSQL数据库。由于我使用部署功能(设置我的cloudfront),它将LF与RDS DB放在一个单独的VPC中 这不是什么大问题。如果你读到: 您可以使用子网和安全组ID设置serverless.yml文件(如下所示),然后为Lambda函数赋予一个角色,该函数具有AWSLambdaVPCAccessExecutionRole(我为VPC和Lambda赋予了完整的角色)。如果你不这样做,你会被解雇的 但即使这样做了,我还是会得到一个3D00

我的lambda函数正在尝试连接到RDS PostGreSQL数据库。由于我使用部署功能(设置我的cloudfront),它将LF与RDS DB放在一个单独的VPC中

这不是什么大问题。如果你读到: 您可以使用子网和安全组ID设置serverless.yml文件(如下所示),然后为Lambda函数赋予一个角色,该函数具有AWSLambdaVPCAccessExecutionRole(我为VPC和Lambda赋予了完整的角色)。如果你不这样做,你会被解雇的

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

当DB设置为本地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

server.js
我找到了答案。虽然这显示了我的愚蠢,但我想把它贴在这里,以防其他人也有同样的问题

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

第一个名称用于终结点的第一部分。第二次指定该名称时用于数据库本身

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


希望这能帮助别人。

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

当我创建RDS(自定义)PostGreSQL时,我指定了一个数据库名称。我不知道表单中大约有20个字段,有第二个位置可以指定数据库名称。如果不指定,它会说它不创建数据库,并且不指定名称(控制台显示“-”作为名称)

第一个名称用于终结点的第一部分。第二次指定该名称时用于数据库本身

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


希望这对其他人有所帮助。

这可能是一个明显的问题,但该特定数据库是否与lambda位于同一vpc中?似乎当您进行无服务器部署时,它会将lambda置于自己的vpc中。因此,我按照中的说明进行了操作:(似乎没有办法将其置于同一vpc中)。如您所见,my serverless.yml添加了DB VPC所在的安全组和子域。我认为这足以提供跨VPC访问(lamda函数的角色也有VPC跨域执行)。您好,您是否检查了用户
postgres
是否有权访问该数据库?因为如果连接未超时,则看起来像是数据库权限问题。@pepo RDS报告主用户名为postgres for db:ysgdb,是的,我在创建密码时记下了密码。我在加入安全组和子域之前超时。N我不这么认为。所以你的怀疑是正确的。可能是一个明显的问题,但那个特定的db和lambda在同一个vpc中吗?似乎当你进行无服务器部署时,它会将lambda放在它自己的vpc中。所以我按照中的说明:(似乎没有办法将它放在同一个vpc中)。如您所见,my serverless.yml添加了DB VPC所在的安全组和子域。我认为这足以提供跨VPC访问(lamda函数的角色也有VPC跨域执行)。您好,您是否检查了用户
postgres
是否有权访问该数据库?因为如果连接未超时,则看起来像是数据库权限问题。@pepo RDS报告主用户名为postgres for db:ysgdb,是的,我在创建密码时记下了密码。我在加入安全组和子域之前超时。N我不知道,所以你的怀疑是正确的。
{
  "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
}
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)}`)})
}