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.

Integracja PHP z Amazon S3 - 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/

Oceń artykuł na temat: Amazon S3 – Integracja AWS SDK z PHP
Średnia : 4.7 , Maksymalnie : 5 , Głosów : 14