W ostatnim artykule opisałem “jak w chmurze AWS automatycznie wykonać polecenie na maszynie EC2”. Teraz postanowiłem opisać temat od innej strony. Poniżej przedstawię 3 przykłady opisujące jak automatycznie uruchomić EC2 w chmurze AWS.
Coraz więcej osób pyta mnie o proste przykłady automatyzacji, więc proszę bardzo:)
Poniżej znajdziesz 3 przykłady, w jaki sposób można automatycznie uruchomić maszynę EC2 w chmurze AWS. Temat wydaje się prosty, ale jak to bywa, można go rozwiązać na wiele sposobów. Jak to mówią, wiele drug prowadzi do jednego celu. Ja użyję do tego session managera, poleceń CLi i Lambdy. Każdy może mieć własną drogę, używać tego, co bardziej lubi/ zna. Ważne, żeby wynik się zgadzał no i nie kosztował zbyt dużo 😉
Co ważniejsze, na podstawie tych prostych przykładów możesz automatyzować inne rzeczy. Warto się z nimi zapoznać i zacząć przygodę z automatyzacją, bo bardzo ułatwia życie 🙂
1) Session manager
Session manager – uprawnienia
Na początek trzeba stworzyć rolę, która będzie zatrzymywała i uruchamiała instancje EC2. Uwaga!! Jako usługę, która może używać roli, wybieramy System Manager.
Do roli trzeba dodać politykę, która na to pozwoli. Nie chcę dawać pełnych uprawnień do EC2, więc stworzę nową politykę z minimalnymi uprawnieniami. Polityka pozwoli tylko na uruchomienie, zatrzymanie i restart maszyny EC2.
Klikam na create policy i dodaję utworzonego poniżej JSONa. Następnie nadaję Tagi. Na ostatniej karcie podaję nazwę i opis do nowo tworzonej polityki.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:RebootInstances"
],
"Resource": "arn:aws:ec2:*:*:instance/*"
},
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
}
]
}
Teraz wystarczy, że odświeżysz listę polityk i odszukasz na liście tą, którą przed chwilą dodawałeś.
Możesz przejść dalej i nadać Tagi. Na końcu nadaj nazwę i zachęcam do stworzenia opisu, chociaż krótkiego. Dobrze jest wyrobić w sobie ten nawyk opisywania wszystkiego. W późniejszym czasie bardzo to ułatwia pracę. Jak dużo działasz w chmurze, to po paru miesiącach zapomnisz, po co tworzyłeś tę rolę.
Session manager – planowanie uruchomienia
Gdy rola będzie gotowa, to przejdź do AWS Systems Manager i wybierz z menu po lewej State Manager.
Kliknij Create association, dobrze jest podać nazwę, chociaż nie jest to wymagane.
W następnej sekcji zaznacz dokument o nazwie AWS-StartEC2Instance. Dla ułatwienia możesz wybrać proste wykonanie. Jeśli zaznaczysz “Show interactive instance picker” to otrzymasz listę maszyn EC2, wystarczy wybrać z listą te, które Cię interesują i je zaznaczyć.
Uwaga !! Jak wybierzesz instancje, to poniżej masz listę rozwijaną “AutomationAssumeRole”. Należy wybrać na niej rolę, którą stworzyłeś wcześniej.
Na samym końcu w sekcji “Specify schedule” zdecyduj, kiedy chcesz automatycznie uruchomić instancję EC2 i kliknij “Create Association”
2) Polecenie CLI
Na dowolnym serwerze możemy uruchomić polecenie, które pozwoli na uruchomienie innej maszyny. Żeby maszyna EC2 miała uprawnienia do uruchamiania innych maszyn, najlepiej jest dodać jej odpowiednią rolę. Przynajmniej ja często tak robię.
Rolę tworzymy w taki sam sposób jak za pierwszym razem, tylko teraz na początku jako “trusted entity” wybieramy EC2. Resztę konfigurujemy tak samo.
Gdy rola będzie gotowa, to możesz przypisać ją do maszyny EC2, na której będziesz wydawał polecenia uruchomienia innych maszyn.
Teraz najlepiej zalogować się na Maszynę EC2 i sprawdzić, czy masz aktualne aws cli. Wykonaj poniższe polecenie, żeby sprawdzić wersję.
aws --version
Jeśli jeszcze nie masz zainstalowanego aws cli, to zrób to według dokumentacji instalacji cli.
Ja zawsze przed dodaniem poleceń do crona testuję je. Tobie też to zalecam. Wydaj poniższe polecenie i sprawdź, czy wybrana przez ciebie instancja EC2 się uruchomiła. Oczywiście zamiast “ID_TWOJEJ_INSTANCJI” podaj ID maszyny, którą chcesz uruchomić.
aws ec2 start-instances --instance-ids ID_TWOJEJ_INSTANCJI
Jeśli wszystko działa prawidłowo, uruchom crontab i dodaj do niego komendę automatycznego startu wybranej EC2.
crontab -e
Poniższy wpis jest przykładowy. Będzie on uruchamiany od poniedziałku do piątku o 7:00. Oczywiście zamiast “ID_TWOJEJ_INSTANCJI” podaj ID instancji, którą chcesz uruchomić.
0 7 * * 1-5 /usr/local/bin/aws ec2 start-instances --instance-ids ID_TWOJEJ_INSTANCJI
Dobrym rozwiązaniem jest uruchomienie w crontabie skryptu. Może on zawierać polecenia uruchomienia kilku maszyn EC2. Skrypt można łatwo edytować i zarządzać nim z zewnątrz bez potrzeby logowania do maszyny.
3) AWS Lambda
Lambda – Role
Rolę tworzysz w taki sam sposób jak za pierwszym razem tylko teraz na początku jako “trusted entity” wybierz Lambda. Resztę konfiguruj tak samo.
Lambda – function
Teraz możesz przejść do tworzenia nowej funkcji Lambda. Otwórz usługę Lambda i kliknij “Create function”.
Następnie wybierz “Author from scratch“. Podaj nazwę funkcji i wybierz język, w którym chcesz napisać funkcje. W moim przypadku jest to Python 3.8. Poniżej w Execution role wybierz istniejącą rolę, którą wcześniej stworzyłeś specjalnie dla Lambdy. Nie trzeba dodawać żadnych zaawansowanych ustawień, można kliknąć od razu Create function.
Edytuj plik lambda_function.py tak, by miał poniższą zawartość. Oczywiście zamień ID_TWOJEJ_INSTANCJI na takie, jakie ma EC2, którą chcesz automatycznie uruchamiać. Jeśli chcesz uruchamiać więcej instancji, to podaj ich ID po przecinku ( Pamiętaj, żeby ID był w ” ).
Uwaga!! Jeśli twoja instancja jest w innym regionie niż eu-west-1 to także to popraw.
import boto3
region = 'eu-west-1'
instances = ['ID_TWOJEJ_INSTANCJI']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.start_instances(InstanceIds=instances)
print('started your instances: ' + str(instances))
Gdy skończysz kliknij Deploy.
Lambda – add trigger
Teraz możesz kliknąć Add trigger i zaplanować automatyczne uruchamianie swojej funkcji.
Z listy wybierz EventBridge (CloudWatch Evenst) i stwórz nową regułę. Podaj nazwę, opis i określ, kiedy chcesz automatycznie uruchamiać swoją funkcję. Ja ustawiłem start od poniedziałku do piątku o 7:00. Jak się z tym uporasz, to kliknij Add.
Wszystko gotowe. Jeśli otworzysz CloudWatch, to zobaczysz, że twoja nowa reguła została dodana. Tutaj mały błąd z mojej strony, bo podałem czas w GMT, czyli powinienem odjąć 2 godziny, żeby był zgodny z polskim i maszyny wystartowały o 7:00 🙂
W cloud watch także możesz śledzić metryki dotyczące prawidłowego wykonania funkcji, w razie potrzeby dodać jakąś akcję.
Podsumowanie
Jak widzisz, maszyny EC2 da się uruchamiać na różne sposoby. Powyżej przedstawiłem te, które uważam za przydatne i dobrze, żebyś o nich pamiętał. Uruchamianie maszyn to dopiero początek. Zamiast tego możesz wydawać dowolne polecenia i stworzyć naprawdę zaawansowaną automatyzację. Ograniczeniem jest tu głównie twoja wyobraźnia 😉 . Pamiętaj o odpowiednich uprawnieniach.
W kategorii AWS znajdziesz wszystkie moje artykuły dotyczące tej chmury. Zachęcam do przeczytania.