Профиль сеанса boto3 по умолчанию — доступ запрещен

#amazon-s3 #boto3

#amazon-s3 #boto3

Вопрос:

Мне нужно поместить файл на s3, используя библиотеку, основанную на boto3 (great_expectations), и иметь права на запись только для определенного профиля.

Использование AWS_PROFILE , похоже, устанавливает профиль сеанса по умолчанию, но не помогает. Для репликации я сам запустил код и получил тот же результат (доступ запрещен):

 
import boto3
import os
import json

s3 = boto3.resource("s3")

bucket = 'my-bucket'
key = 'path/to/the/file.json'
content_encoding="utf-8"
content_type="application/json"

value = json.dumps({'test':'test indeed'})

os.environ['AWS_PROFILE']
>>> mycorrectprofile

boto3.DEFAULT_SESSION.profile_name
>>> mycorrectprofile

s3_object = s3.Object(bucket, key)
s3_object.put(
                    Body=value.encode(content_encoding),
                    ContentEncoding=content_encoding,
                    ContentType=content_type,
                )

  

это приводит к AccessDenied

Теперь, сразу после этого, я делаю:

 
my_session = boto3.session.Session(profile_name=os.getenv('AWS_PROFILE'))
ss3 = my_session.resource('s3')
r2_s3 = ss3.Object(bucket, key)
  

это проходит гладко.
Что здесь происходит и как я могу разрешить это поведение?

boto3.__version__ = '1.15.0'

Комментарии:

1. Я предполагаю, что вам нужно установить AWS_PROFILE перед импортом boto3.

2. AWS_PROFILE устанавливается перед временем выполнения python. os.environ['AWS_PROFILE'] просто печатает переменную

3. кроме того, boto3.DEFAULT_SESSION.profile_name отображается правильный профиль

4. Попробуйте это и посмотрите, что вы получите.

5. да, теперь я это вижу. Мы используем boto3.client("sts").assume_role() ... в нашем собственном коде. Есть ли какой-нибудь способ правильно настроить его для boto3 с помощью переменных env?