Загрузка нескольких веб-файлов в облачное хранилище с Python - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь загрузить несколько веб-файлов в хранилище, используя python. У меня есть служебная учетная запись, настроенная для включения учетных данных, и поэтому она должна работать. Однако каждый раз, когда я пытаюсь запустить этот код, я получаю эту ошибку:

Запрещено: 403 GET https://storage.googleapis.com/storage/v1/b/voterfile-oh?projection=noAcl: xxx@yyy.zzz.com не имеет доступа к storage.buckets.get к voterfile- о.

Могу ли я получить помощь по этому вопросу? Я не смог собрать какую-либо полезную информацию по этому вопросу , а также не получил ответ, который решил проблему.

def upload_voterfile(bucket_name):
    from google.cloud import storage
    from google.oauth2.service_account import Credentials
    import os
    import json

    credentials_dict = {credentials}
    with open('credentials.json', 'w') as json_file:
        json.dump(credentials_dict, json_file)

    credentials = Credentials.from_service_account_file('credentials.json')

    client = storage.Client(credentials=credentials, project='oh-data-pipeline')
    bucket = client.get_bucket(bucket_name)
    county_list= ['Adams','Allen', 'Ashland', 'Ashtabula', 'Athens', 'Auglaize', 'Belmont', 'Brown', 'Butler', 'Carroll', 
                  'Champaign', 'Clark', 'Clermont', 'Clinton', 'Columbiana', 'Coshocton', 'Crawford', 'Cuyahoga', 'Darke', 
                  'Defiance', 'Delaware', 'Erie', 'Fairfield', 'Fayette', 'Franklin', 'Fulton', 'Gallia', 'Geauga', 'Greene', 
                  'Guernsey', 'Hamilton', 'Hancock', 'Hardin', 'Harrison', 'Henry', 'Highland', 'Hocking', 'Holmes', 
                  'Huron', 'Jackson', 'Jefferson', 'Knox', 'Lake', 'Lawrence', 'Licking', 'Logan', 'Lorain', 'Lucas', 'Madison',
                  'Mahoning', 'Marion', 'Medina', 'Meigs', 'Mercer', 'Miami', 'Monroe', 'Montgomery', 'Morgan', 'Morrow', 
                  'Muskingum', 'Noble', 'Ottawa', 'Paulding', 'Perry', 'Pickaway', 'Pike', 'Portage', 'Preble', 'Putnam', 
                  'Richland', 'Ross', 'Sandusky', 'Scioto', 'Seneca', 'Shelby', 'Stark', 'Summit', 'Trumbull', 'Tuscarawas', 
                  'Union', 'Van Wert', 'Vinton', 'Warren', 'Washington', 'Wayne', 'Williams', 'Wood', 'Wyandot']

    for f, g in zip(range(1, 89), county_list):
        file = urllib.request.urlopen('https://www6.sos.state.oh.us/ords/f?p=VOTERFTP:DOWNLOAD::FILE:NO:2:P2_PRODUCT_NUMBER:{}'.format(f))
        blob = bucket.blob('{}'.format(g))
        blob.upload_from_string(data=file.read(), content_type="text/plain")

if __name__ == "__main__":

    upload_voterfile(bucket_name='voterfile-oh')

1 Ответ

0 голосов
/ 15 января 2020

Мне удалось воспроизвести вашу проблему, вот шаги, которые я выполнил:

  1. Создана учетная запись службы и назначено разрешение Создателя объектов хранения.
  2. Ран gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com получить учетные данные файл.
  3. Удалил строки 7–9 вашего сценария и изменил имя файла строки 11, чтобы оно совпадало с именем загруженного файла учетных данных.
  4. Ран сценарий. Здесь я получаю ту же ошибку, что и вы.

Причина этой ошибки заключается в том, что в строке 14 вы получаете объект корзины с помощью метода get_bucket. Этот метод запрашивает облачное хранилище, требуя получения разрешений для вашей корзины, но роль создателя хранилища не включает в себя разрешения получения.

Чтобы решить вашу проблему, просто измените строку 14 с этим кодом bucket = client.bucket(bucket_name) который напрямую создает объект корзины, не взаимодействуя с облачным хранилищем, и, следовательно, не вызывает ошибку разрешения, см. соответствующую ссылку .

. Другим решением может быть изменение роли учетной записи службы на объект хранения. Администратор, потому что он включает в себя права доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...