Я настраиваю некоторые сценарии передачи файлов и использую boto3 для этого.
Мне нужно отправить несколько файлов из локальной учетной записи AWS стороннего производителя (кросс-аккаунт) У меня есть настройка роли в другой учетной записи с разрешениями на запись в корзину, и я назначил эту роль пользователю в моей учетной записи.
Я могу сделать это без проблем на CLI, но Boto продолжает выкидывать ошибку AccessDenied для корзины.
Я прочитал документы boto3 в этой области, такие как здесь , и настроил файлы учетных данных и конфигурационные файлы такими, какими они должны быть (предположим, они верны в подходе CLI) работает), но я не могу заставить это работать.
Файл учетных данных: -
[myuser]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Файл конфигурации: -
[profile crossaccount]
region = eu-west-2
source_profile=myuser
role_arn = arn:aws:iam::0123456789:role/crossaccountrole
и вот код, с которым я пытаюсь работать: -
#set-up variables
bucket_name = 'otheraccountbucket'
file_name = 'C:\\Users\\test\\testfile.csv'
object_name = 'testfile.csv'
#create a boto session with profile name for assume role call to be made with correct credentials
session = boto3.Session(profile_name='crossaccount')
#Create s3_client from that profile based session
s3_client = session.client('s3')
#try and upload the file
response = s3_client.upload_file(
file_name, bucket, object_name,
ExtraArgs={'ACL': 'bucket-owner-full-control'}
)
EDIT:
В ответ на комментарий разрешения, состоящего из нескольких частей Джона, я попытался загрузить с помощью метода put_object, чтобы обойти это - но все еще получал AccessDenied, но теперь с разрешением PutObject - которое я подтвердил, на месте: -
#set-up variables
bucket_name = 'otheraccountbucket'
file_name = 'C:\\Users\\test\\testfile.csv'
object_name = 'testfile.csv'
#create a boto session with profile name for assume role call to be made with correct credentials
session = boto3.Session(profile_name='crossaccount')
#Create s3_client from that profile based session
s3_client = session.client('s3')
#try and upload the file
with open(file_name, 'rb') as fd:
response = s3_client.put_object(
ACL='bucket-owner-full-control',
Body=fd,
Bucket=bucket,
ContentType='text/csv',
Key=object_name
)
Crossaccountrole имеет разрешения PutObject - ошибка: -
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
END EDIT
Вот рабочая команда aws-cli: -
aws s3 cp "C:\Users\test\testfile.csv" s3://otheraccountbucket --profile crossaccount
Я ожидаю, что это будет загружаться правильно, как эквивалентный код cli, но вместо этого я получаю исключение S3UploadFailedError - Произошла ошибка (AccessDenied) при вызове операции CreateMultipartUpload: Access Denied
Любая помощь будет высоко ценится