CodeBuild ke masalah koneksi RDS

Sep 27 2020

Saya mencoba menghubungkan instance tanpa server Postgres RDS dari proyek CodeBuild.

di sinilah gagal: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/ tmp / file ada, jadi izin file / masalah yang tidak ada tidak perlu dipertanyakan lagi

Apa yang saya coba sejauh ini, nama pengguna dan kata sandi adalah:

  1. Disimpan sebagai variabel lingkungan di CodeBuild
  2. Disimpan di manajer Rahasia AWS
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. Diberikan sebagai parameter di panggil secara langsung
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
  1. Disimpan dalam file .pgpass
echo ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${SECRET_USER}:${SECRET_PASSWORD} > ~/.pgpass
chmod 600 ~/.pgpass

Dan untuk memastikan, saya mengekspor variabel juga, PGPASSFILE="~/.pgpass"

Ketika saya menggemakan nama pengguna dan kata sandi, saya hanya mendapatkan *** tercetak, seperti:

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

Kesalahan:

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

Sekadar info,

  • Grup keamanan RDS memiliki entri untuk mengizinkan semua koneksi TCP dari CodeBuild di wilayah AWS tempat proyek berada (35.157.127.248/29)
  • Baik CodeBuild dan RDS berada di subnet pribadi yang sama dari VPC yang dibuat pengguna
  • Saya dapat terhubung ke instans RDS dari instans EC2 menggunakan kredensial RDS yang sama
  • Saya menggunakan gambar terbaru untuk Amazon Linux 2 (aws / codebuild / amazonlinux2-x86_64-standard: 3.0)

Sepertinya masalah di akhir CodeBuild, bukan di ujung RDS. Untuk beberapa alasan, CodeBuild tidak mendapatkan nilai parameter, itu juga hanya nama pengguna dan kata sandi, yang lain seperti nama host, nama db dievaluasi dengan benar!

Apakah ada yang melihat masalah di mana saja? Terima kasih!

Jawaban

1 Marcin Sep 27 2020 at 16:34

Saya mencoba untuk mereplikasi masalah tersebut , tetapi satu-satunya hal yang saya temukan yang seharusnya Anda gunakan --username, bukan --user. Ngomong-ngomong, ini yang saya buildspec.ymlgunakan untuk verifikasi:

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

Di atas saya menggunakan sedikit trik untuk menunjukkan kata sandi dan nama pengguna, tetapi secara terbalik. Jika tidak, Anda hanya melihat ***.

Semuanya berfungsi seperti yang diharapkan , dan CB menghubungkan database sebagaimana dibuktikan oleh No relations found(ini diharapkan, karena db saya kosong):