«Ошибка запроса с кодом состояния», 403, «Ожидаемый один из»,

#python #google-cloud-platform

# #python #google-облачная платформа

Вопрос:

Я пытаюсь переместить CSV-файл с виртуальной машины в хранилище. Я добавил следующий код в свой скрипт

 os.environ['xxx']=r"/home/xx/xxx.json"
storage_client = storage.Client()
bucket = storage_client.get_bucket("bucket name")
data=bucket.blob("xxx.csv")
data.upload_from_filename(r"/home/xxx/xxxx/xxx.csv")
 

Когда я запускаю скрипт из консоли SSH, он возвращает мне следующую ошибку

  raise exceptions.from_http_status(response.status_code, message, response=response)
google.api_core.exceptions.Forbidden: 403 POST https://storage.googleapis.com/upload/storage/v1/b/sp500components/o
?uploadType=multipart: {
  "error": {
    "code": 403,
    "message": "Insufficient Permission",
    "errors": [
      {
        "message": "Insufficient Permission",
        "domain": "global",
        "reason": "insufficientPermissions"
      }
    ]
  }
}
: ('Request failed with status code', 403, 'Expected one of', <HTTPStatus.OK: 200>)
 

Я предоставил права администратора хранилища своей учетной записи службы, но проблема сохраняется

Обновить:

Я также обнаружил, что была строка, синтаксис которой был неправильным. Я пропустил GOOGLE_APPLICATION_CREDENTIALS

 os.environ['GOOGLE_APPLICATION_CREDENTIALS']=r"xxxxx"
 

Комментарии:

1. Если вы добавили администратора хранилища в свою учетную запись службы, вы не используете эту учетную запись службы в своем коде. Ваш код использует ADC для определения местоположения учетных данных. Добавьте более подробную информацию о вашей среде и о том, как вы настроили учетную запись службы для доступа вашей программы.

Ответ №1:

Вы должны добавить области на свою виртуальную машину, чтобы ей было разрешено взаимодействовать с API облачного хранилища Google. Документацию по настройке областей экземпляра можно найти здесь .

 gcloud beta compute instances set-scopes example-instance  
  --scopes=[SCOPES] 
  --zone=us-central1-b  
  --service-account=example-account
 

scopes Флаг содержит по крайней мере одно значение или строку, разделенную запятыми. В вашем случае это может быть один из:

  • облачная платформа
  • хранилище заполнено
  • хранилище-rw

Где последний предпочтительнее в соответствии с принципом наименьших привилегий. Вы также можете изменить это в консоли GCP.

введите описание изображения здесь