Jakiś czas temu zajmowaliśmy się deployem aplikacji na OpenShift. Dzisiaj zrobimy to samo, ale na najpopularniejszej chmurze, czyli AWS.

Sam deployment, podobnie jak w przypadku OpenShift, zrobimy za pomocą linii komend. Na tym etapie pominiemy opisywanie poszczególnych komponentów AWS, a skupimy się na tym, żeby nasza aplikacja działała w chmurze.

Aplikacja

Omówmy sobie najpierw aplikacje, którą będziemy wrzucać do chmury. Aplikacja znajduję się w tym miejscu. Jest to, podobnie jak w przypadku aplikacji, którą wrzucaliśmy na Openshift, najprostsza aplikacja na SpringBoocie z jednym kontrolerem RESTowym. Jedyną doatkową rzeczą, którą musimy zrobić to dodanie pliku application.properties, w którym dodajemy następującą linię.

Elastic Beanstalk wymaga, aby aplikacja była dostępna na porcie 5000, a domyślnym portem dla aplikacji SpringBoot jest port 8080. Dodając powyższą linię w konfiguracji dajemy możliwość wstrzyknięcia wartości tej własności z zewnątrz.

Rejestracja

Pierwszym krokiem, który musimy zrobić jest oczywiście rejestracja w serwisie Amazona. Samo założenie konta jest darmowe. Płacimy jedynie za używanie usług AWSa. Na szczęście część funkcjonalności jest darmowe do pewnego zużycia transferu czy innych zasobów. I ta darmowa część powinna nam starczyć do deployu prostej aplikacji 🙂

Command Line Interface

Skoro mamy obsłużyć deployment przy pomocy linii komend to zdecydowanie przyda nam się CLI dla AWS, a konkretniej mówiąc Elastic Beanstalk CLI. Elastic Beanstalk jest usługą w ramach AWS, na którą będziemy deployować naszą aplikację.

Wchodzimy na tę stronę, a następnie korzystamy z załączonej instrukcji do instalacji EB CLI. W telegraficznym skrócie:

  1. Klonujemy repozytorium EB CLI
    git clone https://github.com/aws/aws-elastic-beanstalk-cli-setup.git
  2. Instalujemy EB CLI przy pomocy następującej komendy:
    .\aws-elastic-beanstalk-cli-setup\scripts\bundled_installer

I to w teorii powinno wystarczyć.

W praktyce wystąpił u mnie następujący problem:
No module named 'virtualenv'

Na szczęści w intrukcji mamy dział Troubleshooting, który pomoże nam w rozwiązaniu naszych problemów 🙂

W moim przypadku trzeba byłoby wykonać poniższe polecenia:
pip uninstall -y virtualenv
pip install virtualenv
python .\aws-elastic-beanstalk-cli-setup\scripts\ebcli_installer.py

Po tych ciężkich bojach powinniśmy mieć zainstalowane Elastic Beanstalk CLI.

Dla sprawdzenia wywołajmy następujące polecenie w linii komend:

W odpowiedzi powinniśmy uzyskać informacje o wersji zainstalowanej biblioteki.

AWS Secret Access Keys

Nadeszła pora na uwierzytelnienie w AWS. Będziemy robić to za pomocą sekretnych kluczy wygenerowanych w AWSie. Jest to rozwiązanie zdecydowanie bezpieczniejsze niż podawanie hasła bezpośrednio do naszego pliku konfiguracyjnego.

Aby stworzyć parę Access key ID – Secret Access Key musimy udać się na tę stronę i wybrać zakładkę Access keys.

Następnie klikamy Create New Access Key i otrzymujemy naszą parę.

create Access key ID - Secret Access Key pair
Tworzenie nowej pary Access key ID – Secret Access Key

Pamiętajmy, że jest to jedyny moment kiedy możemy skopiować wartość Serect Access Key.

Access key ID - Secret Access Key created
Jedyny moment kiedy możemy skopiować wartość Serect Access Key

Konfiguracja EB

Przyszła pora stworzenie pliku konfiguracyjnego dla Elastic Beanstalk.

Przechodzimy do katalogu z naszą aplikacją i wykonujemy następujące polecenie:

W pierwszej kolejności zostaniemy poproszeni o wybór regionu, w którym ma zostać umieszczona nasza aplikacja.

Region w AWS jest miejsce gdzie fizycznie znajdują się serwery. Jak widać na liście Amazon posiada swój sprzęt w naprawdę wielu miejscach 🙂 Dla naszych potrzeb wybór konkretnego regionu nie jest specjalnie istotny, ale wybierzmy region, który znajduje się najbliżej nas – eu-west-2 : EU (London). W moim przypadku jest to region nr 16.

W następnym kroku będziemy musieli podać informacje o AWS Secret Keys, które wygenerowaliśmy chwilę wcześniej.

Podajemy nasze klucze i idziemy dalej.

Kolejny krok to miejsce gdzie musimy podać nazwę naszej aplikacji.

Możemy pozostać przy domyślnej nazwie. Zatwierdzamy ją i idziemy do kolejnego kroku.

Teraz musimy wybrać język naszej aplikacji.

Wybieramy oczywiście Java i zatwierdzamy.

Następnie dostaniemy pytanie o wersje Javy.

Wybieramy zatem pożądaną wersje Javy, w naszym przypadku Java 8 🙂

Teraz dostaniemy pytanie o to czy chcemy kontynuować z CodeCommit.

CodeCommit jest serwisem kontroli wersji dostarczonym przez AWS. My nie chcemy z niego korzystać w tym momencie, więc wybieramy opcję domyślną, czyli ‚n’.

Kolejne pytanie jest o konfiguracje SSH.

Wybieramy ‚Y’ po czym będziemy musieli wybrać istniejącą parę kluczy lub stworzyć nową.

Jeżeli mamy potworzone klucze to zostaną one wyświetlone, żebyśmy mogli z nich skorzystać. Jeżeli nie, to pojawi się jedynie opcja z tworzeniem nowej pary kluczy. Podejmujemy wybór i zatwierdzamy.

W tym momencie w katalogu naszego projektu został wygenerowany następujący plik: .elasticbeanstalk\config.yml, który będzię wyglądał w następujący sposób:

Jak możemy zobaczyć jest to plik, który zawiera głównie rzeczy, które przed chwilą konfigurowaliśmy.

Budowanie i JAR do chmury

Zbudujmy teraz naszą aplikacje. To, na czym nam dokładnie zależy to uzyskania JARa, który będziemy deployować. Wykonajmy zatem następujące polecenie mavenowe:

To powinno zbudować nam naszą paczkę, którą znajdziemy pod tą lokalizacją: target\hello-world-0.0.1-SNAPSHOT.jar.

W tym momencie musimy delikatnie zmodyfikować plik konfiguracyjny EB i dodać informacje o tym, gdzie znajduje JAR, który będzie deployowany. Robimy to przy pomocy takiego parametru:

Więc nasz plik w tym momencie będzie miał taką postać:

Tworzenie instancji i deploy

W końcu przyszedł moment, kiedy będziemy mogli stworzyć instancje EB i wrzucić na nią naszą aplikację.

W pierwszej kolejności stwórzmy środowisko Elastic Beanstalka. Do tego celu wykorzystamy poniższą komendę:

Dostaniemy pytania o nazwę środowiska oraz DNS CNAME. Obie wartości możemy w tym możemy zostawić domyślne.

Po zatwierdzeniu nastąpi tworzenie środowiska oraz upload naszej aplikacji. Czynność ta może potrwać kilka minut 🙂

Gdy akcja się zakończy nasza aplikacja powinna być zdeployowana i gotowa do użytku 🙂

Aby to sprawdzić wystarczy, że wykowołamy poniższą komendę w terminalu:

Powinna nam się otworzyć nasza przeglądarka z adresem gdzie nasza aplikacja została zdeployowana, a z naszej aplikacji powiniśmy dostać ciepłe przywitanie 🙂

Powitanie z naszej aplikacji

Podsumowanie

Dzisiaj przebyliśmy dość długą drogę, aby zdeployować naszą aplikację na AWS. Na szczęście droga ta zakończyła się pełnym sukcesem 🙂

Na pierwszy rzut oka można stwierdzić, że deployment aplikacji wymaga trochę więcej konfiguracji niż w przypadku Opensfita, ale musimy pamiętać też, że AWS dostarcza nam o wiele większą funkcjonalność.