【问题标题】:Permissions For Google Cloud SQL Import Using Service Accounts使用服务帐号导入 Google Cloud SQL 的权限
【发布时间】:2018-11-22 11:55:08
【问题描述】:

我已成功导出MySQL Export Guide 之后的 MySQL 数据库。

现在,我正在尝试按照MySQL Import Guide 导入 MySQL 数据库。

我已经检查了我正在使用的 service_account_email 的权限,并且我已经允许了 Admin SQLAdmin Storage 权限。

我能够在本地使用此命令成功激活我的服务帐户:

gcloud auth activate-service-account <service_account_email> --key-file=<service_account_json_file>  

我运行命令后:

gcloud sql import sql <instance> <gstorage_file> --database=<db_name> --async

我得到了这个信息:

{
  "error": {
    "errors": Array[1][
      {
        "domain": "global",
        "reason": "required",
        "message": "Login Required",
        "locationType": "header",
        "location": "Authorization"
      }
    ],
    "code": 401,
    "message": "Login Required"
  }
}

我尝试过的其他事情

我还尝试使用我的 SQL 实例的 service_account_email,它来自:

gcloud sql instances describe <instance_name>

但是,它似乎有同样的错误。

问题

根据我收到的 REST API JSON 错误,我如何使用service_account_email“登录”,这样我就不会得到401 Error

【问题讨论】:

  • 一些问题:你在同一个项目中有CloudSQL和GCS吗?您有第二代实例吗?如果都是肯定的,您是否提供了您发布的手册第 6 步(将服务帐户作为写入器添加到存储桶 ACL)和第 7 步(将服务帐户作为读取器添加到导入文件)中提到的权限?
  • 是的,我在同一个项目中有 CloudSQL 和 GCStorage。我的 MySQL 实例是第二代实例。我已成功将我的服务帐户添加为作者和读者(遵循 MySQL 导入指南)。

标签: google-cloud-platform google-cloud-storage google-cloud-sql user-permissions service-accounts


【解决方案1】:

问题是关于数据库实例服务帐户在创建的存储桶上写入的权限。解决此问题的步骤

1) 转到您的 Cloud SQL 实例并复制实例的服务帐户(Cloud SQL->{实例名称}->OVERVIEW->服务帐户)

2) 复制服务帐户后,转到要转储的 Cloud Storage Bucket 并为该帐户设置所需的权限(Storage->{bucket name}->permissions->add member)。

【讨论】:

  • 在经历了一个小时的挫折之后,他的工作就像一个魅力。谢谢!
【解决方案2】:

云 SQL 实例在不属于您项目的 Google 服务帐号下运行。您需要授予此用户对 Cloud Storage 中要导入的文件的权限。这是一个方便的花花公子 bash sn-p 可以做到这一点。

SA_NAME=$(gcloud sql instances describe YOUR_DB_INSTANCE_NAME --project=YOUR_PROJECT_ID --format="value(serviceAccountEmailAddress)")
gsutil acl ch -u ${SA_NAME}:R gs://YOUR_BUCKET_NAME;
gsutil acl ch -u ${SA_NAME}:R gs://${YOUR_BUCKET_NAME}/whateverDirectory/fileToImport.sql;

第一行获取服务帐户电子邮件地址。 下一行授予此服务帐户对存储桶的读取权限。 最后一行为服务帐户提供文件的读取权限。

【讨论】:

  • 如果你以后想删除权限(删除所有权限)gsutil acl ch -d ${SA_NAME} gs://YOUR_BUCKET_NAMEgsutil acl ch -d ${SA_NAME} gs://YOUR_BUCKET_NAME/file.sql
【解决方案3】:

Google 也有一些最糟糕的错误报告。如果您收到此错误消息,也可能是您输入了错误的 PATH。就我而言,这是我的存储桶目录的路径。想想看,我无权访问不存在的存储桶。技术上正确,但几乎没用。

【讨论】:

  • 谢谢,这是给我的。我很感激我一直向下滚动。
  • 有这个问题。希望这可以节省一些时间...``` PROJECT_ID=$(gcloud info --format='value(config.project)') SA_NAME=$(gcloud sql instances describe ${DB_NAME} --project=${ PROJECT_ID} --format="value(serviceAccountEmailAddress)") gsutil acl ch -u ${SA_NAME}:R gs://${PROJECT_ID} gsutil acl ch -u ${SA_NAME}:R gs://${PROJECT_ID }/${DB_NAME}.sql gcloud sql 导入 sql ${DB_NAME} gs://${PROJECT_ID}/${DB_NAME}.sql --database ${DB_NAME} ```
【解决方案4】:

在进行一些研究后,根据权限错误,我发现这些步骤对您解决问题更有用:

为了更轻松地测试 ACL 和权限,您可以:

您可能需要向相关服务帐户授予额外的 IAM 角色,例如“roles/storage.admin”,请参阅here 的更多信息。

【讨论】:

  • 可能不会。我已经完成了所有这些事情。可能与我们的 SQL 或 .gz 转储文件有关,虽然备份的 .gz 文件来自 SQL 本身,但我仍在支持下解决。会让你知道。但是,这是正确的方法。
  • 我也支持 GCP。如果通过支持解决问题会更好,因为他们将拥有更多信息/工具。解决后,请在此帖子中分享答案,以便社区可以从经验教训中受益。
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
相关资源
最近更新 更多