S3ResponseError: 403 Запрещено использование бото

У меня есть скрипт, который копирует файлы из одной учетной записи S3 в другую учетную запись S3, до этого он работал!!!! Это уж точно. Чем я попробовал это сегодня, и это больше не выдает мне ошибку S3ResponseError: 403 Forbidden. Я на 100% уверен, что учетные данные верны, и я могу загрузить ключи из обеих учетных записей вручную с помощью консоли aws.

Код

def run(self):
        while True:
            # Remove and return an item from the queue
            key_name = self.q.get()
            k = Key(self.s_bucket, key_name)
            d_key = Key(self.d_bucket, k.key)
            if not d_key.exists() or k.etag != d_key.etag:
                print 'Moving {file_name} from {s_bucket} to {d_bucket}'.format(
                               file_name = k.key,
                               s_bucket = source_bucket,
                               d_bucket = dest_bucket
                )
                # Create a new key in the bucket by copying another existing key
                acl = self.s_bucket.get_acl(k)
                self.d_bucket.copy_key( d_key.key, self.s_bucket.name, k.key, storage_class=k.storage_class)
                d_key.set_acl(acl)
            else:
                print 'File exist'

            self.q.task_done()

Ошибка:

  File "s3_to_s3.py", line 88, in run
    self.d_bucket.copy_key( d_key.key, self.s_bucket.name, k.key, storage_class=k.storage_class)
  File "/usr/lib/python2.7/dist-packages/boto/s3/bucket.py", line 689, in copy_key
    response.reason, body)
S3ResponseError: S3ResponseError: 403 Forbidden
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>0729E8ADBD7A9E60</RequestId><HostId>PSbbWCLBtLAC9cjW+52X1fUSVErnZeN79/w7rliDgNbLIdCpc9V0bPi8xO9fp1od</HostId></Error>

person Vor    schedule 01.05.2013    source источник


Ответы (1)


Попробуйте это: скопируйте ключ из исходного ведра в целевое ведро, используя класс Key boto.

source_key_name = 'image.jpg' # for example

#return Key object
source_key = source_bucket.get_key(source_key_name)          
#use Key.copy
source_key.copy(destination_bucket,source_key_name)

относительно функции копирования. вы можете установить для save_acl значение True, и он будет скопирован из исходного ключа.

Подпись Бото Key.copy:

def copy(self, dst_bucket, dst_key, metadata=None,
             reduced_redundancy=False, preserve_acl=False,
             encrypt_key=False, validate_dst_bucket=True):
person Amit Talmor    schedule 29.01.2014