Перезаписать конечную точку S3 с помощью файла конфигурации Boto3

ОБЗОР:

Я пытаюсь перезаписать определенные переменные в boto3 с помощью файла конфигурации (~/aws/confg). В моем случае я хочу использовать службу fakes3 и отправлять запросы S3 на локальный хост.

ПРИМЕР:

В boto (не boto3) я могу создать в ~/.boto конфиг, похожий на этот:

[s3]
host = localhost
calling_format = boto.s3.connection.OrdinaryCallingFormat

[Boto]
is_secure = False

И клиент может успешно принять желаемые изменения и вместо отправки трафика реальной службе S3 он отправит его на локальный хост.

>>> import boto
>>> boto.connect_s3()
S3Connection:localhost
>>> 

ЧТО Я ПЫТАЛСЯ:

Я пытаюсь добиться аналогичного результата, используя библиотеку boto3. Изучив исходный код, я обнаружил, что могу использовать ~/aws/config location. Я также нашел пример конфигурации в unittests папке botocore.

Я попытался изменить конфигурацию, чтобы добиться желаемого поведения. Но, к сожалению, это не работает.

Вот конфиг:

[default]
aws_access_key_id = XXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYY
region = us-east-1
is_secure = False
s3 =
    host = localhost

ВОПРОС:

  1. Как перезаписать clients переменные с помощью файла конфигурации?
  2. Где я могу найти полный список разрешенных переменных для конфигурации?

person Vor    schedule 16.09.2015    source источник
comment
Возможно, это обновление, но мы можем это сделать, если используем python 2: boto.connect_s3 (aws_access_key_id = [ACCESS KEY], aws_secret_access_key = [SECRET KEY], host = 'localhost', port = 4572, is_secure = True, call_format = boto.s3.connection.OrdinaryCallingFormat ())   -  person qasimzee    schedule 20.11.2019


Ответы (5)


Вы не можете установить хост в файле конфигурации, однако вы можете переопределить его из своего кода с помощью boto3.

import boto3

session = boto3.session.Session()

s3_client = session.client(
    service_name='s3',
    aws_access_key_id='aaa',
    aws_secret_access_key='bbb',
    endpoint_url='http://localhost',
)

Затем вы можете взаимодействовать как обычно.

print(s3_client.list_buckets())
person ChillarAnand    schedule 26.12.2016
comment
Это мне не помогло, и я получил ошибку при выполнении list_buckets () ._ 1_ - person Aniruddha Tekade; 12.04.2021
comment
Не могли бы вы поделиться своей версией бото? @AniruddhaTekade - person ChillarAnand; 15.04.2021

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

import boto3
from botocore.utils import fix_s3_host
resource = boto3.resource(service_name='s3', endpoint_url='http://localhost')
resource.meta.client.meta.events.unregister('before-sign.s3', fix_s3_host)

Этот бит о мета важен, потому что boto3 автоматически изменяет конечную точку на your_bucket_name.s3.amazonaws.com, когда считает нужным 1. Если вы будете работать как со своим собственным хостом, так и с s3, возможно, вы захотите переопределить эту функциональность, а не удалять ее полностью.

person Jordon Phillips    schedule 23.10.2015
comment
как я могу сделать это для sns? - person fatih tekin; 01.12.2017

используя ресурс boto3:

import boto3

# use third party object storage
s3 = boto3.resource('s3', endpoint_url='https://URL:443',
  aws_access_key_id = 'AccessKey',
  aws_secret_access_key = 'SecertKey')

# Print out bucket names
for bucket in s3.buckets.all():
 print(bucket.name)
person Andi-OTC    schedule 21.02.2018

Другой путь:

import boto3

s3client = boto3.client('s3', endpoint_url='http://X.X.x.X:8080/',
        aws_access_key_id = 'XXXXXXX',
        aws_secret_access_key = 'XXXXXXXX')
bucket_name = 'aaaaa'
s3client.create_bucket(Bucket=bucket_name)
person petertc    schedule 03.03.2017
comment
Требуются ли завершающая косая черта и порт URL-адреса конечной точки? - person Learner; 03.01.2019
comment
Вам не нужно указывать порт, если вы используете AWS S3. - person petertc; 04.01.2019

Я только что отправил PR в boto3, чтобы добавить env var, чтобы вы могли переопределить endpoint_url, если вам нужно использовать зависимый модуль, который использует boto3 (в этом случае вы не сможете напрямую изменить вызов boto3.client )

https://github.com/boto/boto3/pull/2746

https://github.com/rwillmer/boto3

person Rachel    schedule 31.01.2021