Не получается выполнить загрузку нескольких частей на S3 с помощью botocore - PullRequest
0 голосов
/ 23 апреля 2019

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

Это работает, когда есть только один чанк.Ниже приведен код, который я написал для загрузки нескольких частей с помощью aiobotocore.

aiobotocore 0.9.4
boto3 1.9.0
botocore 1.10.58

async def s3_upload(app_config, key, encrypted_filebytes): 

    session = aiobotocore.get_session() 
    async with session.create_client('s3', region_name=app_config['STORAGE']['S3']["AWS_REGION_NAME"], 
                                   aws_secret_access_key=app_config['STORAGE']["AWS_SECRET_KEY"], 
                                   aws_access_key_id=app_config['STORAGE']["AWS_ACCESS_KEY"]) as client: 

        response = await client.create_multipart_upload(Bucket=app_config['STORAGE']['S3']["BUCKET_NAME"], Key=key)  
        upload_id = response['UploadId'] 


        output = BytesIO() 
        source_size = output.write(encrypted_file_bytes) 
        bytes_per_chunk = 1*1024 
        chunks_count = int(math.ceil(source_size / float(bytes_per_chunk)))

        for i in range(chunks_count): 
            offset = i * bytes_per_chunk 
            remaining_bytes = source_size - offset 
            _bytes = min([bytes_per_chunk, remaining_bytes]) 
            part_num = i + 1 

            print ("uploading part " + str(part_num) + " of " + str(chunks_count)) 
            print(offset)
            output.seek(offset) 

            resp = await client.upload_part( 
                Body=output, 
                Bucket=app_config['STORAGE']['S3']["BUCKET_NAME"], 
                ContentLength=_bytes, 
                Key=key, 
                PartNumber=part_num, 
                UploadId=upload_id 
            ) 
            print(resp)

            await client.complete_multipart_upload( 
                    Bucket=app_config['STORAGE']['S3']["BUCKET_NAME"], 
                    Key=key,
                    MultipartUpload={ 
                        'Parts': [ 
                            { 
                            'ETag': resp['ETag'], 
                            'PartNumber': part_num 
                            }, 
                        ] 
                    }, 
                    UploadId=upload_id 
                    ) 
            print("upload_file completed") 


        output.close()

Вот сообщение об ошибке, которое я получаю:

ClientError: An error occurred (SignatureDoesNotMatch) when calling the UploadPart operation: The request signature we calculated does not match the signature you provided. Check your key and signing method.
...