google-cloud-platform - 在 VM 中触发 Google Cloud SQL 导出
问题描述
tl;dr:gcloud sql export sql ...
即使我认为我已经为其服务帐户设置了所有权限,也无法在 VM 上触发导出,这总是导致 PERMISSION_DENIED。
整个问题实际上听起来相对简单。我想在某些时候触发我的 Google Cloud Compute VM 中的 Cloud SQL 数据库的导出。
到目前为止我做了什么:
- 在 IAM 部分中为 VMs 服务帐户添加了
Cloud SQL Admin
(只是为了测试)权限。 - 创建并下载服务帐户密钥并使用
gcloud auth activate-service-account --key-file cert.json
- 运行以下命令:
gcloud sql export sql "${SQL_INSTANCE}" "gs://${BUCKET}/${FILENAME}" -d "${DATABASE}"
(这对我自己的个人帐户没有问题)
该命令导致以下错误:
错误:(gcloud.sql.export.sql)PERMISSION_DENIED:请求的身份验证范围不足。
我还尝试了什么
我从谷歌找到这篇文章并使用计算服务帐户而不是创建云函数服务帐户。遗憾的是,结果是一样的。
解决方案
您没有将角色分配给您认为自己拥有的服务帐户。
您需要为服务帐号分配以下角色之一:
- 角色/所有者(不推荐)
- 角色/观众(不推荐)
- 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
推荐阅读
- javascript - 如何修复 Vue JS 警报
- amazon-web-services - 如何设置通过 SNS 主题并路由到订阅的 SQS 队列的消息计时器?
- android - 在具有 id 的视图上执行“android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction”时出错
- openrefine - OpenRefine:删除单元格中重复的逗号分隔值
- swift - Swift 类包含自己类型的属性
- reactjs - 在反应中使用输入文本框来显示建议的下拉列表
- neo4j - 获取不穿过某个节点的子图
- vega-lite - vega-lite 条形图堆积的彩色值
- vba - 调用 GDIP GetImageGraphicsContext 或 GdipCreateHBITMAPFromBitmap 函数时,Windows 10(64 位)上的 MS Access 2019(64 位)崩溃
- python - Django 在 post_save 中向实例添加一个额外的非托管字段