Boto3 не принимает роль IAM из учетных данных, где aws-cli работает без проблем - PullRequest
0 голосов
/ 05 июня 2019

Я настраиваю некоторые сценарии передачи файлов и использую 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

Любая помощь будет высоко ценится

...