Przejdź do treści

Jak automatycznie uruchomić EC2 w chmurze AWS?

How to automatically start EC2 in the AWS cloud

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

AWS-tworzenie roli IAM - create roles 2021

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.

aws create role2 2021

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.

aws create role2 policy 2021

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": "*"
        }
    ]
}
aws create role2 policy name

Teraz wystarczy, że odświeżysz listę polityk i odszukasz na liście tą, którą przed chwilą dodawałeś.

aws create role2 check start stop

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ę.

aws create role4

Session manager – planowanie uruchomienia

Gdy rola będzie gotowa, to przejdź do AWS Systems Manager i wybierz z menu po lewej State Manager.

state manager 2021

Kliknij Create association, dobrze jest podać nazwę, chociaż nie jest to wymagane.

state manager create association
state manager start ec2

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ć.

state manager start ec2 document
state manager start ec2 execution

Uwaga !! Jak wybierzesz instancje, to poniżej masz listę rozwijaną “AutomationAssumeRole”. Należy wybrać na niej rolę, którą stworzyłeś wcześniej.

role start stop ec2 instances

Na samym końcu w sekcji “Specify schedule” zdecyduj, kiedy chcesz automatycznie uruchomić instancję EC2 i kliknij “Create Association”

state manager start ec2 schedule

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.

AWS - IAM - create role - chose EC2

Gdy rola będzie gotowa, to możesz przypisać ją do maszyny EC2, na której będziesz wydawał polecenia uruchomienia innych maszyn.

EC2 security - add IAM Role

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.

aws create role for lambda 2021

Lambda – function

Teraz możesz przejść do tworzenia nowej funkcji Lambda. Otwórz usługę Lambda i kliknij “Create function”.

create lambda 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.

lambda start ec2 basic information

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 ” ).

lambda function code start ec2

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.

lambda start ec2 addrule 2021

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.

lambda start ec2 triger cloudwatch

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 🙂

lambda start ec2 function code

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.