web-dev-qa-db-fra.com

Écraser le point de terminaison S3 à l'aide du fichier de configuration Boto3

APERÇU:

J'essaie d'écraser certaines variables dans boto3 en utilisant le fichier de configuration (~/aws/confg). Dans mon dossier utilisateur, je souhaite utiliser le service fakes3 et envoyer des requêtes S3 à l'hôte local.

EXEMPLE:

Dans boto (pas boto3), je peux créer une configuration dans ~/.boto semblable à celle-ci:

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

[Boto]
is_secure = False

Et le client peut capturer avec succès les modifications souhaitées et au lieu d’envoyer du trafic au service S3 réel, il l’enverra à l’hôte local.

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

CE QUE J’AI ESSAYÉ:

J'essaie d'obtenir un résultat similaire en utilisant la bibliothèque boto3. En regardant le code source, j'ai découvert que je pouvais utiliser ~/aws/config location. J'ai également trouvé un exemple de configuration dans le dossier unittests de botocore

J'ai essayé de modifier la configuration pour obtenir le comportement souhaité. Mais malheureusement ça ne marche pas.

Voici la config:

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

QUESTION:

  1. Comment écraser les variables clients à l'aide d'un fichier de configuration?
  2. Où puis-je trouver une liste complète des variables autorisées pour la configuration?
17
Vor

Vous ne pouvez pas définir Host dans le fichier de configuration, mais vous pouvez le remplacer à partir de votre code avec 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',
)

Ensuite, vous pouvez interagir comme d'habitude.

print(s3_client.list_buckets())
27
ChillarAnand

boto3 lit uniquement la version de la signature pour s3 à partir de ce fichier de configuration. Vous voudrez peut-être ouvrir une demande de fonctionnalité, mais pour l'instant, voici comment vous pouvez adresser un point de terminaison personnalisé:

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)

Ce point concernant la méta est important car boto3 change automatiquement le noeud final en your_bucket_name.s3.amazonaws.com quand il le juge utile 1 . Si vous travaillez avec votre propre hôte et s3, vous voudrez peut-être remplacer la fonctionnalité plutôt que de la supprimer complètement.

2
Jordon Phillips

Autrement:

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)
2
okwap

en utilisant la ressource 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)
0
Andi-OTC