Google CloudSQLAdmin-服务帐户没有存储桶的必需权限

时间:2019-02-15 17:49:07

标签: python google-api google-cloud-platform google-oauth google-cloud-sql

我正在编写一个python函数,该函数使用服务帐户凭据来调用Google cloudSQLAdmin api以将数据库导出到存储桶。

已向服务帐户授予项目所有者权限,并且存储桶已为项目所有者设置了权限。已为我们的项目启用sqlAdmin api。

Python代码:

from google.oauth2 import service_account
from googleapiclient.discovery import build
import googleapiclient
import json

def main():
    SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin', 'https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/devstorage.full_control']
    SERVICE_ACCOUNT_FILE = './creds/service-account-credentials.json'
    PROJECT = "[REDACTED]"
    DB_INSTANCE = "[REDACTED]"
    BUCKET_PATH = "gs://[REDACTED]/[REDACTED].sql"
    DATABASES = [REDACTED]
    BODY = { # Database instance export request.
    "exportContext": { # Database instance export context. # Contains details about the export operation.
      "kind": "sql#exportContext", # This is always sql#exportContext.
      "fileType": "SQL", # The file type for the specified uri.
          # SQL: The file contains SQL statements.
          # CSV: The file contains CSV data.
      "uri": BUCKET_PATH, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form gs://bucketName/fileName. If the file already exists, the requests succeeds, but the operation fails. If fileType is SQL and the filename ends with .gz, the contents are compressed.
      "databases": DATABASES,
    },
  }

    credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta4', credentials=credentials)
    response = sqladmin.instances().export(project=PROJECT, instance=DB_INSTANCE, body=BODY).execute()
    print(json.dumps(response, sort_keys=True, indent=4))

运行此代码可消除以下错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "[REDACTED]/main.py", line 47, in hello_pubsub
    response = sqladmin.instances().export(project=PROJECT, instance=DB_INSTANCE, body=BODY).execute()
  File "/usr/local/lib/python3.7/site-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/googleapiclient/http.py", line 851, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/sql/v1beta4/projects/[REDACTED]/instances/[REDACTED]/export?alt=json returned "The service account does not have the required permissions for the bucket.">

我已经在2个GCP项目中尝试了此操作,并使用了具有不同权限的多个服务帐户。

相关问题: Access denied for service account (permission issue?) when importing a csv from cloud storage to cloud sql-此问题是由不正确的权限引起的,这里不应该这样,因为该帐户具有项目所有者权限

1 个答案:

答案 0 :(得分:1)

Google云使用identity and access management系统来管理资源:IAM。

每个Cloud SQL实例使用具有权限的相应服务帐户。要找到您的Cloud SQL服务帐户名,请访问:

  

控制台> SQL>实例名称>服务帐户

使用此服务帐户名称,您可以grant access control permission for the bucket,从以下选项中进行选择:存储管理员,存储对象管理员,存储对象创建者,存储对象查看器。

Detailed storage access roles descriptions are included in the documentation