it-swarm.com.de

Überschreiben Sie den S3-Endpunkt mithilfe der Boto3-Konfigurationsdatei

ÜBERBLICK:

Ich versuche, bestimmte Variablen in boto3 mit der Konfigurationsdatei (~/aws/confg) zu überschreiben. In meiner Anwendung möchte ich den fakes3-Dienst verwenden und S3-Anforderungen an den localhost senden.

BEISPIEL:

In boto (nicht boto3) kann ich eine Konfiguration in ~/.boto erstellen, die der folgenden ähnelt:

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

[Boto]
is_secure = False

Der Client kann die gewünschten Änderungen erfolgreich abrufen. Statt Datenverkehr an den echten S3-Dienst zu senden, sendet er ihn an den localhost.

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

WAS ICH VERSUCHT:

Ich versuche ein ähnliches Ergebnis mit der boto3-Bibliothek zu erzielen. Beim Betrachten des Quellcodes habe ich festgestellt, dass ich ~/aws/config location verwenden kann. Ich habe auch eine Beispielkonfiguration im unittests-Ordner von botocore gefunden. 

Ich habe versucht, die Konfiguration zu ändern, um das gewünschte Verhalten zu erreichen. Leider funktioniert es nicht.

Hier ist die Konfig:

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

FRAGE:

  1. Wie clients-Variablen mit der Konfigurationsdatei überschreiben?
  2. Wo finde ich eine vollständige Liste der zulässigen Variablen für die Konfiguration?
17
Vor

Sie können den Host nicht in der Konfigurationsdatei festlegen. Sie können ihn jedoch mit boto3 in Ihrem Code überschreiben.

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',
)

Dann können Sie wie gewohnt interagieren.

print(s3_client.list_buckets())
27
ChillarAnand

boto3 liest nur die Signaturversion für s3 aus dieser Konfigurationsdatei. Möglicherweise möchten Sie eine Funktionsanforderung öffnen. Im Folgenden können Sie jedoch einen benutzerdefinierten Endpunkt ansprechen:

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)

Dieses Bit über die Meta ist wichtig, da boto3 den Endpunkt automatisch in your_bucket_name.s3.amazonaws.com ändert, wenn er/sie als fit 1 sieht. Wenn Sie sowohl mit Ihrem eigenen Host als auch mit S3 arbeiten, möchten Sie möglicherweise die Funktionalität außer Kraft setzen, anstatt sie vollständig zu entfernen.

2
Jordon Phillips

Ein anderer Weg:

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

boto3-Ressource verwenden:

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