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.

Dersom du kun trenger ? utf?re enkle PUT eller GET-requester, kan du komme vel s? langt med Pythons mer kjente requests modul. Denne artikkelen inneholder eksempler med bruk av begge alternativer.

 

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, p? samme m?te som med AWS CLI, har to m?ter ? kommunisere med b?ttene p?.
Bruk av Resource er den ene (og mer moderne) metoden hvor syntaksen er forenklet, og objekt-orientert. Det kan derimot kun benyttes for "h?y-niv? interaksjon" med objektlagringen, som i korte trekk betyr at det kan benyttes til grunnleggende interaksjoner som ? liste, slette, eller laste opp/ned filer. Er det behov for mer intrekate sp?rringer, vil du sannsynligvis m?tte benytte den andre, "lav-interaksjons" kommunikasjonsmetoden; Client.

Med Boto3 opprettes et client-objekt p? tilsvarende vis:

session = boto3.Session(profile_name=profile)
s3      = session.client('s3', endpoint_url=endpoint)

Du kan lese mer om forskjellene her:

For enkelhets skyld anbefaler vi ? benytte session.resource s? langt det lar seg gj?re.

 

Eksempler p? sp?rringer

Opplasting av filer

P? det simpleste:

bucket.upload_file('<filsti>', '<navn p? objekt>')

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

TODO

TODO
Emneord: S3, Objektlagring, lagring Av Markus S?rensen
Publisert 6. mars 2024 13:13 - Sist endret 5. apr. 2024 16:05