Problem z połączeniem CodeBuild do RDS

Sep 27 2020

Próbuję połączyć bezserwerowe wystąpienie Postgres RDS z projektu CodeBuild.

tutaj zawodzi: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

Plik / tmp / istnieje, więc uprawnienia do pliku / nieistniejący problem są wykluczone

To, co próbowałem do tej pory, nazwa użytkownika i hasło to:

  1. Przechowywane jako zmienne środowiskowe w CodeBuild
  2. Przechowywane w menedżerze 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. Podane jako parametry bezpośrednio w wywołaniu
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
  1. Przechowywane w pliku .pgpass
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass

Dla pewności wyeksportowałem też zmienną, PGPASSFILE="~/.pgpass"

Kiedy powtarzam nazwę użytkownika i hasło, wyświetla się tylko ***, na przykład:

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

Błędy:

  1. Bo błąd jestpsql --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. Bo błąd jestpsql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
Password for user ***: 
psql: fe_sendauth: no password supplied
  1. Bo błąd to: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

Tylko dla informacji,

  • Grupa zabezpieczeń RDS ma wpis zezwalający na wszystkie połączenia TCP z CodeBuild w regionie AWS, w którym znajduje się projekt (35.157.127.248/29)
  • Zarówno CodeBuild, jak i RDS znajdują się w tej samej prywatnej podsieci, co VPC utworzony przez użytkownika
  • Jestem w stanie połączyć się z instancją RDS z instancji EC2 przy użyciu tych samych poświadczeń RDS
  • Używam najnowszego obrazu dla Amazon Linux 2 (aws / codebuild / amazonlinux2-x86_64-standard: 3.0)

Wygląda na to, że problem występuje po stronie CodeBuild, a nie po stronie RDS. Z jakiegoś powodu CodeBuild nie pobiera wartości parametrów, że tylko nazwa użytkownika i hasło, inne, takie jak nazwa hosta, nazwa bazy danych, są oceniane poprawnie!

Czy ktoś widzi gdzieś jakiś problem? Dziękuję Ci!

Odpowiedzi

1 Marcin Sep 27 2020 at 16:34

Próbowałem odtworzyć problem , ale jedyna rzecz, jaką znalazłem, powinna być używana --username, nie --user. W każdym razie tutaj jest mój buildspec.ymlużywany do weryfikacji:

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

W powyższym używam małej sztuczki, aby pokazać hasło i nazwę użytkownika, ale na odwrót. W przeciwnym razie widzisz tylko ***.

Wszystko działa zgodnie z oczekiwaniami , a CB łączy bazę danych, co widać po No relations found(oczekiwano, ponieważ moja baza danych jest pusta):