ปัญหาการเชื่อมต่อ 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. เก็บไว้ในไฟล์. ppgpass
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 ไม่ได้รับค่าของพารามิเตอร์ซึ่งมีเพียงชื่อผู้ใช้และรหัสผ่านเท่านั้นส่วนอื่น ๆ เช่นชื่อโฮสต์ dbname ได้รับการประเมินอย่างถูกต้อง!

มีใครเห็นปัญหาบ้างไหม ขอขอบคุณ!

คำตอบ

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(คาดว่าจะเป็นเพราะฐานข้อมูลของฉันว่างเปล่า):