Search code examples
python-3.xamazon-s3boto3tealium

BOTO3 - Getting Access Denied when copying a s3 object


I am trying to copy from one bucket to another bucket and each bucket has their own access key and secret.

I can connect to the first bucket and down load a file just fine. It might be important to note that I do not have full access to the bucket I am copying from, meaning I can not read all keys in the bucket, just a subset I have access to. I have complete control on the second bucket I am copying to.

client2 is where I am copying to and client is where I am copying from.

copy_source = {
    'Bucket': bucketName,
    'Key': key
     }

client2.copy(CopySource = copy_source,Bucket=bucketName2,Key=key,SourceClient=client)

Here is the error I get: botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the UploadPartCopy operation: Access Denied

I am a newbie and any help would be greatly appreciated!!


Solution

  • The reason you're likely getting the Access Denied on this is because the SourceClient is only used for getting the size of the object to determine if it can be copied directly, or if a multi-part upload is required.

    When it comes to the actual copy itself, the underlying the underlying copy_object method on the client, which does not accept a SourceClient, and calls out to the S3 APIs PUT Object - Copy method.

    As such, if you want to be able to perform an S3 copy from one bucket to another, you can either give the user associated with the access key used by client2 permission to read from the Source bucket, or you can perform an S3 Get using client1 then an S3 Put with client2.