Problème de connexion CodeBuild à RDS

Sep 27 2020

J'essaie de connecter une instance sans serveur Postgres RDS à partir d'un projet CodeBuild.

c'est là que ça échoue: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/ tmp / file existe, donc un problème d'autorisation de fichier / inexistant est hors de question

Ce que j'ai essayé jusqu'à présent, le nom d'utilisateur et le mot de passe ont été:

  1. Stocké en tant que variables d'environnement dans CodeBuild
  2. Stocké dans 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. Donné directement comme paramètres dans l'appel
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
  1. Stocké dans un fichier .pgpass
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass

Et pour être sûr, j'ai aussi exporté la variable, PGPASSFILE="~/.pgpass"

Lorsque je fais écho au nom d'utilisateur et au mot de passe, je ne reçois que *** imprimé, comme:

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

Les erreurs:

  1. Car , l'erreur estpsql --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. Car , l'erreur estpsql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
Password for user ***: 
psql: fe_sendauth: no password supplied
  1. Car , l'erreur est: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

Juste pour info,

  • Le groupe de sécurité RDS a l'entrée pour autoriser toutes les connexions TCP à partir de CodeBuild dans la région AWS où se trouve le projet (35.157.127.248/29)
  • CodeBuild et RDS se trouvent dans le même sous-réseau privé d'un VPC créé par un utilisateur
  • Je peux me connecter à l'instance RDS à partir d'une instance EC2 en utilisant les mêmes informations d'identification RDS
  • J'utilise la dernière image pour Amazon Linux 2 (aws / codebuild / amazonlinux2-x86_64-standard: 3.0)

Cela ressemble à un problème à l'extrémité CodeBuild, pas à l'extrémité RDS. Pour une raison quelconque, CodeBuild n'obtient pas la valeur des paramètres, que seuls le nom d'utilisateur et le mot de passe, d'autres comme hostname, dbname sont évalués correctement!

Quelqu'un voit-il un problème quelque part? Je vous remercie!

Réponses

1 Marcin Sep 27 2020 at 16:34

J'ai essayé de reproduire le problème , mais la seule chose que j'ai trouvée que vous devriez utiliser --username, non --user. Quoi qu'il en soit, voici mon buildspec.ymlutilisé pour la vérification:

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

Dans ce qui précède, j'utilise une petite astuce pour afficher le mot de passe et le nom d'utilisateur, mais en sens inverse. Sinon, vous ne voyez que ***.

Tout fonctionne comme prévu , et CB connecte la base de données comme en témoigne le No relations found(cela était attendu, car ma base de données est vide):