2013-09-08 15 views
5

Zainstalowałem serwer REST w instancji Amazon EC2. Skonfigurowałem także wiadro Amazon S3 do przechowywania wszystkich danych generowanych przez użytkowników podczas interakcji z interfejsem API. Główną przechowywaną informacją są obrazy. Użytkownicy mogą przesyłać obrazy, wykonując żądanie HTTP PUT za pomocą określonego adresu URL i poświadczeń. Żądanie PUT może zostać wykonane na instancji EC2, ponieważ przesyłanie musi być autoryzowane, a użytkownicy nie mogą uzyskać dostępu bezpośrednio do instancji S3. Kiedy EC2 otrzymuje ważną petycję PUT, używam AWS PHP SDK do przesłania obiektu do wiadra S3. Metoda, której używam to putObject. W tej pierwszej części uważam, że nie ma więcej alternatyw. Jednak aby umożliwić użytkownikom pobrać wcześniejsze przesłane mam dwie różne alternatywy:Amazon EC2, S3, REST API i jak poprawnie dostarczać treści użytkownikom

  • Pierwszy z nich jest zapewnienie użytkownikowi link z plikiem, który wskazuje do wiadra kluczu S3, jak pliki są przesyłane w sposób publiczny sposób. Użytkownik może pobrać obraz bezpośrednio z serwerów S3 bez interakcji z EC2.

  • Drugi to użycie interfejsu API REST uruchomionego w instancji EC2 do , aby zapewnić zawartość obrazu podczas wykonywania żądania HTTP GET. W tym przypadku powinienem użyć pakietu SDK AWS PHP, aby "pobrać" obraz z serwerów S3 i zwrócić go użytkownikowi. Zastosowana metoda byłaby getObject.

  • Innym możliwym rozwiązaniem wydaje się brudny do mnie, jest zapewnienie przekierowania HTTP z instancji EC2 do S3 wiadra url, ale potem, klient użytkownik powinna osiągnąć dwa połączenia do pobierania prosty obraz (a złe jeśli użytkownik pracuje na urządzeniach mobilnych).

Zaimplementowałem drugą opcję i wydaje się działać dobrze.

Moje pytanie brzmi:: jeśli dostęp do plików z instancji EC2 poprzez API REST, która pobiera zawartość z instancji S3, by przypuszczać, duży narzut nad bezpośredniego dostępu do plików z URL do serwerów S3. Obie instancje działają w tym samym regionie (IRLANDIA). Nie wiem, jak przelicza się transfer z S3 na EC2 (lub odwrotnie) pod względem przepustowości. Czy transfer z użytkownika S3-EC2 byłby wyliczony podwójnie niż użytkownik S3? Czy transfer ten odbywa się w niektórych lokalnych sieciach?

Preferuję drugi sposób, ponieważ mogę kontrolować dostęp do zawartości, log, który uzyskuje dostęp do każdego pliku, zmiana wiadra będzie przejrzysta dla użytkownika i tak dalej.

Dzięki!

Odpowiedz

2

Są to w rzeczywistości wiele pytań połączonych w jeden, ale postaram się na nie odpowiedzieć.

  1. Można skonfigurować przesyłanie, aby przejść bezpośrednio do S3, bez przechodzenia koryta instancję EC2, a jednocześnie jest w stanie uwierzytelnić przesyłanie zanim się to stanie. Przesyłanie byłoby wykonywane przy użyciu POST request bezpośrednio do S3. Aby to działało, musisz załączyć polisę i podpisać to żądanie (twój kod na EC2 wygenerowałby polisę i podpis). Aby uzyskać bardziej szczegółowy przewodnik, zobacz Browser Uploads to S3 using HTML POST.

  2. Proxying zawartości S3 przez twoją instancję EC2 z pewnością doda trochę narzut, ale efekt naprawdę zależy od skali aplikacji.Jeśli wykonasz kilka żądań na sekundę i masz małe pliki, narzut najprawdopodobniej nie będzie bardzo zauważalny. Jeśli masz setki żądań na sekundę, to proxying ich za pośrednictwem pojedynczej instancji EC2 tak naprawdę nie zadziała (nawet jeśli twoja instancja może obsłużyć twój ruch, możesz napotkać błędy S3 slow down).

  3. Połączenia między EC2 i S3 w tym samym regionie są wystarczająco szybkie, na pewno znacznie szybsze niż połączenia między zewnętrznym hostem i S3.

  4. Transfer danych w regionie nie jest obciążany, więc przelewy użytkownika S3-EC2 będą kosztować tyle samo, co przelewy S3-użytkownika.

Jeśli trzeba obsłużyć duży ruch, polecam korzystania Query String Authentication do generowania adresów do swoich podpisanych obiektów S3, i po prostu zrobić przekierowanie do tych podpisanych adresów URL z kodu pobierania.