Проблема с подключением CodeBuild к RDS

Sep 27 2020

Я пытаюсь подключить бессерверный экземпляр Postgres RDS из проекта CodeBuild.

вот где он терпит неудачу: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/ tmp / file существует, поэтому вопрос о разрешении файла / несуществующей проблеме не может быть

Что я пробовал до сих пор, имя пользователя и пароль были:

  1. Сохраняются как переменные среды в CodeBuild
  2. Хранится в 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. Задано как параметры в вызове напрямую
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
  1. Сохраняется в файле .pgpass
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass

И, конечно, я тоже экспортировал переменную, PGPASSFILE="~/.pgpass"

Когда я повторяю имя пользователя и пароль, я получаю только ***, например:

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

Ошибки:

  1. Ибо ошибка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. Ибо ошибкаpsql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
Password for user ***: 
psql: fe_sendauth: no password supplied
  1. Ибо ошибка: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

Просто для информации,

  • Группа безопасности RDS имеет запись, разрешающую все TCP-соединения из CodeBuild в регионе AWS, где находится проект (35.157.127.248/29).
  • И CodeBuild, и RDS находятся в одной частной подсети созданного пользователем VPC.
  • Я могу подключиться к экземпляру RDS из экземпляра EC2, используя те же учетные данные RDS
  • Я использую последний образ для Amazon Linux 2 (aws / codebuild / amazonlinux2-x86_64-standard: 3.0)

Похоже, проблема на стороне CodeBuild, а не на стороне RDS. По какой-то причине CodeBuild не получает значения параметров, которые тоже только имя пользователя и пароль, другие, такие как имя хоста, имя базы данных, оцениваются правильно!

Кто-нибудь нигде не видит проблем? Спасибо!

Ответы

1 Marcin Sep 27 2020 at 16:34

Я попытался воспроизвести проблему , но единственное, что я обнаружил, вы должны использовать --username, а не --user. Во всяком случае, вот мой buildspec.ymlобразец для проверки:

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

Выше я использовал небольшой трюк, чтобы показать пароль и имя пользователя, но в обратном порядке. В противном случае вы только видите ***.

Все работает, как ожидалось , и CB подключает базу данных, о чем свидетельствует No relations found(это ожидалось, поскольку моя база данных пуста):