如何将带有秘密管理器的谷歌应用引擎连接到 Postgres?

Posted

技术标签:

【中文标题】如何将带有秘密管理器的谷歌应用引擎连接到 Postgres?【英文标题】:How to connect google app engine with secret manager to Postgres? 【发布时间】:2022-01-22 21:36:36 【问题描述】:

我正在尝试通过秘密管理器从运行在 GAE 中的 nodejs/typescript 代码库连接到 GCP 管理的 Postgres 数据库。

我明白了:

 Error: 7 PERMISSION_DENIED: Permission denied on resource project DATABASE_USER.   

当我在 GAE 中运行它时。

【问题讨论】:

【参考方案1】:

首先,确保您已授予对 IAM 中的 GAE 服务帐户的 Secrets 访问权限。

然后使用以下代码示例从秘密管理器获取您的 ENV 变量。

import * as path from 'path';
import SecretManagerServiceClient from '@google-cloud/secret-manager';
import deasync from 'deasync';


require('dotenv').config();

const SnakeNamingStrategy =
  require('typeorm-naming-strategies').SnakeNamingStrategy;

const googleProjectId = process.env.GOOGLE_CLOUD_PROJECT;
const isInGAE = googleProjectId !== undefined;
const isLocalUsingCloudProxy = process.env.USE_CLOUD_SQL_AUTH_PROXY !== undefined;


const getSecretSync = deasync((name: string, cb:any) => 
  const c = new SecretManagerServiceClient();
  
  c.accessSecretVersion(name: c.secretVersionPath(googleProjectId, name, "latest")).then(([secret]) => 
    cb(null, secret.payload.data.toString());
  ).catch((err) => 
    cb(err);
  );
);

  

let config = 
  type: 'postgres',
  host: process.env.DATABASE_HOST || 'localhost',
  port: parseInt(process.env.DATABASE_PORT, 10) || 5432,
  username: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE_NAME,
  synchronize: false,
  logging: false,
  subscribers: [path.join(__dirname, '..', 'subscribers', '*.ts,js')],
  entities: [path.join(__dirname, '..', 'models', '*.ts,js')],
  migrations: [path.join(__dirname, '..', 'migrations', '*.ts,js')],
  cli: 
    entitiesDir: [path.join(__dirname, '..', 'models', '*.ts,js')],
    migrationsDir: [path.join(__dirname, '..', 'migrations', '*.ts,js')],
  ,
  namingStrategy: new SnakeNamingStrategy(),
;


if (isInGAE || isLocalUsingCloudProxy) 
  config.username = getSecretSync("DATABASE_USER");
  config.password = getSecretSync("DATABASE_PASSWORD");
  config.database = getSecretSync("DATABASE_NAME");
  config.host = isInGAE ? "/cloudsql/" + getSecretSync("DATABASE_HOST") : 'localhost';
  config.port = isInGAE ? parseInt(getSecretSync("DATABASE_PORT"), 10) : 5432;
  console.log("dbuser", config.username);


请务必注意,DATABASE_HOST 应采用 SQL 选项卡上“连接名称”的形式,例如 project-id:us-central1:db-name

【讨论】:

以上是关于如何将带有秘密管理器的谷歌应用引擎连接到 Postgres?的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用带有 TTL 的谷歌 FCM 发送数据

如何使用带有 ajax (json) 的谷歌应用引擎?

保存要离线加载的谷歌地图图像

nginx 错误:(13:权限被拒绝)同时连接到上游)

使用带有 java 的谷歌应用程序引擎会给出“在此服务器上找不到 url”但适用于 localhost

如何将从谷歌域购买的网络域名连接到在谷歌 App Engine 上开发的网站?