CodeBuild와 RDS 연결 문제

Sep 27 2020

CodeBuild 프로젝트에서 Postgres RDS 서버리스 인스턴스를 연결하려고합니다.

이것이 실패하는 곳입니다. psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/ tmp / file이 존재하므로 파일 권한 / 존재하지 않는 문제는 의문의 여지가 없습니다.

지금까지 시도한 사용자 이름과 비밀번호는 다음과 같습니다.

  1. CodeBuild에 환경 변수로 저장
  2. AWS Secrets Manager에 저장
env:
  secrets-manager:
     # key: secret-id:json-key:version-stage:version-id
     SECRET_USER: rds-db-credentials:username
     SECRET_PASSWORD: rds-db-credentials:password 
  1. 호출에서 매개 변수로 직접 제공
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
  1. .pgpass 파일에 저장
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass

확실히 저는 변수도 내보냈습니다. PGPASSFILE="~/.pgpass"

사용자 이름과 비밀번호를 에코하면 다음과 같이 *** 만 인쇄됩니다.

[Container] 2020/09/27 07:39:34 Running command cat ~/.pgpass
something.eu-central-1.rds.amazonaws.com:5432:spumdb:***:***

오류 :

  1. 의 경우 오류는psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${PG_USER} -f /tmp/file
psql: warning: extra command-line argument "/tmp/file" ignored
Password for user -f: 
psql: fe_sendauth: no password supplied
  1. 의 경우 오류는psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
Password for user ***: 
psql: fe_sendauth: no password supplied
  1. 의 경우 오류는 다음과 같습니다.psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file
Password for user user=*** password=***: 
psql: fe_sendauth: no password supplied

정보를 위해

  • RDS 보안 그룹에는 프로젝트가있는 AWS 리전 (35.157.127.248/29)의 CodeBuild에서 모든 TCP 연결을 허용하는 항목이 있습니다.
  • CodeBuild와 RDS는 모두 사용자가 생성 한 VPC 의 동일한 프라이빗 서브넷에 있습니다.
  • 동일한 RDS 자격 증명을 사용하여 EC2 인스턴스에서 RDS 인스턴스에 연결할 수 있습니다.
  • Amazon Linux 2 용 최신 이미지 (aws / codebuild / amazonlinux2-x86_64-standard : 3.0)를 사용하고 있습니다.

RDS 쪽이 아니라 CodeBuild 쪽의 문제처럼 보입니다. 어떤 이유로 CodeBuild는 매개 변수의 값을 얻지 못합니다. 사용자 이름과 암호 만 있고 hostname, dbname과 같은 다른 것들은 올바르게 평가됩니다!

누구든지 어디서 문제를 볼 수 있습니까? 감사합니다!

답변

1 Marcin Sep 27 2020 at 16:34

나는 문제 를 복제 하려고 했지만, 당신이 사용해야한다는 것을 내가 발견 한 유일한 것은 --username아니라 --user. 어쨌든 다음은 buildspec.yml확인에 사용되는 것입니다.

version: 0.2

env:
  variables:
    PG_HOST: database-1.cm3c1syrcj06.us-east-1.rds.amazonaws.com
    PG_PORT: 5432
    PG_DBNAME: mydb
  secrets-manager:
      SECRET_USER: rds-db-credentials:username
      SECRET_PASSWORD: rds-db-credentials:password 
phases:
  pre_build:
    commands:
       - echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass - chmod 600 ~/.pgpass build: commands: - cat ~/.pgpass | rev - echo "\dt" > /tmp/file - psql --host ${PG_HOST} --dbname ${PG_DBNAME} --username ${SECRET_USER} -f /tmp/file

위의 경우 암호와 사용자 이름을 표시 하기 위해 약간의 트릭 을 사용 하지만 그 반대입니다. 그렇지 않으면 ***.

모든 것이 예상대로 작동 하고 CB는 다음과 같이 분명히 데이터베이스를 연결합니다 No relations found(내 db가 비어 있으므로 예상했습니다).