Problema di connessione da CodeBuild a RDS

Sep 27 2020

Sto cercando di connettere un'istanza serverless di Postgres RDS da un progetto CodeBuild.

qui è dove fallisce: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/ tmp / file esiste, quindi un problema di autorizzazione del file / inesistente è fuori discussione

Quello che ho provato finora, il nome utente e la password sono stati:

  1. Memorizzato come variabili di ambiente in CodeBuild
  2. Archiviato in 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. Dato come parametri direttamente nella chiamata
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
  1. Memorizzato nel file .pgpass
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass

E per essere sicuro, ho esportato anche la variabile, PGPASSFILE="~/.pgpass"

Quando eco il nome utente e la password, ottengo solo *** stampato, come:

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

Errori:

  1. Perché l'errore è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. Perché l'errore èpsql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
Password for user ***: 
psql: fe_sendauth: no password supplied
  1. Perché l'errore è: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

Solo per info,

  • Il gruppo di sicurezza RDS ha la voce per consentire tutte le connessioni TCP da CodeBuild nella regione AWS in cui si trova il progetto (35.157.127.248/29)
  • Sia CodeBuild che RDS si trovano nella stessa sottorete privata di un VPC creato dall'utente
  • Sono in grado di connettermi all'istanza RDS da un'istanza EC2 utilizzando le stesse credenziali RDS
  • Sto usando l'ultima immagine per Amazon Linux 2 (aws / codebuild / amazonlinux2-x86_64-standard: 3.0)

Sembra un problema alla fine di CodeBuild, non alla fine di RDS. Per qualche ragione CodeBuild non ottiene il valore dei parametri, anche questo solo username e password, altri come hostname, dbname vengono valutati correttamente!

Qualcuno vede qualche problema da qualche parte? Grazie!

Risposte

1 Marcin Sep 27 2020 at 16:34

Ho provato a replicare il problema , ma l'unica cosa che ho scoperto che dovresti usare --username, no --user. Comunque, ecco il mio buildspec.ymlusato per la verifica:

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

In precedenza uso un piccolo trucco per mostrare la password e il nome utente, ma al contrario. Altrimenti vedi solo ***.

Tutto funziona come previsto e CB collega il database come evidente dal No relations found(questo era previsto, poiché il mio db è vuoto):