Передача роли AWS приложению, которое использует конфигурации boto3 по умолчанию

У меня есть настройка aws, которая требует, чтобы я взял на себя роль и получил соответствующие учетные данные для записи в s3. Например, чтобы писать с aws cli, мне нужно использовать флаг --profile readwrite. Если я сам напишу код с загрузкой, я возьму на себя роль через sts, получу учетные данные и создам новый сеанс.

Однако существует множество приложений и пакетов, зависящих от конфигурации boto3, например внутренний код работает так:

s3 = boto3.resource('s3')
result_s3 = s3.Object(bucket, s3_object_key)
result_s3.put(
                Body=value.encode(content_encoding),
                ContentEncoding=content_encoding,
                ContentType=content_type,
        )

Из документации можно настроить boto3 для использования профиля по умолчанию с использованием (среди прочего) переменной AWS_PROFILE env, и он явно работает в терминах, что boto3.Session().profile_name действительно соответствует переменной, но приложения по-прежнему не будут писать в s3.

Каким будет наиболее чистый / правильный способ их правильной установки? Я попытался получить учетные данные из sts и записать их как AWS_SECRET_TOKEN и т.д., но у меня это не сработало ...


person Philipp_Kats    schedule 24.11.2020    source источник


Ответы (2)


Взгляните на ответ здесь: Как выбрать профиль AWS при использовании boto3 для подключения к CloudFront

Вы можете заставить boto3 использовать другой профиль следующим образом:

rw = boto3.session.Session(profile_name='readwrite')
s3 = rw.resource('s3')
person Nathan Williams    schedule 26.11.2020
comment
Спасибо, Натан. Боюсь, я не могу этого сделать, потому что boto3 используется в приложении, которое я использую (большие ожидания), которое я запускал через терминал, и я надеюсь, что мне не нужно будет поддерживать пользовательскую копию - person Philipp_Kats; 28.11.2020
comment
Может быть, что-то вроде этого может помочь: ripon-banik.medium.com/aws -assume-role-script-4e7d3b548f20 Посмотрите на пример 1, поместите его в сценарий bash и отправьте его перед вызовом приложения (вам понадобится установленный JQ, и вы можете игнорировать последние 3 строки сценария, если он вам нужен только для этого одного варианта использования) - person Nathan Williams; 28.11.2020

Я думаю, что правильный ответ на мой вопрос - это тот, который поделился в комментарии Натан Уильямс.

В моем конкретном случае, учитывая, что мне приходилось запускать код из python, и я немного беспокоился о настройке параметров AWS, которые могут влиять на другие операции, я использовал тот факт, что boto3 имеет DEFAULT_SESSION синглтон, используемый каждый раз, и просто перезаписал это с помощью сеанс, который взял на себя надлежащую роль:

hook = S3Hook(aws_conn_id=aws_conn_id)  
boto3.DEFAULT_SESSION = hook.get_session()  

(здесь S3Hook - это объект обработки воздушного потока s3). После этого (в той же среде выполнения) все заработало отлично

person Philipp_Kats    schedule 01.12.2020