web & mobile DEVELOPER 03 / 2016 – Amazon Web Services mit PHP

wmd_201603_aws

 

Amazon Web Services mit PHP

Das AWS PHP SDK ist eine moderne, Open Source-PHP-Bibliothek, mit der man PHP-Anwendungen in AWS-Services wie Amazon S3, Amazon Glacier und Amazon DynamoDB einfacher integrieren kann.

Von Patrick Lobacher

Neben Microsoft Azure und der Google Cloud Plattform zählt AWS zu den bedeutesten bedeutendsten internationalen Angeboten im Cloud Computing und ist zudem Pionier in diesem Bereich.

Das Angebot der Amazon Webservices wird auch als Infrastructure-as-a-Service bezeichnet, da es dem Endanwender eine einfach zu handhabende Cloud-Infrastruktur bietet.

AWS_PHP_lobacher_01a

Für den Zugriff auf die AWS gibt es zahlreiche SDKs – z.B. Java, .NET, Phyton, Ruby, Go, C++ und eben auch PHP. Aktuell ist die Version 3 des SDKs (genauer 3.12.1 am 07.01.2016). Das SDK ist auf GitHub unter https://github.com/aws/aws-sdk-php erreichbar.

Auch wenn das SDK nahezu jede verfügbare API abdeckt (und das sind fast 60) – gehen wir in dem vorliegenden Artikel näher auf den sogenannten „Amazon S3“ ein. Amazon Simple Storage Service (Amazon S3) bietet Entwicklern und IT-Teams sicheren, beständigen und hochgradig skalierbaren Objektspeicher. Damit können von überall im Internet beliebige Datenmengen gespeichert und abgerufen werden.

Systemanforderungen

Grundsätzlich benötigt das AWS PHP SDK eine PHP Version >= 5.5.0. Optional sollte PHP über die OpenSSL PHP Extension verfügen, wenn man private Amazon CloudFront URLs signieren möchte.

Folgende PHP Extensions müssen installiert sein:

  • pcre
  • spl
  • json
  • dom
  • simplexml
  • zip

Die folgenden PHP Extensions sind optional, sollten aber installiert sein:

  • cURL >= 7.16.2
    Auch wenn die Verwendung von cURL optional ist, so ist es doch unbedingt zu empfehlen. Der PHP Stream Wrapper (der anstelle von cURL bei Abwesendheit verwendet wird) ist deutlich leistungsschwächer
  • OPCache
    Verbessert die Performance
  • (kein!) Xdebug
    Während der Entwicklung ist die Verwendung von Xdebug sinnvoll und ggf. auch notwendig. In produktiven Systemen sollten man zugunsten der Performace darauf verzichten

Unter der URL https://github.com/aws/aws-sdk-php/blob/master/compatibility-test.php kann man einen Kompatibilitätstest herunterladen und durchführen. Zusätzlich zum Testen der minimalen Systemanforderungen prüft das SDK auch auf optinale Settings und macht Vorschläge um die Performance des SDK zu erhöhen.

AWS_PHP_lobacher_01

Der Kompatibilitätstest kann über der Browser, aber auch über die Kommandozeile ausgeführt werden. Im Browser werden die erfolgreichen Checks in grün, die Warnungen in purpur und die Fehler in rot dargestellt. Die Kommandozeile wiederum verzichtet auf Farbangaben und stellt das Ergebnis textuell zeilenweise dar

Installation per Composer

Composer ist das bevorzugte Tool, um das AWS SDK für PHP zu installieren, da Composer vorhandene Abhängigkeiten automatisch auflöst.

Listing 1: Installation per Composer

Hier wird zuerst Composer als Datei vom Server geholt und in das Document Root (hier müssen Sie Ihr eigenes Verzeichnis angeben) abgelegt.

Nun wird per Composer-Befehl das SDK ermittelt, Abhämhigkeiten aufgelöst und im Document Root im Verzeichnis vendor abgelegt.

Um nun das SDK einzubinden, reicht es, den Composer Autoloader anzusprechen.

Listing 2: Einbindung via Autoloader

 

Installation per Phar und ZIP

Es ist zudem auch möglich, das SDK per Phar (PHP Archive) unter http://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.phar herunterzuladen und zu referenzieren.

Listing 3: Einbindung via Phar

Für das Zip-File gehen Sie zur zugehörigen Download-Adresse unter http://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip, entpacken die Datei im Document Root und laden den Autoloader.

Listing 4: Einbindung via Zip

 

AWS Account

Um mit der AWS API zu arbeiten, benötigt man sogenannte „Access Keys“, die man erhält, sobald man sich bei Amazon registriert hat.

Access Keys werden hierzu an einen Account (sogn. Root-Account) gebunden und bestehen aus zwei Bestandteilen: Access Key ID und Secret Access Key.

Die Erstellung des Account ist grundsätzlich kostenlos und auch die Verwendung der Amazon Services für 12 Monate. Anschließend fallen nutzungsabhängige Gebühren an.

Im Detail sind folgende Nutzungen in den ersten 12 Monaten kostenfrei:

  • Amazon EC2 (Rechenkapazität)
  • 750 Stunden monatliche Nutzung einer Linux-, RHEL- oder SLES t2.micro-Instance
  • 750 Stunden monatliche Nutzung einer Windows t2.micro-Instance
  • Amazon EC2 Container Registry
  • 500 MB/Monat Speicher
  • Amazon S3 (Datenspeicherinfrastruktur)
  • 5 GB Standardspeicher
  • 20 000 GET-Anforderungen
  • 2 000 PUT-Anforderungen
  • Amazon DynamoDB (NoSQL-Datenbank)
  • 25 GB Speicher
  • 25 Einheiten Schreibkapazitätseinheiten
  • 25 Einheiten Lesekapazitätseinheiten
  • AWS IoT (Internet of Things)
  • 250 000 Nachrichten (veröffentlicht und geliefert) pro Monat
  • Elastic Load Balancing (Load Balancer)
  • 750 Stunden pro Monat
  • 15 GB Datenverarbeitung
  • Amazon CloundFront (Inhaltsbereitstellung)
  • 50 GB Übertragung ausgehender Daten
  • 2.000.000 HTTP- oder HTTPS-Anforderungen
  • u.v.w.m. (http://aws.amazon.com/de/free/)

Gehen Sie zunächst auf die Adresse https://portal.aws.amazon.com/gp/aws/developer/registration/index.html um einen neuen AWS-Account anzulegen. Sollten Sie bereits über ein Amazon-Konto verfügen, so können Sie sich auch mit diesen Zugangsdaten einloggen.

Für spätere Abbuchungen muss nach der Eingabe der persönlichen Daten eine Kreditkarte hinterlegt werden. Zudem wird die Angabe einer Telefonnummer benötigt, damit das Amazon-System den User authentifizieren kann.

Anschließend können Sie das Support-Level wählen. Das Basis-Level ist dabei kostenlos – weitere Level beginnen ab 49 USD pro Monat und beinhalten kurze Reaktionszeiten, direkter Chat, rund-um-die-Uhr Erreichbarkeit und weiteres.

 

AWS_PHP_lobacher_02

 

Das Erstellen der Access Keys und das Verwalten der Berechtigungen wird durch die „AWS Identity and Access Management“ (IAM) Konsole erledigt.

Gehen Sie hierzu auf die URL https://console.aws.amazon.com/iam/home.

Hier führen Sie die folgenden Schritte durch:

  • Gruppe anlegen
    Klicken Sie links auf „Groups“ und dann oben auf „Create New Group“. Dann geben Sie einen Gruppennamen an (z.B. „awstest“).
  • Policy
    Im nächsten Fenster „Attach Policy“ suchen Sie im Filter-Feld nach „AmazonS3FullAccess“ und wählen die Checkbox davor aus. Nun klicken Sie „Create Group“ und bestätigen anschließend
  • User anlegen
    Wählen Sie nun links „Users“ aus und anschließend „Create New Users“. Dort wird nun ein User mittels „Create“ angelegt (z.B. „aws_demo“). Achten Sie dabei darauf, dass die Checkbox „Generate an access key for each user“ angewählt ist.
  • Download Credentials
    Klicken Sie nun auf „Download Credentials“. Die Datei „credentials.csv“ enthält nun Username,  Access Key Id und Secret Access Key.
  • User zur Gruppe hinzufügen
    Um den User nun noch zur Gruppe hinzuzufügen, klicken Sie links auf „Groups“, wählen dann die Gruppe aus und fahren mit „Group Actions“ fort bei dem Sie dann „Add Users to group“. Nun wählen Sie den User aus und klicken rechts unten auf „Add Users“.

 

Credentials hinterlegen

Es gibt zahlreiche Möglichkeiten, die Credentials zu hinterlegen – ausführliche Informationen hierzu finden Sie hier: http://docs.aws.amazon.com/aws-sdk-php/v2/guide/credentials.html.

  • AWS Credential Datei
  • Umgebungsvariablen
  • IAM Rollen für EC2
  • Configuration Datei des Service Builders
  • Übergabe über eine Client-Factory Methode
  • Temporäre Credentials via AWS STS

Wir entscheiden uns für die erste Methode und legen eine Credentials-Datei mit dem Namen „credentials“ an, die wir im Ordner ~/.aws/ (unter Windows: C:\Users\USER_NAME\.aws/) mit dem folgenden Inhalt anlegen:

Listing 5: credentials Datei

In einer solchen Datei kann es verschiedene Abschnitte geben, die jeweils von einem String in eckigen Klammern eingeleitet werden. Auf diesen referenzieren wir später. In obigen Beispiel gibt es den Abschnitt „default“ mit den zugehörigen Daten.

Amazon Simple Storage Service (S3)

Als erstes Beispiel wollen wir den Amazon Simple Storage Service (S3) ansprechen. S3 ist ein Filehosting-Dienst, der theoretisch beliebig große Datenmengen speichern kann.

Listing 6: S3 Client

Beim Erstellen des Clients können verschiedene Konfigurationsoptionen angegeben werden:

  • version (required)
    Hiermit muss die Version der API angegeben werden. Die letzte Version ist dabei „2006-03-01“. Es kann aber auch „latest“ verwendet werden, um die wirklich letzte Version anzusprechen – dies wird aber in produktiven Umgebungen nicht empfohlen
  • region (required)
    Die geografische Region, in der die Daten gespeichert werden. Die möglichen Regionen sind hier zu finden: http://docs.aws.amazon.com/general/latest/gr/rande.html
  • creddentials
    Mit den Untereigenschaften „key“ und „secret“ kann das Credential auch hier angegeben werden
  • debug
    Setzt man den Wert auf „true“ so werden Debug-Informationen ausgegeben
  • delay
    Verzögerung in Millisekunden bevor der Request gesendet wird
  • progress
    Angabe einer Funktion, die den Fortschritt verarbeiten kann
  • synchronous
    Angabe (in Boolean), ob der Request synchron ausgeführt werden soll
  • timeout
    Timeout Angabe in Sekunden
  • retries
    Angabe, wieviele Verbindungs-Versuche durchgeführt werden sollen
  • scheme
    Schema („http“ oder „https“)

 

Buckets

Bei der internen Entwicklung von Amazon S3 musste beachtet werden, dass die bei dem Speicherdienst hinterlegten Daten möglichst schnell weltweit verfügbar sein sollen und S3 auch bei unzähligen parallelen Zugriffen nicht zusammenbricht.

Um eine einfache Verteilung und Optimierung gespeicherter Daten ermöglichen, hat hat Amazon daher die sogenannten „Buckets“ erfunden.

Ein Bucket ist eine Art Ordner mit einem – innerhalb von Amazon – eindeutigen Namen. Diesem wird eine eindeutige URL [bucketname].s3.amazonaws.com zugeordnet.

Wir legen daher zuerst selbst einen Bucket an:

Listing 7: Bucket anlegen

Der Methode uniqid() kann ein vorderer Namensbestandteil mitgegeben werden – hinten wird ein zufälliger und eindeutiger Hash generiert. Nun wird mittels createBucket() ein Bucket generiert und so lange gewartet, bis dieser zur Verfügung steht.

Objekte

Dateien innerhalb von Amazon S3 werden als „objects“ (Objekte) bezeichnet und in Buckets gespeichert. Ein spezielles Objekt wird über seinen Schlüssel (Key) spezifiziert (z.B. den Namen) und beinhaltet die Daten.

Wir wollen nun ein neues Objekt mit dem Namen „hello_world.txt“ anlegen, das als Inhalt „Hello World“ beinhaltet.

Listing 8: Objekt im Bucket anlegen

Die putObject()-Methode hat noch zahlreiche weitere Parameter, die mit angegeben werden können. So kann z.B. ein Source-File direkt angegeben werden oder Meta-Daten, ContentType sowie Berechtigungen.

So kann beispielsweise über das Attribut „ACL“ die Zugriffsberechtigung auf die Datei angegeben – z.B. „public-read“, wenn diese öffentlich zugänglich sein soll.

Legt man die Resource mitttels $result = $s3->putObject([…]) an, dann kann man auf die URL per $url = $result->get(‚ObjectUrl‘) zugreifen.

Um nun wieder an die Daten zu kommen, kann die Methode getObject() bemüht werden.

Listing 9: Objekt Download

 

Stream Wrapper

Der Amazon S3 Stream Wrapper erlaubt es, Daten zu speichern und darauf zuzugreifen, indem PHP-Funktionen wie file_get_contents, fopen, copy, rename, unlink, mkdir, rmdir, u.s.w. verwendet werden. In diesem Fall kann auf die Objekte über die URL s3://[Bucket]/[Key] zugegriffen werden.

Das vorherige Beispiel mittels Stream Wrapper sieht dann wie folgt aus:

Listing 10: Stream Wrapper

 

Die Verwendung des Stream Wrapper muss anfangs registriert werden. Nun kann mittels file_put_contents und file_get_contents gearbeitet werden.

Daten Löschen

Um nun die Inhalte eines Buckets zu löschen, kann ein sogenannter Batch-Befehl abgesetzt werden, der die Inhalte löscht. Wenn der Bucket dann leer ist, kann dieser selbst mittels deleteBucket() gelöscht werden.

Listing 11: Bucket leeren und löschen

 

 

AWS_PHP_lobacher_03

 

Fehlerbehandlung

Die Fehlerbehandlung erfolgt über einen Try-Catch-Mechanismus, der die Fehlermeldung – sofern vorhanden – in ein Objekt vom Typ S3Exception überführt.

Listing 12: Fehlerbehandlung

 

 

Weitere Befehle

Es gibt noch zahlreiche weitere Operationen, die wir in diesem Artikel nicht vollumfänglich abbilden können – daher konzentrieren wir uns auf eine Auswahl:

  • Commands
    Operationen (wie putObject oder getObject) können auf über einen allgemeineren Befehl getCommand ausgeführt werden: $command = $client->getCommand('GetObject', array(...)). Dann ist es einseits möglich per $command->set(Key,Value) Attribute zu setzen. Mit $command->getResult() wird der Befehl ausgeführt. Hat man mehrere Commands erstellt, so können diese über $s3->execute($commands) ausgeführt werden
  • Objekte auflisten
    Über $s3->listObjects([...]) können Objekte in einem Bucket aufgelistet werden. Will man alle Objekte ermitteln, so verwendet man die Methode getListsObjectsIterator([...]) und kann dann in einer For-Each-Schleife darüber iterieren
  • Upload Directory
    Es ist möglich, ein Verzeichnis in einen Bucket zu laden – der dafür notwendige Befehl lautet $s3->uploadDirectory($dir,$bucket). Dabei muss das Verzeichnis noch nicht mal lokal existieren, sondern kann auch ein Bucket sein, der mittels s3://bucket_src referenziert wird
  • Bucket herunterladen
    Über den Befehl $s3->downloadBucket($dir,$bucket) kann man genau das Gegenteil realisieren – den Bucket in ein lokales Verzeichnis herunter zu laden

 

Fazit

Die Amazon Webservices sind extrem leistungsfähig – wir konnten mit dem vorliegenden Artikel nur an der Oberfläche kratzen. Aber Sie haben sicherlich einen guten Eindruck vom Handling bekommen können und sind nuin hoffentlich motiviert, tiefer einzusteigen. Viel Spaß damit!

 

 

 

Links zum Thema

AWS SDK for PHP Github
https://github.com/aws/aws-sdk-php

AWS SDK for PHP Website
http://aws.amazon.com/de/sdk-for-php/

AWS API Documentation
http://docs.aws.amazon.com/aws-sdk-php/v3/api/

Buckets
http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html

PutObjects Methode
http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject

Commands
http://docs.aws.amazon.com/aws-sdk-php/v2/guide/feature-commands.html

 

 

 

 

Leave a Comment.