W tym samouczku chciałbym pokazać, jak wdrożyć przykładową aplikację Rails przy użyciu usługi Amazon Elastic Container Service (ECS).
Utwórzmy go, uruchamiając rails new sample-rails-appa następnie generując podstawową akcję kontrolera rails g controller Welcome index i ustawienie tras do ścieżki głównej jako `root to: welcome#index".
Naszym celem jest wdrożenie tej strony powitalnej przy użyciu ECS.
Utwórz repozytorium za pomocą Amazon Elastic Container Registry (ECR)
Amazon ECR to rejestr kontenerów. Będziemy go używać do przechowywania obrazów naszych aplikacji i pobierania ich z niego, aby działały na ECS.
Przejdź do Panel AWSszukać Elastyczny pojemnik Rejestr i kliknij Rozpocznij. Zobaczysz poniższy ekran:
Utworzymy prywatne repozytorium i nadamy mu nazwę sample-rails-app.
Repozytorium istnieje, ale jest puste. Chcemy, aby zawierało obraz naszej aplikacji. To jest następny krok.
# rzuca błędy, jeśli Gemfile został zmodyfikowany od czasu Gemfile.lock
RUN bundle config --global frozen 1
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY .
CMD ["rails", "server", "-b", "0.0.0.0"]
Następnie powinniśmy utworzyć obraz i przesłać go do repozytorium ECR.
Zanim to nastąpi, wstępnie skompilujmy zasoby za pomocą `rails assets:precompile`.
Teraz przejdź do utworzonego repozytorium. W górnej części ekranu zobaczysz ikonę Wyświetl polecenia push ze szczegółowymi informacjami, jak to zrobić.
W moim przypadku (Linux), uruchamiam go z tymi instrukcjami AWS:
Upewnij się, że Twój użytkownik jest uprawniony do wykonywania tej operacji. Dodałem politykę AmazonElasticContainerRegistryPowerUser do mojego użytkownika, która wygląda następująco:
Chcę, aby świat zewnętrzny mógł łączyć się tylko z moim Application Load Balancer. Będzie on przekazywał ruch do kontenerów uruchomionych wewnątrz naszego klastra ECS.
Ustaw jego nazwę na sample-rails-app-albUżyj domyślnej VPC i wybierz wszystkie jej podsieci.
Pozostaje nam Grupy zabezpieczeń i Odbiorniki i routing sekcje.
Grupy zabezpieczeń
Utworzymy nową grupę zabezpieczeń dla naszego load balancera. Działa ona jak firewall; ustawimy reguły dla ruchu przychodzącego i wychodzącego. Chcemy akceptować ruch przychodzący http (port TCP 80) i zezwalać na cały ruch wychodzący.
Aby to zrobić, kliknij przycisk "Utwórz nową grupę zabezpieczeń" link.
W sekcji "Podstawowe szczegóły", ustaw nazwę i opis, pozostaw domyślny VPC.
W moim przypadku - nazwa: "sample-rails-app-alb-sg", opis: "http z zewnątrz, wszystko od wewnątrz"
Dodaj regułę przychodzącą z typem: HTTP i Źródło: Anywhere-IPv4. Pozostaw reguły wychodzące bez zmian.
Kliknij tworzenie grupy zabezpieczeńNastępnie wróć do zakładki, w której tworzyłeś Application Load Balancer, odśwież grupy zabezpieczeń i dodaj tę, którą właśnie utworzyliśmy, usuń domyślną.
Odbiorniki i routing
W tej sekcji zdefiniujemy, gdzie chcemy, aby load balancer przekazywał ruch. Pozostawić SłuchaczProtokół i Port jako HTTP i 80, ponieważ dokładnie tego chcemy, i kliknij "Tworzenie grupy docelowej" link.
Ustaw nazwę na "sample-rails-app-alb-tg". Jedyną zmianą jest numer portu. Przekażemy go do portu 3000, ponieważ jest to port dla naszej aplikacji Rails. Zignoruj następny krok (Zarejestrowane cele) i utwórz grupę docelową.
Teraz wróć do zakładki, w której tworzyliśmy Application Load Balancer, odśwież grupę docelową i wybierz tę, którą właśnie utworzyliśmy.
Mamy już gotowy Application Load Balancer, teraz pobawmy się ECS.
Tworzenie klastra ECS
Pojawi się wiele przerażających terminów - klaster, zadania, definicja zadań, usługi. Aby to uprościć, pomyśl o klastrze jako o grupie serwerów (instancji EC2). Na każdym z nich uruchamiamy zadania, które są po prostu grupą kontenerów działających razem. Definicja zadania opisuje, które kontenery znajdują się w danej grupie i jakie zasoby chcemy im przydzielić (pamięć, procesor). Usługi mają oko na te zadania, aby upewnić się, że zawsze jest odpowiednia liczba zdrowych zadań uruchomionych w naszym klastrze.
Mając to na uwadze, stwórzmy nasz klaster.
Przejdź do strony ECS i kliknij przycisk Klastry link i Utwórz klaster przycisk. Wybierz opcję "EC2 + Linux Networking" jeden i kliknij Następny krok.
Ustaw nazwę klastra na "sample-rails-app-cluster". Wybierz typ instancji EC2, ja wybrałem t2-micro, ponieważ jest on dostępny w ramach planu Free Tier. Pozostaw liczbę instancji jako 1.
W sekcji networking użyj domyślnego VPC i wybierz wszystkie jego podsieci. Klikamy create, czekamy chwilę i voila, mamy utworzony nowy klaster ECS.
Definicja zadania
Kliknij przycisk Definicje zadań link, a następnie Utwórz nową definicję zadania przycisk. Wybierz opcję EC2 i kliknij Następny krok. Aplikacja, którą zamierzamy uruchomić, jest bardzo prosta, więc potrzebujemy tylko kilku opcji.
Zestaw Definicja zadania nazwa do "sample-rails-app", a następnie przejdź bezpośrednio do Definicje pojemników i kliknij "Dodaj pojemnik". Nazwij kontener jako "sample-rails-app" i ustaw lokalizację obrazu w formacie "repository-url/image:tag". W nowej karcie przeglądarki przejdź do ECR, aby skopiować identyfikator URI obrazu. W moim przypadku było to: "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
Ustaw limit pamięci na zalecane 300-500 MB. Teraz najtrudniejsza rzecz - mapowanie portów.
Nasza aplikacja działa wewnątrz kontenera na porcie 3000. Więc wpisz 3000 jako port kontenera. Wprowadzimy 0 jako port hosta, co w zasadzie oznacza, że wybierze on losowy port. Na szczęście nasz Application Load Balancer będzie znał to mapowanie portów i będzie w stanie prawidłowo kierować ruchem. Możemy nawet uruchomić wiele zadań na tej jednej instancji.
Dodaj zmienną środowiskową RAILS_ENV i ustawić go na produkcja.
Teraz kliknij Dodaj aby dodać naszą definicję kontenera i kliknij Utwórz aby zakończyć konfigurację definicji zadania.
Usługa
Mamy nasz klaster, load balancer i definicję zadań. Teraz musimy jakoś uruchomić te zadania wewnątrz naszego klastra. Jest to zadanie usług. Przejdź do nowo utworzonego klastra, wybierz opcję Nasze Usługi i kliknij przycisk Utwórz przycisk.
Ustaw typ uruchomienia na EC2, dodaj nazwę "sample-rails-app-service". Ustaw liczbę zadań na 1 i kliknij przycisk Następny krok. Na tej stronie należy wybrać przycisk radiowy Application Load Balancer i wybrać dla niego istniejącą rolę IAM. W sekcji "Kontener do równoważenia obciążenia" powinieneś już wprowadzić poprawny kontener "sample-rails-app:0:3000", a następnie kliknąć "Dodaj do równoważenia obciążenia".
Dla "Production listener port" wybierz 80:HTTP; jako nazwy grupy docelowej użyj tej, którą utworzyliśmy wcześniej - "sample-rails-app-alb-tg" i kliknij Następny krok. Odejść Automatyczne skalowanie kliknij przycisk Następny krok i Utwórz usługę.
Aktualizacja grupy zabezpieczeń ECS
Możesz przejść do strony utworzonego klastra i sprawdzić Zadania zakładki, powinno być uruchomione jedno zadanie. Usługa została uruchomiona. Teraz przejdź do strony usługi EC2, kliknij Load Balancers i zobacz szczegóły naszego Application Load Balancer. Powinna się tam znajdować jego nazwa DNS. Skopiuj ją i otwórz w przeglądarce. Powinna ona przekierować do naszej aplikacji. Niestety, otrzymujemy komunikat "Limit czasu bramki 504" błąd.
Problem tkwi w grupie zabezpieczeń naszego klastra. Jej reguły przychodzące nie zezwalają na ruch przychodzący z load balancera. Aby to naprawić, należy wrócić do panelu EC2 i kliknąć na ikonę Grupy zabezpieczeń link. Istnieje nowa grupa, która została utworzona podczas procesu tworzenia klastra. Powinna mieć nazwę zaczynającą się od "EC2ContainerService-sample-rails-app-cluster". Kliknij na nią i edytuj reguły przychodzące. Ponieważ chcemy zezwolić na ruch z naszej VPC, przejdź do panelu Amazon VPC i sprawdź, jaki jest Twój VPC IPv4 CIDR. Ustaw typ reguły na "Cały ruch" i źródło do IPv4 CIDR. Zapisz tę regułę i spróbuj załadować nazwę DNS balancera.