gcs 没有 ACCESS_KEY_ID、 ACCESS_KEY_SECRET 吗

我有一个需求:上传文件到 google-cloud-storage ,使用了谷歌提供的 python client sdk: google-cloud-storage

但是我发现很严重的问题:
使用 aliyun 的 oss ,我们只要简单的使用 ACCESS_KEY_ID、 ACCESS_KEY_SECRET 就可以连上,然后上传文件。

oss:
  ALI_OSS_ACCESS_KEY_ID: xxx
  ALI_OSS_ACCESS_KEY_SECRET: xxx
  ALI_OSS_END_POINT: xxx
  ALI_OSS_BUCKET: xxx

但是在 google-cloud-storage 貌似没有 ACCESS_KEY_ID、 ACCESS_KEY_SECRET 吗?

貌似需要通过 json 文件来做鉴权?有什么简单的 example 可以参考吗?

阅读 2k
1 个回答

没有,谷歌的云存储非常的奇葩,没有正常 oss、minio 那种 access_key、secret_key 来做身份验证,而是把事情搞得极其复杂,复杂到你不看一整个下午的文档,根本无法入手!

解决方案是什么呢?

方案有超级多!

但是我只介绍一个超级简单的、符合云原生需要的:

以服务帐号身份进行身份验证

大概思路就是:

  • 创建一个服务账号
  • 以该服务账号的名义,创建一个凭据(是一个 json 文件)

这个凭证(也就是 json 文件)大概长成下面这样:

{
  "type": "xxx",
  "project_id": "xxx",
  "private_key_id": "xxxx",
  "private_key": "xxxx",
  "client_email": "xxx",
  "client_id": "xxxxxx",
  "auth_uri": "xxxx",
  "token_uri": "xxxx",
  "auth_provider_x509_cert_url": "xxxxx",
  "client_x509_cert_url": "xxxx"
}

然后使用相关的 sdk 库,连接到 gcs


下面以 python 举例子:

需求:判断 gcs 中是否存在指定对象

from google.cloud import storage
from google.auth.credentials import Credentials


def has_object(bucket_name: str, obj_file_path: str) -> bool:
    """
    参考: https://cloud.google.com/storage/docs/samples/storage-list-files-with-prefix?hl=zh-cn
    """
    storage_client = storage.Client.from_service_account_json(
        str(BASE_DIR/'auth'/'xxxx.json')
    )

    blobs = list(storage_client.list_blobs(bucket_name, prefix=obj_file_path))

    logger.debug(f'一共有 {len(blobs)} 个对象')

    return bool(blobs)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题