Verbindungsproblem zwischen CodeBuild und RDS
Ich versuche, eine serverlose Postgres RDS-Instanz aus einem CodeBuild-Projekt zu verbinden.
Hier scheitert es: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
/ tmp / file ist vorhanden, daher kommt ein Dateiberechtigungs- / nicht vorhandenes Problem nicht in Frage
Was ich bisher versucht habe, waren der Benutzername und das Passwort:
- In CodeBuild als Umgebungsvariablen gespeichert
- Im AWS Secrets Manager gespeichert
env:
secrets-manager:
# key: secret-id:json-key:version-stage:version-id
SECRET_USER: rds-db-credentials:username
SECRET_PASSWORD: rds-db-credentials:password
- Wird als Parameter direkt im Aufruf angegeben
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
- In der .pgpass-Datei gespeichert
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass
Und natürlich habe ich die Variable auch exportiert, PGPASSFILE="~/.pgpass"
Wenn ich den Benutzernamen und das Passwort wiedergebe, werde ich nur *** gedruckt, wie:
[Container] 2020/09/27 07:39:34 Running command cat ~/.pgpass
something.eu-central-1.rds.amazonaws.com:5432:spumdb:***:***
Fehler:
- Denn der Fehler ist
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
- Denn der Fehler ist
psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
Password for user ***:
psql: fe_sendauth: no password supplied
- Denn der Fehler ist:
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
Nur zur Info,
- Die RDS-Sicherheitsgruppe hat den Eintrag, alle TCP-Verbindungen von CodeBuild in der AWS-Region zuzulassen, in der sich das Projekt befindet (35.157.127.248/29).
- Sowohl CodeBuild als auch RDS befinden sich im selben privaten Subnetz einer vom Benutzer erstellten VPC
- Ich kann von einer EC2-Instanz aus mit denselben RDS-Anmeldeinformationen eine Verbindung zur RDS-Instanz herstellen
- Ich verwende das neueste Image für Amazon Linux 2 (aws / codebuild / amazonlinux2-x86_64-standard: 3.0).
Es sieht nach einem Problem am CodeBuild-Ende aus, nicht am RDS-Ende. Aus irgendeinem Grund erhält CodeBuild nicht den Wert der Parameter, sondern auch nur Benutzername und Passwort, andere wie Hostname, Datenbankname werden korrekt ausgewertet!
Hat jemand irgendwo ein Problem gesehen? Vielen Dank!
Antworten
Ich habe versucht, das Problem zu replizieren , aber das einzige, was ich gefunden habe, das Sie verwenden sollten --username, nicht --user. Wie auch immer, hier ist meine buildspec.ymlfür die Überprüfung verwendet:
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
Oben benutze ich einen kleinen Trick , um das Passwort und den Benutzernamen anzuzeigen, aber umgekehrt. Sonst siehst du nur ***.
Alles funktioniert wie erwartet und CB verbindet die Datenbank wie durch das ersichtlich No relations found(dies wurde erwartet, da meine Datenbank leer ist):