我在本地运行Google的Cloud SQL Proxy,它使用以下命令使用本地提供的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 Proxy 从 Firebase 连接到 GCP 数据库?
编辑
我没有运气连接socketPath
属性,或者使用根用户名和密码直接引用 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);
云代理仅在尝试从 Google Cloud 网络外部连接时才需要。从功能中,您可以使用主机、端口、用户名和密码直接连接。
我在部署期间通过函数配置传递这些详细信息。
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,了解如何使用它来设置环境变量。然后,我使用环境变量连接数据库
为了从Cloud Function(或Firebase函数(连接到Cloud SQL实例,您可以使用UNIX域套接字。该文档仅显示如何为 MySQL 和 PosgreSQL 执行此操作,而不是针对 SQL Server。可能是因为它尚不受支持。但是,我鼓励您尝试一下。
无论哪种方式,您都可以使用Serverles VPC连接器和实例的私有IP将Cloud Functions连接到SQL Server Cloud SQL实例。引用文档:
默认情况下,云函数不支持使用 TCP 连接到云 SQL 实例。除非您配置了无服务器 VPC 访问,否则您的代码不应尝试使用 IP 地址(例如 127.0.0.1 或 172.17.0.1(访问实例。