Moduler
Amazon vedlikeholder en egen modul for kommunikasjon med S3 API, kalt Boto3.
Installeres enklest med pip:
# pip3 install boto3
Dette er et kraftig verkt?y som vil kunne utf?re enhver foresp?rsel mot din b?tte du skulle ha behov for, og er anbefalt utgangspunkt for bruk av S3 med Python.
Merk at dersom du kun trenger ? utf?re enkle PUT eller GET-requester, kan du komme vel s? langt med Pythons mer kjente requests modul mot spesifikke stier.
Sette opp tilgang
Det enkleste er ? konfigurere n?kkelpar i ~/.aws/credentials fila som forklart i startguiden, da Boto3 automatisk benytter profiler som er preparert her.
Dermed kan du opprette et Python-objekt som autoriserer med dine n?kkelpar slik:
import boto3 # Egendefinerte variabler endpoint_url = "https://s3-oslo.educloud.no" profile_name = <profilnavn> bucket_name = <b?ttenavn> # Sette opp en sesjon med riktig profil session = boto3.Session(profile_name) s3 = session.resource('s3', endpoint_url=endpoint_url) # Koble til en utvalgt b?tte bucket = s3.Bucket(bucket_name)
Har du kun en default-profil kan profile_name utelates i boto3.Session().
Det resulterende pythonobjektet, "bucket", kan dermed benyttes for ? kj?re sp?rringer mot det spesifiserte b?ttenavnet.
H?y-niv? vs. lav-niv? interaksjon
Boto3-modulen har to ulike funksjoner som benyttes for ? kommunisere med b?ttene;
Client tilbyr "lav-niv?" interaksjoner, og kan i praksis utf?re alt av intrakte sp?rringer man skulle ha behov for.
P? den andre siden har vi Resource, som i praksis er en mer abstrahert (og moderne) funksjon som gj?r det enkelt ? utf?re h?y-niv? interaksjoner som ? liste, slette, eller laste opp/ned objekter.
I eksemplene s? langt har vi brukt resource, og for enkelhets skyld anbefaler vi ? benytte denne s? langt det lar seg gj?re.
Men, et Boto3 client-objekt opprettes p? tilsvarende vis:
session = boto3.Session(profile_name=profile) s3 = session.client('s3', endpoint_url=endpoint)
Du kan lese mer om forskjellene her:
Eksempler p? sp?rringer
Opplasting av filer
P? det simpleste:
bucket.upload_file(FILSTI, OBJEKTNAVN)
Som funksjon hvor objektnavn settes til filnavn om det ikke oppgis, og med feilmelding:
def upload_file(bucket, file_name, object_name=None): # Om S3 object_name ikke er spesifisert, bruk file_name if object_name is None: object_name = os.path.basename(file_name) # Last opp filen try: response = bucket.upload_file(file_name, object_name) except ClientError as e: logging.error(e) return False return True
For mer avanserte opsjoner, se AWS artikkel.
Listing av innhold
Lister ut alle objektnavn i en b?tte:
bucket = s3.Bucket('1003-green-markusor-test') for obj in bucket.objects.all(): print(obj.key) Output ------- bar.txt baz.md foo.txt mappe/ mappe/abc.txt mappe/def.md mappe/ghj.json
Med filterering p? prefiks (f.eks mappenavn):
for obj in bucket.objects.filter(Prefix='mappe/): print(obj.key) Output ------- mappe/ mappe/abc.txt mappe/def.md mappe/ghj.json
Videre kan man iterere med betingelser p? Python-vis, f.eks her hvor vi kun lister ut markdown-filer:
for obj in bucket.objects.all(): if obj.key.endswith('.md'): print(obj.key) Output ------- baz.md mappe/def.md
Nedlasting av filer
P? det simpleste, omvendt av opplasting:
bucket.download_file(OBJEKTNAVN, FILSTI)
Eventuelt kan innholdet str?mmes bin?rt rett inn i en ny fil med download_fileobj, hvis man bruker client:
s3 = session.client('s3', endpoint_url=endpoint) with open(FILNAVN, 'wb') as f: s3.download_fileobj(OBJEKTNAVN, f)