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"。
我试图在 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"。