CodeBuild 到 RDS 的连接问题

CodeBuild to RDS connection issue

我正在尝试从 CodeBuild 项目连接 Postgres RDS 无服务器实例。

这是它失败的地方: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/tmp/file存在,所以文件permission/non-existing问题不存在

到目前为止我已经尝试过,用户名和密码是:

  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

仅供参考,

看起来问题出在CodeBuild端,而不是RDS端。出于某种原因,CodeBuild 没有获取参数的值,也只有用户名和密码,其他如主机名、数据库名等都被正确评估!

有人发现任何问题吗?谢谢!

我试图重现这个问题,但我发现你唯一应该使用的是--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 所示(这是预期的,因为我的数据库是空的):