首页 > 解决方案 > 在 VM 中触发 Google Cloud SQL 导出

问题描述

tl;dr:gcloud sql export sql ...即使我认为我已经为其服务帐户设置了所有权限,也无法在 VM 上触发导出,这总是导致 PERMISSION_DENIED。


整个问题实际上听起来相对简单。我想在某些时候触发我的 Google Cloud Compute VM 中的 Cloud SQL 数据库的导出。

到目前为止我做了什么:

  1. 在 IAM 部分中为 VMs 服务帐户添加了Cloud SQL Admin(只是为了测试)权限。
  2. 创建并下载服务帐户密钥并使用gcloud auth activate-service-account --key-file cert.json
  3. 运行以下命令:
gcloud sql export sql "${SQL_INSTANCE}" "gs://${BUCKET}/${FILENAME}" -d "${DATABASE}"

(这对我自己的个人帐户没有问题)


该命令导致以下错误:

错误:(gcloud.sql.export.sql)PERMISSION_DENIED:请求的身份验证范围不足。

我还尝试了什么

从谷歌找到这篇文章并使用计算服务帐户而不是创建云函数服务帐户。遗憾的是,结果是一样的。

标签: google-cloud-platformgoogle-cloud-sqlgoogle-cloud-iam

解决方案


您没有将角色分配给您认为自己拥有的服务帐户。

您需要为服务帐号分配以下角色之一:

  • 角色/所有者(不推荐
  • 角色/观众(不推荐
  • roles/cloudsql.admin(不推荐,除非其他 SQL 操作需要)
  • roles/cloudsql.editor(不推荐,除非其他 SQL 操作需要)
  • 角色/cloudsql.viewer(推荐)

转到 Google Cloud Console -> 计算引擎。单击您的 VM 实例。向下滚动并找到分配给您的 VM 实例的服务帐户。复制服务帐户电子邮件地址。

运行以下命令(在以下命令中将 \ 替换为 Windows 的 ^ 并指定您的项目 ID(不是项目名称)和服务帐户电子邮件地址):

gcloud projects get-iam-policy <PROJECT_ID>  \
--flatten="bindings[].members" \
--format="table(bindings.role)" \
--filter="bindings.members:<COMPUTE_ENGINE_SERVICE_ACCOUNT>"

仔细检查您需要的角色是否存在于输出中。

列出您的项目以获取项目 ID:

gcloud projects list

注意:不要将权限直接分配给服务帐户。向项目分配权限,向服务账户 IAM 成员授予所需角色。

gcloud projects add-iam-policy-binding <PROJECT_ID> \
  --member serviceAccount:<COMPUTE_ENGINE_SERVICE_ACCOUNT> \
  --role roles/cloudsql.viewer

推荐阅读