首页 > 解决方案 > 从 Firebase 功能使用 Cloud SQL 代理

问题描述

我在本地运行 Google 的Cloud SQL 代理,它使用以下命令与本地提供的 Firebase 函数一起使用:

/cloud_sql_proxy -instances=my-project-12345:us-central1:my-instance=tcp:1433

但是我真的不知道如何在部署的 Firebase 功能上进行这项工作。

export const typeOrmConnectionOptions: ConnectionOptions = {
  name: 'primary',
  type: 'mssql',
  host: '127.0.0.1',
  port: 1433,
  username: 'sqlserver',
  password: 'my$trongPa$$word',
  database: 'TestDB',
  synchronize: true,
  logging: true,
  entities: ['lib/entity/**/*.js'],
  ...(prod && {
    extra: {
      socketPath:
        '/cloudsql/my-project-12345:us-central1:my-instance=tcp',
      credential_file: './admin-service-account-file-long-a1b2c3-hash.json'
    }
  })
};

就将凭证文件作为附加对象的一部分传递给 TypeORM 的连接对象而言,我真的是在黑暗中拍摄,但是我觉得必须有这样的东西才能将我在此步骤之后创建的服务帐户链接到数据库查询。

我的另一个长期想法是使用环境变量来设置使用此 JSON 文件的凭据:

process.env.GOOGLE_APPLICATION_CREDENTIALS = fs.readFileSync(
  './admin-service-account-file-long-a1b2c3-hash.json',
  'utf8'
)

没有喜悦。

我认为错误消息没有太大帮助,因为我确定我尝试这样做的方式从根本上是不正确的,但是对于它的价值,上面得到了错误

"Failed to connect to 127.0.0.1:1433 - connect ECONNREFUSED 127.0.0.1:1433"

如何使用 Cloud SQL 代理从 Firebase 连接到 GCP 数据库?

编辑

我没有运气连接到任何一个socketPath属性,也没有使用 root 用户名和密码直接引用 GCP RD 实例的 IP。我见过很多地方只在本地开发中需要云代理,在生产中也需要它(这就是我想到的地方socketPath)。

此外,我尝试使用 MySql 进行测试,如下面的答案中所链接。以前我用它作为 SQL Server 的指南,但由于它仍处于测试阶段,我想我会试试 MySQL。仍然失败,但是当使用它并使用服务 IP 而不是云代理时,我收到超时错误。

我还开始使用从 GCP 仪表板创建的服务帐户凭据初始化应用程序。

import { serviceAccount } from './service-account';
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(
  serviceAccount as admin.ServiceAccount
);
admin.initializeApp(adminConfig);

标签: javascriptnode.jsfirebasegoogle-cloud-platformgoogle-cloud-sql

解决方案


只有在尝试从谷歌云网络外部连接时才需要云代理。从函数中,您可以使用主机、端口、用户名和密码直接连接。

我在部署期间通过功能配置传递了这些细节。

firebase functions:config:set envs.db_host=$DB_HOST_PROD envs.db_user=$DB_USER_PROD envs.db_password=$DB_PASSWORD_PROD envs.db_name=$DB_NAME_PROD envs.db_use_ssl=false --project hello-world

firebase functions:config:set envs.node_env=production --project hello-world

firebase deploy --token=$FIREBASE_TOKEN --project hello-world --only functions,hosting

请参阅https://stackoverflow.com/a/55974919/515774,了解我如何使用它来设置环境变量。然后我使用环境变量连接数据库


推荐阅读