如何使用GOOGLE_APPLICATION_CREDENTIALS环境变量对Cloud Storage网址进行签名?

时间:2019-04-11 02:02:28

标签: python-3.x google-cloud-storage google-cloud-functions

如何使用implicit GOOGLE_APPLICATION_CREDENTIALS environment variable provided to a Cloud Function签署Cloud Storage URL?

当存在GOOGLE_APPLICATION_CREDENTIALS环境变量时,以下内容在本地工作,但在Cloud Function内部运行时,失败,并出现KeyError

google_credentials = service_account.Credentials.from_service_account_file(
    os.environ['GOOGLE_APPLICATION_CREDENTIALS']
)
client_email = google_credentials.service_account_email
credential_scope = '{}/auto/storage/goog4_request'.format(datestamp)
credential = '{}/{}'.format(client_email, credential_scope)
# ...
signature = binascii.hexlify(
    google_credentials.signer.sign(string_to_sign)
).decode()

有问题的云功能将部署在多个环境中,因此我想避免必须实际部署凭据文件-可以运行。

在适当的情况下,我正在使用Python 3.7,并将解决方案基于this示例。

1 个答案:

答案 0 :(得分:1)

部署功能时,不需要GOOGLE_APPLICATION_CREDENTIALS。请查看此[1],以了解如何处理经过身份验证的请求。

从[2]中可以看到,Cloud Storage客户端库可能需要IAM(iam.googleapis.com)API和iam.serviceAccounts.signBlob权限。即使Cloud Functions具有“默认应用程序凭据”,它(通常)也不包括iam.serviceAccounts.signBlob权限。

您可能会在文档中看到,您还需要确保您的服务帐户具有适当的角色。您还可以选择要使用您的功能运行哪个服务帐户。

请让我知道此信息是否有助于解决您的问题。


[1] https://cloud.google.com/functions/docs/writing/http#authentication_and_cors
[2] https://cloud.google.com/functions/docs/writing/http#uploading_files_via_cloud_storage