簡體   English   中英

連接 pg.Pool 和 GCP 基於 IAM 的數據庫身份驗證

[英]Connecting with pg.Pool and GCP IAM-based database authentication

目前,我們的 api(部署在 cloudRun 上)通過傳入帶有 db 配置和 db 用戶和密碼的 pgConfig 連接到我們的 Postgres 數據庫。

例如:

const configObject = {
  host: cloudRunHost,
  user: dbUser,
  password: dbPassword,
  database: dbName
}

async function connect() {
  if(!client) {
    const pgPool = new pg.Pool(configObject);
    await pgPool.connect()
      .then((result) => {
        logger.info('Connected to DB')
        client = result;
      }).catch((err) => {
        logger.error(err);
      });
  }
} 

我們希望應用本身使用Cloud SQL IAM 數據庫身份驗證連接到數據庫

至今:

  1. api cloudRun 實例有一個服務帳戶
  2. 數據庫和 CloudSQL 已配置為基於 IAM 的訪問(我們可以使用我們的機器服務帳戶訪問)
  3. api 服務帳戶可以通過 IAM 訪問數據庫,並在 Postgres 數據庫本身上授予該用戶的權限
  4. 當上面的代碼運行時,它會記錄error: empty password returned by client

我們嘗試從 configObject 中完全刪除密碼行,但沒有幫助。 關於為什么我的服務帳戶可以直接訪問數據庫但 API 不能訪問的任何想法我懷疑我們需要向 pgPool 表明我們正在嘗試通過 IAM 而不是通過用戶/密碼進行連接。

不幸的是,沒有在 Cloud Run 上使用“自動”IAM DB AuthN 的好方法 - 雖然 Cloud Run 確實使用代理,但用戶無法打開“-enable-iam-login”標志。

Go、Python 和 Java 用戶可以使用特定於語言的連接器,但 Node.js 沒有。

看起來node-postgres確實支持動態密碼,所以你可以做這樣的事情:

const {GoogleAuth} = require('google-auth-library');

async function main() {
  const auth = new GoogleAuth();
  const pool = new pg.Pool({
    connectionString: 'postgresql://user@db.example:5432/my-db',
    password: async () => auth.getAccessToken(),
  })
}

根據您的問題,我相信您正在使用 NodeJS。 但是目前這里提到的 Python 連接器、Java 連接器和 Cloud SQL 代理都支持 IAM 數據庫身份驗證。 此外,要使用自動 IAM 數據庫身份驗證,還需要使用 Cloud SQL 連接器。

Cloud SQL Auth 代理、Java 連接器和 Python 連接器當前支持 IAM 數據庫身份驗證。

自動 IAM 數據庫身份驗證需要使用 Cloud SQL 連接器。

當您使用不受支持的 NodeJS 時,這似乎是您收到錯誤的原因: empty password returned by client.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM