내 람다 함수가 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를 받게됩니다.
그러나 이렇게 한 후에도 "ysgdb"라는 이름의 db를 찾을 수 없다는 3D00 오류가 발생합니다. 그러나 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
{
"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)}`)})
}
답을 찾았습니다. 내 어리 석음을 보여 주지만 다른 사람들이 같은 문제를 겪을 경우를 대비하여 여기에 게시하고 싶었습니다.
RDS (사용자 지정) PostGreSQL을 만들 때 I 데이터베이스 이름을 지정했습니다. 양식에 약 20 개의 필드가 있고 dbname을 지정하는 두 번째 위치가 있다는 사실을 거의 알지 못했습니다. 그렇지 않으면 db를 생성하지 않고 이름을 할당하지 않는다고 표시됩니다 (콘솔에 "-"가 이름으로 표시됩니다.
이름은 끝점의 첫 번째 부분에 대한 것입니다. 두 번째로 이름을 지정하는 것은 데이터베이스 자체에 대한 것입니다.
RDS를 설정할 때 보안 / 로그인을 위해 PostGreSQL을 사용하고 있습니다.
이것이 누군가를 돕기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다