我有两个GCP项目(其中一个是Firebase项目(,我正在尝试从一个项目的Firebase云函数访问另一个项目的云SQL实例。
我已按照此处的说明进行操作: https://cloud.google.com/sql/docs/mysql/connect-functions
在这个指令上,它说
连接两个不同项目中的资源时,请确保 这两个项目都启用了正确的 IAM 角色,并提供了 服务帐户正确的权限。
我不完全确定我做这部分是否正确。我所做的是从我的云函数项目中复制服务帐户电子邮件地址,如下所示:"service-YOUR_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com",并将其复制到我的其他 GCP 项目的 IAM 页面中,并为其提供 CloudSQL 客户端角色。
这是我用来访问数据库的代码:
import * as functions from "firebase-functions";
import * as mysql from "mysql";
export const sql = functions
.https.onRequest((request, response) => {
return new Promise<any>(async (resolve, reject) => {
const query = "select * from my_table limit 1;";
const pool: mysql.Pool = mysql.createPool({
socketPath: functions.config().cloud_sql.socket_path,
user: functions.config().cloud_sql.user,
password: functions.config().cloud_sql.password,
database: functions.config().cloud_sql.database,
connectionLimit: 5,
timezone: "+0900"
});
pool.query(query, [], (err: mysql.MysqlError | null, results: any) => {
if (err) {
console.log(err);
reject(err);
} else {
resolve(results);
}
});
});
});
当我访问此功能时,我在控制台中收到此错误:
错误:连接环境拒绝
我可能缺少什么?任何帮助将不胜感激。
我在发布这个问题后不久就解决了它,哈哈。
我为错误的服务账户提供了 IAM 角色。您需要将云 SQL 客户端角色添加到 App Engine 默认服务帐户,而不是像官方文档(https://cloud.google.com/sql/docs/mysql/connect-functions (中所说的那样将云 SQL 客户端角色添加到"service-YOUR_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com"帐户,该帐户以类似以下内容">
云函数在函数执行期间使用的项目默认服务帐户(运行时服务帐户(PROJECT_ID@appspot.gserviceaccount.com
链接:
在函数执行期间,云函数使用服务帐户 PROJECT_ID@appspot.gserviceaccount.com 作为它的身份。
默认情况下,运行时服务帐户具有编辑者角色,该角色 允许它访问许多 GCP 服务。
如果您有多个函数都访问不同的资源, 您可能希望为每个函数提供自己的标识。这可以是 通过使用具有以下特征的命名服务帐户部署函数来完成 正确的角色。正在部署的服务帐户必须是 在与其附加到的函数相同的项目中创建。
也:
在运行时,Cloud Functions 默认使用 App Engine 默认值 服务帐户 (PROJECT_ID@appspot.gserviceaccount.com(,具有 项目的编辑者角色。您可以更改此角色 服务帐户,用于限制或扩展正在运行的权限 功能。您还可以更改使用哪个服务帐户 基于每个功能提供非默认服务帐户。
您提到了此链接链接:
云函数使用服务帐户来授权您的连接 到云 SQL。此服务账户必须具有正确的 IAM 成功连接的权限。除非另有配置,否则 默认服务帐户的格式为 service-YOUR_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com。
此服务帐户仅用于管理操作链接:
对于创建期间对项目的管理操作, 更新或删除云函数服务使用的函数 Google Cloud Functions Service Agent Service 帐号 (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com(。
默认情况下,此服务帐户具有 cloudfunctions.serviceAgent 项目中的角色。创建、更新和删除函数可能会 如果更改此帐户的权限,则失败。
我建议使用自己的服务帐户部署云功能:
-
创建服务帐户:
gcloud iam service-accounts create function-one --display-name function-one
-
为服务帐户分配必要的角色:
gcloud projects add-iam-policy-binding my_project --member serviceAccount:function-one@my_project.iam.gserviceaccount.com --role roles/cloudsql.client
-
使用服务帐户部署函数:
gcloud beta functions deploy ... --service-account=SERVICE_ACCOUNT
SERVICE_ACCOUNT
与 运行时函数。服务帐户表示 运行函数,并确定函数的权限 有。如果未提供,该函数将使用项目的默认值 服务帐户。
我从文档中了解到,两个服务帐户都应该具有从不同项目连接到 Cloud SQL 所需的角色:
PROJECT_ID@appspot.gserviceaccount.com
YOUR_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com