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