Boto3 ListObject Forbiden для администратора пользователя - PullRequest
0 голосов
/ 10 мая 2018

Я пытался написать небольшой скрипт для загрузки в lambda / tmp всего содержимого папки S3. Для этого мне нужно перечислить все объекты в определенном ведре. К сожалению, я продолжаю получать следующую ошибку:

An error occurred (403) when calling the HeadObject operation: Forbidden

Вот как я пытаюсь загрузить все файлы из папки:

#initialize S3
try:
        s3 = boto3.resource('s3',
        aws_access_key_id=os.getenv('S3USERACCESSKEY'),
        aws_secret_access_key=os.getenv('S3USERSECRETKEY')
    )
    s3_client = boto3.client('s3',
        aws_access_key_id=os.getenv('S3USERACCESSKEY'),
        aws_secret_access_key=os.getenv('S3USERSECRETKEY')
    )
except Exception as e:
    logger.error("Could not connect to s3 bucket: " + str(e))

#Function to download whole folders from s3
for s3_key in s3_client.list_objects(Bucket=os.getenv('S3BUCKETNAME'))['Contents']:
    s3_object = s3_key['Key']
    if not s3_object.endswith("/"):
        s3_client.download_file('bucket', s3_object, s3_object)
    else:
        import os
        if not os.path.exists(s3_object):
            os.makedirs(s3_object)

Указанные выше ключи доступа имеют полные права администратора: enter image description here

EDIT

Все еще безуспешно после удаления моих ручных ключей, вот право, которое я прикрепил к Lambda:

enter image description here

Вот фактическая ошибка из cloudwatch:

enter image description here

Код теперь выглядит так:

#initialize S3
    try:
            s3 = boto3.resource('s3')
        s3_client = boto3.client('s3')
    except Exception as e:
          [....]

Похоже, что "Запрещено" может быть другой проблемой, чем разрешение, но я не могу найти на нем никакого документа.

1 Ответ

0 голосов
/ 10 мая 2018

Убедитесь, что ключ доступа принадлежит пользователю с ролью IAM, у которого есть права на доступ к корзине s3. Если вы запускаете из лямбды, вам не нужно использовать ключ доступа, просто присоедините роль IAM к лямбде

https://docs.aws.amazon.com/lambda/latest/dg/accessing-resources.html

Вы импортировали boto? Попробуйте запустить выполнить только это:

UPDATE

import boto3
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
  print(bucket.name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...