如何从 Google Cloud Run 连接到外部 MySQL 数据库(第三方 MySQL DB)?

问题描述 投票:0回答:1

我有一个 Nuxt 3 应用程序部署到 Firebase 托管,我需要从该应用程序访问 CPanel 共享托管上的远程 MySQL 数据库。 Nuxt 3 应用程序是客户端-服务器,并使用 Nuxt 提供的默认 Nitro 服务器。

您可能知道,在使用 Nitro 服务器或 Firebase Functions 时,会在 Cloud Run 中创建一个“函数”,它是实际的服务器。

Google Clod Run 功能

为了测试应用程序到数据库的连接,我已在 CPanel > 管理访问主机中允许所有主机 (%.%.%.%)。 直接从本地主机或通过 Firebase 模拟器一切正常,但部署在 Firebase 托管上时则不然。

此外,来自我的 Nuxt 服务器端点的 HTTP 请求用于测试资源,例如: https://jsonplaceholder.typicode.com/users正在工作。

GCP 中似乎有一条防火墙规则阻止 mysql 协议的传出访问。任何人都可以确认这一点吗?

我还尝试在 VPC 防火墙规则中设置“允许全部”规则 (https://console.cloud.google.com/net-security/firewall-manager/firewall-policies/list),但没有成功。

这是我在 GCP Logs Explorer 中遇到的错误:

Error: connect ETIMEDOUT at Object.createConnection
(/workspace/node_modules/mysql2/promise.js:253:31) at Object.handler
(file:///workspace/chunks/routes/api/hello.mjs:18:30) at Object.handler
(file:///workspace/chunks/_/nitro.mjs:2805:24) at Object.handler
(file:///workspace/chunks/_/nitro.mjs:3115:34) at Object.handler
(file:///workspace/chunks/_/nitro.mjs:2876:31) at process.processTicksAndRejections
(node:internal/process/task_queues:95:5) at async toNodeHandle
(file:///workspace/chunks/_/nitro.mjs:3147:7) { code: 'ETIMEDOUT', errno: undefined, sqlState: undefined }

在浏览器中,我回来了: FetchError:[GET]“/api/hello”:500

这是我正在使用的代码:

// file hello.ts in my Nuxt 3 /server/api  folder
import mysql from "mysql2/promise";
import { User } from "~/server/models/User";

export default defineEventHandler(async (event) => {

    try {
// code throwing the error:

        const conn = await mysql.createConnection({
            host: <remote host>,
            user: <username>,
            database: <db name>,
            password: <db password>,
        });
//

        const [rows] = await conn.query("SELECT id FROM users");
        console.log(">>> users: ", rows);
        return rows as User[];
    } catch (error) {
        console.error(">>> Error:", error);
        return error;
    }

});

任何有关如何解决此问题的想法将不胜感激。

mysql firebase google-cloud-functions cpanel nuxt3.js
1个回答
0
投票

您是否测试过创建特定的防火墙规则?专门为与您的 Cloud Run 实例关联的标签或网络定义规则,并设置规则以允许出站流量到达 MySQL 数据库 IP 和端口 3306(适用于 MySQL)。我们走吧。

© www.soinside.com 2019 - 2024. All rights reserved.