Google cloud platform 使用服务帐户导入Google云SQL的权限

Google cloud platform 使用服务帐户导入Google云SQL的权限,google-cloud-platform,google-cloud-storage,google-cloud-sql,user-permissions,service-accounts,Google Cloud Platform,Google Cloud Storage,Google Cloud Sql,User Permissions,Service Accounts,我已经成功地导出了MySQL数据库 现在,我正尝试按照以下步骤导入MySQL数据库 我已经检查了我正在使用的服务帐户\u电子邮件的权限,并且我已经允许管理SQL和管理存储权限 我能够在本地使用以下命令成功激活我的服务帐户: gcloud auth activate-service-account <service_account_email> --key-file=<service_account_json_file> 我尝试过的其他事情 我还尝试使用我的SQL实例

我已经成功地导出了MySQL数据库

现在,我正尝试按照以下步骤导入MySQL数据库

我已经检查了我正在使用的
服务帐户\u电子邮件的权限,并且我已经允许管理SQL管理存储权限

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

gcloud auth activate-service-account <service_account_email> --key-file=<service_account_json_file>  
我尝试过的其他事情

我还尝试使用我的SQL实例的
服务\u帐户\u电子邮件
,它来自:

gcloud sql instances describe <instance_name>
gcloud sql实例描述
但是,它似乎也有同样的错误

问题


根据我收到的REST API JSON错误,我如何使用
服务帐户\u电子邮件
进行“登录”,以避免出现
401错误

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

为了更方便地测试ACL和权限,您可以:

  • 像往常一样使用gsutil,查看是否可以访问有问题的对象

您可能需要向有问题的服务帐户授予其他IAM角色,如“roles/storage.admin”,请参阅更多信息。

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

1) 转到您的云SQL实例并复制实例的服务帐户(云SQL->{Instance name}->概述->服务帐户)


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

云SQL实例正在一个不属于您的项目的Google服务帐户下运行。您需要授予此用户对云存储中要导入的文件的权限。这里有一个方便的dandy 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;
第一行获取服务帐户的电子邮件地址。 下一行提供此服务帐户对bucket的读取权限。
最后一行给出了服务帐户对文件的读取权限。

谷歌也有一些最严重的错误报告。如果您收到此错误消息,也可能是您输入的路径不正确。在我的例子中,它是我的bucket目录的路径。想想看,我没有权限访问一个不存在的bucket。技术上正确,但几乎没有用处。

一些问题:您在同一个项目中有CloudSQL和GCS吗?您有第二代实例吗?如果所有这些都是肯定的,您是否提供了您发布的手册第6步(以编写者身份将服务帐户添加到bucket ACL)和第7步(以读卡器身份将服务帐户添加到导入文件)中提到的权限?是的,我在同一个项目中有CloudSQL和GCStorage。我的MySQL实例是第二代实例。我已经成功地将我的服务帐户添加为编写器和读取器(遵循MySQL导入指南)。可能不会。所有这些我都做过。它可能与我们的SQL或.gz转储文件有关,尽管backup.gz文件来自SQL本身,但我仍在通过支持解决它。我会让你知道的。但是,这是正确的方法。我也支持GCP。最好通过支持解决问题,因为他们将拥有更多信息/工具。一旦问题解决,请在这篇文章中分享答案,以便社区能够从中学到的经验教训中受益。如果您想在事后删除权限(删除所有权限)
gsutil acl ch-d${SA_NAME}gs://YOUR_BUCKET_NAME
gsutil acl ch-d${SA_NAME}gs://YOUR_BUCKET\u NAME/file.sql
在经历了一个小时的挫折后,它的工作效果非常好。非常感谢。
gcloud sql instances describe <instance_name>
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;