CodeBuild para problema de conexão RDS

Sep 27 2020

Estou tentando conectar uma instância sem servidor Postgres RDS de um projeto CodeBuild.

é aqui que falha: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/ tmp / arquivo existe, portanto, uma permissão de arquivo / problema inexistente está fora de questão

O que tentei até agora, o nome de usuário e a senha foram:

  1. Armazenado como variáveis ​​de ambiente no CodeBuild
  2. Armazenado no gerenciador AWS Secrets
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. Dados como parâmetros na chamada diretamente
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
  1. Armazenado em arquivo .pgpass
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass

E para ter certeza, eu exportei a variável também, PGPASSFILE="~/.pgpass"

Quando eu repito o nome de usuário e a senha, só consigo *** impresso, como:

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

Erros:

  1. Pois , o erro é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. Pois , o erro épsql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
Password for user ***: 
psql: fe_sendauth: no password supplied
  1. Pois , o erro é: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

Apenas para informação,

  • O grupo de segurança RDS tem a entrada para permitir todas as conexões TCP do CodeBuild na região AWS onde o projeto está (35.157.127.248/29)
  • Tanto o CodeBuild quanto o RDS estão na mesma sub-rede privada de um VPC criado pelo usuário
  • Consigo me conectar à instância RDS de uma instância EC2 usando as mesmas credenciais RDS
  • Estou usando a imagem mais recente do Amazon Linux 2 (aws / codebuild / amazonlinux2-x86_64-standard: 3.0)

Parece um problema no final do CodeBuild, não no final do RDS. Por alguma razão, CodeBuild não obtém o valor dos parâmetros, que também apenas nome de usuário e senha, outros como hostname, dbname são avaliados corretamente!

Alguém vê algum problema em algum lugar? Obrigado!

Respostas

1 Marcin Sep 27 2020 at 16:34

Tentei replicar o problema , mas a única coisa que descobri que você deveria usar --username, não --user. De qualquer forma, aqui está o meu buildspec.ymlusado para a verificação:

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

Acima eu uso um pequeno truque para mostrar a senha e o nome de usuário, mas ao contrário. Caso contrário, você vê apenas ***.

Tudo funciona conforme o esperado , e o CB conecta o banco de dados conforme evidente pelo No relations found(isso era esperado, pois meu banco de dados está vazio):