#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?