ER_ACCESS_DENIED_ERROR CloudSQL

iRo*_*tia 5 javascript mysql google-cloud-sql firebase google-cloud-functions

我收到一个如下所示的错误(在我的函数日志中)

用户访问被拒绝\'varun_admin\'@\'cloudsqlproxy~84.117.112.32\' (using password: YES)',

    sqlMessage:
`\'varun_admin\'@\'cloudsqlproxy~84.117.112.32\' (using password: YES)',`
    sqlState: '28000',
 
Run Code Online (Sandbox Code Playgroud)

fatal: true } ( 84.117.112.32) 有意修改。

我仔细检查了我usernamepassword,事实上,我从工作台提出了请求,一切顺利。

这就是我创建/初始化 sql 的方式

const mysql = require('mysql')
const config = require('./../../config.js')


const connectionName = config.DB_CONNECTION_NAME
console.log(`Connection name: ${config.DB_CONNECTION_NAME}`)
const configSQL = {
    host: config.DB_HOST,
    user: config.DB_USER,
    password: config.DB_PASSWORD,
    database: config.DB_DATABASE
}

// Connection to cloud sql in production

if (!process.env.dev) {
    configSQL.socketPath = `/cloudsql/${connectionName}`;
}

//SQL Config
const pool = mysql.createPool(configSQL)

// Checking if it was connected sucessfully or not on server startup
pool.getConnection((err, connection) => {
    if (err) {
        console.error('error connecting: ' + err)
        return
    }
    console.log('connected as id ' + connection.threadId)
    connection.release()
    return
})
Run Code Online (Sandbox Code Playgroud)

以下函数通常会调用以获取数据

const getEverythingFromTable = tableName => {
    return new Promise((resolve, reject) => {
        pool.getConnection((error, connection) => {
            if (error) return reject(error)
            const query = `SELECT * FROM ${tableName}`
            connection.query(query, (err, response) => {
                connection.destroy()
                if (err) return reject(err)
                return resolve(response)
            })
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

知道我可能做错了什么吗?

SQL日志

在此输入图像描述

更新:1

这些是我传递给 Cloud SQL Config 的环境值

在此输入图像描述

(请参考上面的代码片段)

UI 中我的 cloudSQL 配置如下所示

在此输入图像描述 在此输入图像描述 在此输入图像描述

我如何调用函数/调用它们,它的 NodeJS 代码在上面。

pes*_*ato 5

您收到的错误可能是由您的密码或正在使用的 SSL 加密问题引起的,如文档的验证连接方式部分中所述。

\n\n

实际上,我尝试按照文档的“强制 SSL/TLS”部分的建议,尝试通过将实例配置更改为“仅允许 SSL 连接”来查看是否可以重现该问题。但是,它并没有 \xe2\x80\x99t 对我造成问题

\n\n

这通常不会成为问题,因为正如本文中提到的,当您使用cloudsqlproxy时,来自 Cloud Functions 的连接默认是加密的,但我必须对其进行测试,以防发生变化。

\n\n

我还尝试更改配置以进一步限制对我的实例的访问。然而,我的连接失败的唯一一件事是禁用通过公共 IP 的连接,只允许通过私有 IP 进行连接,这使得连接甚至无法到达实例。

\n\n

既然您提到您可以连接工作台,我相信您的问题有两个可能的原因:

\n\n
    \n
  1. 您的密码中的某些字符的编码可能存在问题,只有在尝试从环境变量访问它时才会出现混乱。我建议您尝试使用一个非常基本的密码,看看是否能得到相同的结果。
  2. \n
  3. Cloud Function 的连接加密\n可能存在问题。如果是这种情况,则这对于您的项目来说是非常具体的,解决此问题的最佳方法是在Google\xe2\x80\x99s 问题跟踪器上\n打开一个问题,或者在以下位置打开一个支持\n案例:如果您有支持计划
  4. \n
\n\n

我希望这可以帮助你。

\n


Mar*_*ler 2

确保 Cloud SQL 用户varun_admin有权从主机进行连接cloudsqlproxy~84.117.112.32。这也可能是%,但我宁愿建议仅允许连接所需的内容(仅限单个主机)。还要确保刷新 mySQL 上的权限,以便帐户更改将立即应用。另请参阅配置 SSL/TLS