aws-lambda - AWS Lambda 通过 PG.js 连接到 RDS Postgres 数据库(已建立连接,没有超时,但没有数据库?)
问题描述
我的 lambda 函数正在尝试连接到 RDS PostGreSQL DB。由于我使用https://serverless.com/来部署该功能(设置我的云端),它会将 LF 放在与 RDS DB 不同的 VPC 中。
不是什么大问题。如果您阅读:https ://docs.aws.amazon.com/lambda/latest/dg/services-rds-tutorial.html ,您会看到您可以使用子网和安全组设置 serverless.yml 文件(如下所示) ID,然后为具有 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
}
服务器.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)}`)})
}
解决方案
我找到了答案。虽然它显示了我的愚蠢,但我想在这里发布它以防其他人有同样的问题。
当我创建 RDS(自定义)PostGreSQL 时,我指定了我的数据库名称。我几乎不知道表单中的大约 20 个字段,还有一个您指定 dbname 的位置。如果你不这样做,它会说它不会创建数据库并且没有分配名称(控制台显示“-”作为名称。
第一个名称是端点的第一部分。第二次指定名称是为数据库本身。
我在设置 RDS 时使用 PostGreSQL 进行安全/登录。
希望这可以帮助某人。
推荐阅读
- vba - 如何停止在 Application.Quit 方法之后仍然运行的 Excel 宏
- latex - Mathjax 无法正确渲染颜色框
- sql - 如何使用 sql server 在特定列 wrt 插入顺序上有所不同?
- php - 我正在将 json 数组写入文件。我越来越 [{ , , }][{ , , }][{ , , }]。我需要这个输出 [{ , , },{ , , },{ , , }]。有什么建议么?
- ios - Facebook 登录 + Google 登录 + Braintree Paypal 支付 - AppDelegate 问题
- android - Google Cloud Translation API 请求缺少有效的 API 密钥
- unit-testing - 模拟实例
> 在 Junit 中使用 Inject&Any 进行注释 - wordpress - 当我什至无法找到缓存的 *where* 时,如何清除激进的缓存?
- java - Weblogic 客户端收到 401 Unauthorized Kerberos 异常,但我的主类没有,你知道为什么吗?
- java - 可选列表和以下映射