使用服务帐号导入 Google Cloud SQL 的权限



我已经按照MySQL导出指南成功导出了MySQL数据库。

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

我已经检查了我正在使用的service_account_email的权限,并且我允许管理员 SQL管理员存储权限。

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

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

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

1( 进入您的云 SQL 实例,复制实例的服务账号(云 SQL->{实例名称}->概述->服务账号(

2( 复制服务帐户后,转到要转储的云存储桶,并为该帐户设置所需的权限(存储->{存储桶名称}->权限->添加成员(。

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

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;

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

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

根据谷歌文档

  • 描述要导入到的实例:
    gcloud sql instances describe INSTANCE_NAME
  • 复制"服务帐户电子邮件地址"字段。
  • 使用 gsutil iam 将 storage.objectAdmin IAM 角色授予存储桶的服务账户.
    gsutil iam ch serviceAccount:SERVICE-ACCOUNT:objectAdmin gs://BUCKET-NAME
  • 然后导入数据库

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

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

  • 为相关服务帐户创建和下载密钥
  • 使用"gcloud 身份验证激活服务帐户"获取服务帐户的凭据
  • 像往常一样使用 gsutil 查看是否可以访问相关对象

您可能需要向相关服务账户授予其他 IAM 角色,例如"roles/storage.admin",请参阅此处的更多信息。

相关内容

  • 没有找到相关文章

最新更新