AWS Lambda는 PG.js를 통해 RDS Postgres 데이터베이스에 연결합니다 (연결이 설정되고 시간 제한이 없지만 데이터베이스가 없습니까?).

SYSG 박사

내 람다 함수가 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
}

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)}`)})
} 
SYSG 박사

답을 찾았습니다. 내 어리 석음을 보여 주지만 다른 사람들이 같은 문제를 겪을 경우를 대비하여 여기에 게시하고 싶었습니다.

RDS (사용자 지정) PostGreSQL을 만들 때 I 데이터베이스 이름을 지정했습니다. 양식에 약 20 개의 필드가 있고 dbname을 지정하는 두 번째 위치가 있다는 사실을 거의 알지 못했습니다. 그렇지 않으면 db를 생성하지 않고 이름을 할당하지 않는다고 표시됩니다 (콘솔에 "-"가 이름으로 표시됩니다.

이름은 끝점의 첫 번째 부분에 대한 것입니다. 두 번째로 이름을 지정하는 것은 데이터베이스 자체에 대한 것입니다.

RDS를 설정할 때 보안 / 로그인을 위해 PostGreSQL을 사용하고 있습니다.

이것이 누군가를 돕기를 바랍니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관