Google Cloud SQL 使用服务帐户导入的权限
Permissions For Google Cloud SQL Import Using Service Accounts
我在 MySQL Export Guide 之后成功导出了 MySQL 数据库。
现在,我正在尝试在 MySQL Import Guide.
之后导入 MySQL 数据库
我检查了我正在使用的 service_account_email
的权限,并且我允许了 Admin 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 错误,我如何 "login" 使用 service_account_email
这样我就不会得到 401 Error
?
经过一些研究,根据权限错误,我发现这些步骤对您解决问题更有用:
为了更容易测试ACL和权限,您可以:
- Create and download a key for a service account in question
- Use 'gcloud auth activate-service-account' to obtain credentials of service account
- 照常使用 gsutil 查看是否可以访问有问题的对象
您可能需要向相关服务帐户授予其他 IAM 角色,例如 'roles/storage.admin',请参阅更多信息 here。
问题与数据库实例服务帐户在创建的存储桶上写入的权限有关。解决此问题的步骤
1) 转到您的 Cloud SQL 实例并复制实例的服务帐户(Cloud SQL->{实例名称}->OVERVIEW->服务帐户)
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;
第一行获取服务帐户电子邮件地址。
下一行授予此服务帐户对存储桶的读取权限。
最后一行授予服务帐户对该文件的读取权限。
Google 也有一些最严重的错误报告。如果您收到此错误消息,也可能是您输入的 PATH 不正确。在我的例子中,这是我的存储桶目录的路径。想想看,我无权访问不存在的存储桶。技术上正确但几乎没有用。
根据 google Docs
- 描述您要导入的实例:
gcloud sql instances describe INSTANCE_NAME
- 复制 serviceAccountEmailAddress 字段。
- 使用 gsutil iam 将 storage.objectAdmin IAM 角色授予存储桶的服务帐户。
gsutil iam ch serviceAccount:SERVICE-ACCOUNT:objectAdmin gs://BUCKET-NAME
- 然后导入数据库
我在 MySQL Export Guide 之后成功导出了 MySQL 数据库。
现在,我正在尝试在 MySQL Import Guide.
之后导入 MySQL 数据库我检查了我正在使用的 service_account_email
的权限,并且我允许了 Admin 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 错误,我如何 "login" 使用 service_account_email
这样我就不会得到 401 Error
?
经过一些研究,根据权限错误,我发现这些步骤对您解决问题更有用:
为了更容易测试ACL和权限,您可以:
- Create and download a key for a service account in question
- Use 'gcloud auth activate-service-account' to obtain credentials of service account
- 照常使用 gsutil 查看是否可以访问有问题的对象
您可能需要向相关服务帐户授予其他 IAM 角色,例如 'roles/storage.admin',请参阅更多信息 here。
问题与数据库实例服务帐户在创建的存储桶上写入的权限有关。解决此问题的步骤
1) 转到您的 Cloud SQL 实例并复制实例的服务帐户(Cloud SQL->{实例名称}->OVERVIEW->服务帐户)
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;
第一行获取服务帐户电子邮件地址。 下一行授予此服务帐户对存储桶的读取权限。 最后一行授予服务帐户对该文件的读取权限。
Google 也有一些最严重的错误报告。如果您收到此错误消息,也可能是您输入的 PATH 不正确。在我的例子中,这是我的存储桶目录的路径。想想看,我无权访问不存在的存储桶。技术上正确但几乎没有用。
根据 google Docs
- 描述您要导入的实例:
gcloud sql instances describe INSTANCE_NAME
- 复制 serviceAccountEmailAddress 字段。
- 使用 gsutil iam 将 storage.objectAdmin IAM 角色授予存储桶的服务帐户。
gsutil iam ch serviceAccount:SERVICE-ACCOUNT:objectAdmin gs://BUCKET-NAME
- 然后导入数据库