Amazon AWS S3 Bucket für Pimcore Assets

Zu jedem PIM, Website und eCommerce Projekt gehören auch immer eine hohe Anzahl an Assets. Bilder, Produktdatenblätter, Broschüren, Videoclips usw. erhöhen den Speicherbedarf immens. Pimcore bietet die Möglichkeit, solche Daten extern z.B. in eine Cloud Umgebung auszulagern.

Der große Vorteil eines PIM-Systems wie Pimcore ist, dass alle Daten an einem Ort vereint abliegen. Endlich kein aufwändiges Suchen mehr von Produktdaten, Datenblättern, Preislisten. Kein stundenlanges Datei-Explorer browsen und Excel Sheet scrollen mehr. 

Produktdaten werden einfach mit Assets wie Produktbildern, Videos oder Broschüren in dem zentralen PIM-System verknüpft und somit einfach Auffindbar gemacht.

Jetzt, wo endlich alle Daten strukturiert abliegen, wächst auch die Anzahl der Assets. Nun ist es ein Leichtes Daten anzureichern. Dies hat zur Folge, dass der Festplatten Bedarf stetig anwächst. Hostet man Pimcore extern, ist zusätzlicher Plattenplatz oft unflexibel und relativ teuer.

Pimcore bietet daher die Möglichkeit, Assets, wie Bilder, Videos, PDFs, etc. komplett in eine Cloud-Umgebung wie Amazon AWS S3 Buckets auszugliedern.

Als Pimcore Gold Partner haben wir bereits einige Erfahrung mit der PIM Asset Auslagerung via Amazon AWS S3 sammeln können. Im Folgenden möchten wir das Thema etwas zusammenfassen.

Amazon Web Services Speicherlösungen - Was ist das?

  • S3 ist dynamisch skalierender (elastic) Webspeicher. Upload und Download von Daten kann mittels HTTP (Rest-API) erfolgen
  • Eine performantere Alternative für einzelne ec2 Server ist EBS (Elastic Block Store). Dies sind virtuelle Festplatten für Server und können allerdings nicht wie S3 zwischen mehreren Servern geteilt werden
  • Amazon bietet auch Speziallösungen für bestimmte Bereiche an, die teilweise auf S3 basieren oder einkompatibles API haben. Zum beispiel Speicherdienste für die Bedürfnisse von High-Performance Computing (HPC), Dateiarchivierung (Glacier) oder dedizierte NTFS Windows Dateisysteme
  • Die Verwendung von AWS-Diensten erfordert einen AWS Account. Im 12 Monate gültigen Free Tier können die meisten Dienste mit Kapazitätseinschränkungen getestet werden. Zum Anlegen eines Accounts ist eine Kreditkarte notwendig. https://aws.amazon.com/free/ https://portal.aws.amazon.com/billing/signup

Pimcore AWS S3 Unterstützung

  • S3 kann für Pfade verwendet werden, die über Pimcore _DIRECTORY Konstanten definiert werden. Eine Liste der möglichen Konstanten gibt es hier https://github.com/pimcore/pimcore/blob/master/lib/Bootstrap.php#L258
  • Verwendet wird das offizielle Amazon SDK für PHP https://aws.amazon.com/sdk-for-php/
  • Die Pimcore Dokumentation für die Grundeinrichtung findet man hier https://pimcore.com/docs/6.x/Development_Documentation/Installation_and_Upgrade/System_Setup_and_Hosting/Amazon_AWS_Setup/Amazon_AWS_S3_Setup.html
  • Mit der auf der Pimcore Seite dokumentierten Lösung, müssen die S3 Pfade zu den Assets und temporären Dateien öffentlich sein. Dazu muss im AWS Backend zuerst Public Access für Bucketpfade grundlegend erlaubt werden (edit block public access settings for selected buckets). Nicht öffentlich Pfade müssen dann mit AWS ACLs gesperrt werden
  • Öffentliche Downloadpfade werden so gebildet: "https://{bucketname}.s3.amazonaws.com/"
  • In manchen Pimcore Projekten werden Assets mit direkten HTTP-Pfaden eingebunden, zum Beispiel Pfade wie pimcore.localhost/assets/testdatei.png . Diese Pfade müssen manuell zur öffentlichen S3 URL geändert werden.
  • Eine erweiterte Möglichkeit dazu ist es, eine eigene Symfony-Action in einem Bundle zu erstellen, welche die Pfade korrekt übersetzt und Dateien "proxied". Damit hat man die Möglichkeit, Dateien auf andere Buckets oder Dateisysteme zu verschieben, ohne die Asset Pfade an mehreren Stellen ändern zu müssen.
  • Beschreibung der zusätzlichen Konfiguration:

    • /app/startup.php

      • Erstellt die Verbindung zu S3 mit S3Client und erweitert alle PHP Dateisystem-Funktionen mit $s3Client->registerStreamWrapper so, dass sie "s3:/" Pfade unterstützen und auf den S3 Bucket umleiten

    • /app/config/services.yml

      • Registrieren einer neuen Event Listener Klasse (AppBundle\EventListener\S3Listener)

    • /src/AppBundle/EventListener/S3Listener.php

      • Implementieren der Event Listener Klasse die von EventSubscriberInterface erbt
      • Übersetzen von Admin UI Assetpfaden, so dass sie den öffentlichen S3 Pfad verwenden
      • Übersetzen von Thumbnail Pfaden, falls vorhanden Cachepfad nehmen, falls nötig Thumbnailgenerierung anstossen
      • Entfernt alte Cache Entries sofort falls ein neues Thumbnail generiert wurde

    • /app/constants.php

      • Pimcore Pfadkonstanten mit den S3 Pfaden definieren
      • Zusätzliche Konfiguration im Pimcore Startup

Zusätzliche Konfiguration im Pimcore Startup Prozess

Damit Pimcore Verzeichnisse anlegen kann, muss zusätzlich die Lösung aus diesem Kommentar https://github.com/pimcore/pimcore/issues/4907#issuecomment-526471353 in app/startup.php hinzugefügt werden:

 

$default_opts = [
  's3' => [
    'ACL' => 'private',
    'seekable' => true
  ]
];
stream_context_set_default($default_opts);

Insbesondere die "ACL" Option.
Ohne diese Anpassungen erschienen in den Pimcore Logs Meldungen wie:

Cannot save version for element 4 with type asset because the file s3://intera.research.spike/versions/asset/g0/4/4 is not writeable.

Fazit

Die Einrichtung eines AWS Buckets in Pimcore ist noch etwas aufwändig und mit einigen manuellen Schritten verbunden. Dennoch lohnt es sich. Die Integration aus Anwender Sicht ist sehr komfortabel. Es ist quasi keinen Unterschied im Asset Handling zu bemerken. AWS Buckets lassen sich sehr gut skalieren und bieten somit eine deutlich höhere Flexibilität gegenüber normalen Web-Hostings.