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问题不存在
到目前为止我已经尝试过,用户名和密码是:
- 在 CodeBuild 中存储为环境变量
- 存储在 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
- 直接在调用中作为参数给定
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
- 存储在 .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:***:***
错误:
- 对于
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
- 对于
psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
,错误是
Password for user ***:
psql: fe_sendauth: no password supplied
- 对于
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 安全组具有允许来自项目所在 AWS 区域 (35.157.127.248/29) 中的 CodeBuild 的所有 TCP 连接的条目
- CodeBuild 和 RDS 都位于用户创建的 VPC相同私有子网中
- 我能够使用相同的 RDS 凭据从 EC2 实例连接到 RDS 实例
- 我正在使用亚马逊的最新图片 Linux 2 (aws/codebuild/amazonlinux2-x86_64-standard:3.0)
看起来问题出在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
所示(这是预期的,因为我的数据库是空的):
我正在尝试从 CodeBuild 项目连接 Postgres RDS 无服务器实例。
这是它失败的地方:
psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
/tmp/file存在,所以文件permission/non-existing问题不存在
到目前为止我已经尝试过,用户名和密码是:
- 在 CodeBuild 中存储为环境变量
- 存储在 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
- 直接在调用中作为参数给定
psql --host ${PG_HOST} --dbname ${PG_DBNAME} "user=mydbuser password=0fNKJtNv" -f /tmp/file;
- 存储在 .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:***:***
错误:
- 对于
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
- 对于
psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file
,错误是
Password for user ***:
psql: fe_sendauth: no password supplied
- 对于
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 安全组具有允许来自项目所在 AWS 区域 (35.157.127.248/29) 中的 CodeBuild 的所有 TCP 连接的条目
- CodeBuild 和 RDS 都位于用户创建的 VPC相同私有子网中
- 我能够使用相同的 RDS 凭据从 EC2 实例连接到 RDS 实例
- 我正在使用亚马逊的最新图片 Linux 2 (aws/codebuild/amazonlinux2-x86_64-standard:3.0)
看起来问题出在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
所示(这是预期的,因为我的数据库是空的):