̽»¨¾«Ñ¡

English version of this page

Bruk av S3-lagring med Python

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 .

 

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)
Emneord: S3, Objektlagring, lagring Av Markus Syse
Publisert 6. mars 2024 13:13 - Sist endret 3. feb. 2025 14:51