谷歌云SQL导入-错误:HTTPError 403:客户端未被授权进行此请求

15

我试图使用以下命令导入在Cloud Storage中存储的数据库:

gcloud sql instances import instance-name gs://connect-to-the-cloud-sql.appspot.com/my-cloud-sql-instance-backup

但是,我遇到了错误:

ERROR: (gcloud.sql.instances.import) HTTPError 403: The client is not authorized to make this request.

我已经使用以下方式登录:

gcloud auth login

1
请仔细检查项目名称。 - Vadim
项目名称是正确的。我能够使用 gcloud sql instances export my-cloud-sql-instance gs://connect-to-the-cloud-sql.appspot.com/my-cloud-sql-instance-backup - Beginner
6个回答

12

确保实例名称正确。我遇到了同样的错误,当我更正实例名称后它就消失了。


7
在我的情况下,我一直在尝试使用命令gcloud sql users list以及--instance=project:zone:instance-name参数,但是得到了相同的错误。当我仅使用--instance=instance-name参数时,它成功运行了。 - bryant
@bryant 我也一样 - no-stale-reads

6

我曾遇到这个问题,我的实例名称是正确的。结果发现我在错误的GCP项目中。请确保您切换到正确的[目标]项目或使用项目参数:

gcloud sql instances export my-cloud-sql-instance gs://connect-to-the-cloud-sql.appspot.com/my-cloud-sql-instance-backup --project=<your target project>

4
在我的情况下,是因为云SQL实例服务帐号对我尝试导入的存储桶没有正确的权限。根据文档
  1. Describe the instance you are importing to:

    gcloud sql instances describe [INSTANCE_NAME]
    
  2. Copy the serviceAccountEmailAddress field.

  3. Use gsutil iam to grant the legacyBucketWriter and objectViewer Cloud IAM roles to the service account for the bucket.

  4. Import the database:

    gcloud sql import sql [INSTANCE_NAME] gs://[BUCKET_NAME]/[IMPORT_FILE_NAME] \
                            --database=[DATABASE_NAME]
    

非常推荐:检查@inostia列出的文档。 - JesusIniesta
不行,即使是这个答案也不能解决它。 - Nathan McKaskle

1

可能听起来过于显而易见,但是您的服务账户可能确实缺少导入数据的访问权限。请检查其在IAM&Admin页面上是否安装了正确的cloudsql.instances.import策略。


不,目前它只有 SQL 管理员来覆盖所有基础,但仍然存在问题。 - Nathan McKaskle

0

新的逐步操作:

gcloud sql instances describe name-instance | grep serviceAccountEmailAddress

# output: serviceAccount:account@gcp-sa.com

gsutil iam ch serviceAccount:account@gcp-sa.com:roles/storage.legacyBucketWriter gs://bucket-destino
gsutil iam ch serviceAccount:account@gcp-sa.com:roles/storage.objectViewer gs://bucket-destino

# -----------en vm linux--gcp------------------------------------------------------------------------------------
gcloud init (id-project-bucket-destino hacer default en vm proyecto de bucket donde se guardara info)
gcloud config set project id-project-bucket-destino

gcloud sql export sql --project=id-project-instance name-instance gs://bucket-destino/sqldump.sql \
--database=name-database \
--offload

# ----------cron job in linux------------------------------------------------------------------------------------
#!/bin/sh

#make directory in Cloud storage

datedirect=$(date '+%d-%m-%Y')

echo $datedirect

touch file5

gsutil cp -r ./file5 gs://bucket-destino/$datedirect/

gcloud config set project id-project-bucket-destino

gcloud sql export sql --project=id-project-instance name-instance gs://bucket-destino/sqldump.sql \
--database=name-database \
--offload

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
不行,不可以,什么都不行,真的什么都不行,我从来没有遇到过这么多错误的答案,但我不知道正确答案是什么。 - Nathan McKaskle

0

在 Cloud Console 中转到 IAM 和管理 > IAM,找到您正在使用的服务帐户,并编辑其角色以添加 Cloud SQL 客户端和 Cloud SQL 管理员。如果找不到服务帐户,则使用 Grant Access 创建它,并使用上述角色。

@inostia 在另一个答案中提到使用 gcloud sql instances describe [INSTANCE_NAME]serviceAccountEmailAddress获取服务帐户。这可能适用于您,但如果您正在模拟,则不是这样。

gcloud auth application-default login --impersonate-service-account local-development@adstudio-sandbox1.iam.gserviceaccount.com

那么你想要使用模拟服务帐户。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接