Google 即使正确设置了环境变量,存储也不使用服务帐户

Google Storage not using service account even with environment variable properly set

我试图在 Jupyter Notebook 中使用以下命令将两个文件保存到 GCP 存储:

!gsutil cp ./dist/my_custom_code-0.1.tar.gz gs://$BUCKET_NAME/custom_prediction_routine_tutorial/my_custom_code-0.1.tar.gz
!gsutil cp model.h5 preprocessor.pkl gs://$BUCKET_NAME/custom_prediction_routine_tutorial/model/

存储桶已正确创建,因为我可以在 GCP 的存储桶列表中看到它。同样在存储桶的权限中,我可以看到创建的服务帐户。另外,我确保环境变量设置为 运行:

export GOOGLE_APPLICATION_CREDENTIALS="/home/george/Documents/Credentials/prediction-routine-new-b7a445077e61.json"

这可以通过 运行 在 Python 中验证:

import os

print('Credendtials from environ: {}'.format(os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')))

显示:

Credentials from environ: /home/george/Documents/Credentials/prediction-routine-new-b7a445077e61.json

我确实将 json 文件存储在指定位置。但是,当我尝试使用顶部显示的命令保存文件时,我不断收到此错误消息:

AccessDeniedException: 403 george***@gmail.com does not have storage.objects.list access to the Google Cloud Storage bucket.
Copying file://model.h5 [Content-Type=application/octet-stream]...
AccessDeniedException: 403 george***@gmail.com does not have storage.objects.create access to the Google Cloud Storage object.

所以问题是,为什么 Google 存储没有使用我的服务帐户并继续使用我的用户帐户?


更新

在@Hao Z 指出的项目激活服务帐户后,GCP 现在正在使用我的服务帐户。但是,我确实为此服务帐户设置了权限...


更新 2

这似乎是一个已知问题:https://github.com/GoogleCloudPlatform/gsutil/issues/546

勾选How to use Service Accounts with gsutil, for uploading to CS + BigQuery

相关位:

Download service account key file, and put it in e.g. /etc/backup-account.json
gcloud auth activate-service-account --key-file /etc/backup-account.json

或者您可以执行 gsutil -i 来模拟服务帐户。使用 'gsutil help creds' 获取更多信息。我猜 env 变量只是被 Python SDK 使用,而不是被 CLI 使用。

我能够通过以下步骤解决此问题:

首先,使用上面@Hao Z建议的方式,我能够使用以下方式激活Jupyter Notebook中的服务帐户:

!gcloud auth activate-service-account \
  prediction-routine-new@prediction-routine-test.iam.gserviceaccount.com \
          --key-file=/home/george/Documents/Credentials/prediction-routine-new-b7a445077e61.json \
          --project=prediction-routine-test

其次,在意识到我使用了错误的名称后,我更改了使用的存储桶名称 - 它应该是 "prediction-routine" 而不是 "prediction-routine-bucket"。

BUCKET_NAME="prediction-routine"

第三,我将服务帐户权限的角色从 "Storage Object Admmin" 更改为 "Storage Admin"。