Problema de conexión de CodeBuild a RDS

Sep 27 2020

Estoy intentando conectar una instancia sin servidor de Postgres RDS desde un proyecto CodeBuild.

aquí es donde falla: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/ tmp / file existe, por lo que un permiso de archivo / problema no existente está fuera de discusión

Lo que he probado hasta ahora, el nombre de usuario y la contraseña han sido:

  1. Almacenado como variables de entorno en CodeBuild
  2. Almacenado en 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. Dado como parámetros en la llamada directamente
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
  1. Almacenado en archivo .pgpass
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass

Y para estar seguro, también exporté la variable, PGPASSFILE="~/.pgpass"

Cuando hago eco del nombre de usuario y la contraseña, solo me imprimen ***, como:

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

Errores:

  1. Porque , el error espsql --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. Porque , el error espsql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
Password for user ***: 
psql: fe_sendauth: no password supplied
  1. Porque , el error es: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

Sólo por información,

  • El grupo de seguridad RDS tiene la entrada para permitir todas las conexiones TCP de CodeBuild en la región de AWS donde se encuentra el proyecto (35.157.127.248/29)
  • Tanto CodeBuild como RDS se encuentran en la misma subred privada de una VPC creada por el usuario
  • Puedo conectarme a la instancia RDS desde una instancia EC2 usando las mismas credenciales RDS
  • Estoy usando la imagen más reciente para Amazon Linux 2 (aws / codebuild / amazonlinux2-x86_64-standard: 3.0)

Parece un problema en el extremo de CodeBuild, no en el extremo de RDS. Por alguna razón, CodeBuild no obtiene el valor de los parámetros, que también solo el nombre de usuario y la contraseña, otros como el nombre de host, el nombre de la base de datos se evalúan correctamente.

¿Alguien ve algún problema en alguna parte? ¡Gracias!

Respuestas

1 Marcin Sep 27 2020 at 16:34

Traté de replicar el problema , pero lo único que encontré que debería estar usando --username, no --user. De todos modos, aquí está mi buildspec.ymluso para la verificación:

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

En lo anterior utilizo un pequeño truco para mostrar la contraseña y el nombre de usuario, pero al revés. De lo contrario, solo verá ***.

Todo funciona como se esperaba , y CB conecta la base de datos como es evidente por No relations found(esto se esperaba, ya que mi base de datos está vacía):