CodeBuildからRDSへの接続の問題

Sep 27 2020

CodeBuildプロジェクトからPostgresRDSサーバーレスインスタンスに接続しようとしています。

これは失敗するところです: psql --host ${PG_HOST} --dbname ${PG_DBNAME} --user ${SECRET_USER} -f /tmp/file

/ tmp / fileが存在するため、ファイルのアクセス許可/存在しない問題は問題外です

私がこれまでに試したことは、ユーザー名とパスワードは次のとおりです。

  1. CodeBuildに環境変数として保存されます
  2. 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. 呼び出しのパラメータとして直接指定
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セキュリティグループには、プロジェクトが存在するAWSリージョン(35.157.127.248/29)のCodeBuildからのすべてのTCP接続を許可するエントリがあります。
  • CodeBuildとRDSはどちらも、ユーザーが作成したVPCの同じプライベートサブネットにあります
  • 同じRDS認証情報を使用してEC2インスタンスからRDSインスタンスに接続できます
  • Amazon Linux 2の最新イメージを使用しています(aws / codebuild / amazonlinux2-x86_64-standard:3.0)

RDS側ではなく、CodeBuild側に問題があるようです。何らかの理由で、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(これは、私のデータベースが空であるため、予想されていました)。