Tworząc aplikację, która będzie przechowywać bardzo wiele plików, dobrze jest pomyśleć zawczasu o zakupie serwera plików lub integracji naszej aplikacji z profesjonalną usługą internetową do przechowywania dużych zbiorów danych. Jedną z takich usług jest Amazon Simple Storage Service w skrócie (Amazon S3).
Zaletą drugiego rozwiązania jest przede wszystkim cena. Koszt jednego gigabajta to kilka zaledwie centów a przestrzeń jest praktycznie nielimitowana.
W tym przewodniku wykonamy prostą aplikację, która wyśle konkretny plik z naszego zwykłego serwera wirtualnego do usługi S3 Amazona.
Funkcjonalności Amazon S3
- Zapis, odczyt i usuwanie plików które mogą ważyć nawet 5TB!
- Nieograniczona ilość plików
- Pliki można przechowywać w kilkunastu węzłach rozsianych po całym świecie. Można wybrać region ze względu na czas dostępu, koszt i szczegóły prawne.
- Dostęp do plików może być publiczny lub prywatny, możliwość organizowania plików w kubły (bucket), do których dostęp możemy nadawać użytkownikom według szczegółowych polityk dostępu.
- Możliwość skorzystania z integracji REST i SOAP pozwalające na dowolną integrację i rozwój istniejących serwisów
1. Tworzenie konta AWS, dysku S3, tworzenie użytkownika i generowanie Access Key
Do zabawy potrzebne nam będzie oczywiście konto w Amazon Web Services (AWS). To zakładamy na stronie: https://aws.amazon.com/
Po zalogowaniu do konsoli i podaniu danych do karty kredytowej należy przejść do działu S3.
Warto stworzyć własny „bucket” i nadać mu jakąś sensowną nazwę.
Teraz przechodzimy do Identity and Access Management (IAM) gdzie zarządzamy danymi dostępowymi, których używamy do komunikowania się z interfejsem S3. Tworzymy użytkownika, dla ułatwienia nadajemy mu wszystkie możliwe uprawnienia. Klikamy w zakładkę Security credentials i tworzymy nowy Access Key.

2. Instalacja AWS SDK dla PHP
Instalujemy Amazon SDK, czyli całe środowisko umożliwiające komunikację z usługami Amazona. W tym celu najprościej włączyć konsolę SSH i jeżeli jeszcze nie mamy, instalujemy sobie Composera:
curl -sS https://getcomposer.org/installer | php
Dzięki kolejnej komendzie instalujemy najnowszą wersję AWS SDK dla PHP:
php -d memory_limit=-1 composer.phar require aws/aws-sdk-php
Jest też oczywiście alternatywna metoda instalacji za pomocą paczki zip dostępnej na stronie : https://aws.amazon.com/sdk-for-php/
4. Właściwy kod aplikacji
Krok 1: Na początku dołączamy autoloader:
require '/ścieżka/do/vendor/autoload.php';
Krok 2: Dołączamy klienta S3:
use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception;
Krok 3: Dołączamy nazwę dysku i deklarujemy sobie zmienne przechowujące klucz i secret otrzymany z IAM:
$bucketName = 'mansfeld'; $IAM_KEY = 'ABCDEFGHIJK123456'; $IAM_SECRET = 'abcdef1234567890abcdef1234567890';
Krok 4: Próba połączenia z AWS. Tutaj trzeba zwrócić uwagę na region – musi odpowiadać temu który użyliśmy przy tworzeniu dysku S3. Jeżeli wystąpi jakiś wyjątek dla uproszczenia korzystamy z funkcji die():
try { $s3 = S3Client::factory( array( 'credentials' => array( 'key' => $IAM_KEY, 'secret' => $IAM_SECRET ), 'version' => 'latest', 'region' => 'eu-central-1' ) ); } catch (Exception $e) { die("Error: " . $e->getMessage()); }
Krok 5: Próba wysłania pliku:
try { $file = "ścieżka/do/pliku.jpg"; $name = "nazwapliku.jpg"; $s3->putObject( array( 'Bucket'=>$bucketName, 'Key' => 'ścieżka/do/zapisania/pliku/'.$name, 'SourceFile' => $file, 'StorageClass' => 'REDUCED_REDUNDANCY', 'ContentType' => "image/jpg" /* Tutaj można dołączyć dodatkowe meta np. nagłówki Cache-Control, ACL itd... wszystko jest w dokumentacji */ ) ); } catch (S3Exception $e) { die('Error:' . $e->getMessage()); } catch (Exception $e) { die('Error:' . $e->getMessage()); }
No i to wszystko!
Dodatek 1: Przydatne komendy w AWS CLI
Podczas pracy z AWS S3 przydatne mogą się okazać komendy AWS CLI do synchronizowania, czyli do wysyłania i pobierania całych folderów i podfolderów z plikami.
Aby pobrać cały kubeł wystarczy poniższa komenda.
aws s3 sync s3://nazwa_kubla/ c:/folder/
Aby wysłać pliki z lokalnego systemu plików wystarczy odwrócić kolejność podawania ścieżek:
aws s3 sync c:/folder/ s3://nazwa_kubla/
O tym jak używać AWS-CLI możesz sprawdzić w dokumentacji: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html
Podsumowanie
Teraz nic nie stoi na przeszkodzie by np. taki dysk S3 połączyć sobie z usługą CloudFront i mamy rozwiązanie do serwowania plików statycznych najwyższej klasy. Wdrożenie tego typu rozwiązań we własnej aplikacji to przede wszystkim oszczędność. Dla mnie to spora satysfakcja, że korzystam z rozwiązań z jakich korzystają największe światowe aplikacje w tym sam sklep Amazona i np. Instagram 🙂
Źródła:
Oficjalna dokumentacja AWS SDK: https://aws.amazon.com/documentation/sdk-for-php/
Odpowiedz lub skomentuj