• Ogólne
  • Dla Architektów
  • Bezpieczeństwo

Budowanie prostego schedulera serwerów EC2

11 sierpnia 2017Tomasz StachlewskiDla Architektów

W dzisiejszym poście przyjrzymy się jednemu z najpopularniejszych zagadnień związanych z chmurą, polegającym na automatyzacji procesu uruchamiania i zatrzymywania serwerów. Czemu chcemy je zatrzymywać? Bo na tym właśnie polega chmura! Wyłączamy gdy nie są potrzebne, a uruchamiamy gdy są potrzebne – ponieważ ostatecznie płacimy jedynie za czas gdy działają a tego im mniej tym mniejsze są nasze rachunki. Oczywiście nie każdy serwer, na którym zainstalowana jest nasza aplikacja możemy od tak po prostu wyłączyć – aplikacji produkcyjnych nie będziemy chcieli zatrzymać na noc, ale np. już środowiska developerskie? Czemu nie…

Sposobów automatyzacji procesu uruchamiania serwerów można wyobrazić sobie kilka, my wybierzemy jeden z najprostszych do implementacji, polegających na wykorzystaniu usługi AWS Lambda. Diagramy poniżej prezentują poglądowy schemat całości procesu.

Proces wyłączania serwerów będzie wyglądał następująco: (1) Na wskutek konfiguracji wyrażenia cronowego (jak często? Kiedy?) – będzie uruchamiana funkcja Lambda „STOP” – która będzie wyszukiwała (2) serwery otagowane zdefiniowanym przez nas tagiem – w tym przypadku Env : DEV. Następnie (3) serwery te będą zatrzymywane.

W sposób analogiczny utworzymy również drugą funkcję Lambda „START”, która tym razem wyszukane serwery będzie uruchamiała ponownie.

KROK 1: Utworzenie roli IAM i nadanie uprawnień

Funkcje Lambda, który będą uruchamiały i zatrzymywały nasze serwery muszą mieć do tego uprawnienia. W tym celu z ramach usługi IAM należy utworzyć nową rolę, którą będziemy przyporządkowywać do Lambd. Aby ją utworzyć należy wykonać następujące kroki:

  1. Przechodzimy do usługi IAM
  2. Przechodzimy od zakładki „Roles” gdzie wybieramy opcję „Create new role”
  3. W pierwszym kroku wizarda przyporządkowujemy funkcję do usługi „AWS Lambda”
  4. W drugim kroku wizarda wybieramy uprawnienie. W celu uproszczenie całego procesu wybierzmy politykę o nazwie ‘AmazonEC2FullAccess’ (w rzeczywistości należało by stworzyć własną politykę z uprawnieniem jedynie do uruchamiania i zatrzymywania serwerów).
  5. Nazwijmy nową rolę „EC2SchedulerRole”

Jeśli wszystko przebiegło pomyślnie, powinieneś otrzymać następujący widok:

KROK 2: Utworzenie funkcji Lambda „Stop”

Kolejnym krokiem będzie utworzenie funkcji Lambda, której zadaniem będzie zatrzymywanie wszystkich serwerów oznaczonych konkretnym tagiem – o określonej godzinie. W tym celu przejdź do usługi Lambda i utwórz nową funkcję, skonfiguruj ją w następujący sposób:

  1. Pamiętaj o zweryfikowaniu regionu w którym tworzysz swoją funkcję.
  2. Jako trigger (wyzwalacz) funkcji wybierz opcję „CloudWatch Events” – która pozwala na zdefiniowanie wyrażenia cronowego, według którego AWS będzie samodzielnie uruchamiał daną funkcję. Skonfiguruj ją jak na screenie poniżej, zwróć uwagę na zawartość pola „schedule expression” – które definiuje, że dana funkcja ma być uruchamiania codziennie o godzinie 17tej (czasu UTC)
  1. Na kolejnym oknie wizarda, skonfiguruj pierwszą sekcję funkcji według danych z poniższego zrzutu.
  1. W sekcji kodu wpisz zawartość poniższego skryptu.
import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):

    #Looking for instances, which has got tag 'Env' with value 'DEV'
    reservations = ec2.describe_instances(
        Filters=[
            {
                'Name': 'tag:Env',
                'Values': [
                    'DEV',
                ]
            },
        ]
    )['Reservations']

    #Single reservation corresponds to single start instance command.
    #Usually there will be only one instanace for every reservation, but can be more
    instances = sum(
        [
            [i for i in r['Instances']]
            for r in reservations
        ], [])

    #Iterating through instances and retrieving their EBS volumes
    for instance in instances:
        ec2.stop_instances(InstanceIds = [instance['InstanceId']])
        print "Stopping instance ( " + instance['InstanceId'] + ")"
  1. W sekcji uprawnień wybierz uprawnienie, które utworzyliśmy w kroku pierwszym.
  1. W sekcji „Advances Settings” zmodyfikuj maksymalny czas działania funkcji, zwiększając go do 5 minut.
  2. Zatwierdź i utwórz funkcję.

KROK 3: Utworzenie funkcji Lambda „Start”

Kolejnym krokiem będzie utworzenie drugiej funkcji Lambda, której zadaniem będzie uruchamianie serwerów otagowanych tagiem: Evn:DEV codziennie o godzinie 8 rano. (UTC) W tym celu należy powtórzyć wszystkie punkty jak w kroku drugim, z drobnymi różnicami:

  1. Podczas konfiguracji triggera funkcji, jako wyrażenie cronowe należy podać wartość cron(0 8 * * ? *)
  2. Nazwa naszej funkcji to: „EC2Scheduler_START”
  3. Skrypt naszej funkcji przyjmie następująco postać:
import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):

    #Looking for instances, which has got tag 'Env' with value 'DEV'
    reservations = ec2.describe_instances(
        Filters=[
            {
                'Name': 'tag:Env',
                'Values': [
                    'DEV',
                ]
            },
        ]
    )['Reservations']

    #Single reservation corresponds to single start instance command.
    #Usually there will be only one instanace for every reservation, but can be more
    instances = sum(
        [
            [i for i in r['Instances']]
            for r in reservations
        ], [])

    #Iterating through instances and retrieving their EBS volumes
    for instance in instances:
        ec2.start_instances(InstanceIds = [instance['InstanceId']])
        print "Stopping instance ( " + instance['InstanceId'] + ")"

I na tym koniec. Nasz mechanizm do automatycznego uruchamiania i zatrzymywania serwerów jest gotowy. W istniejącej konfiguracji będzie uruchamiał się automatycznie codziennie o godzinie 8 (UTC) aby uruchomić serwery, które są oznaczone tagiem Env:DEV, oraz ponownie o godzinie 17tej (UTC) aby zatrzymać te serwery. Nic nie stoi na przeszkodzie aby go teraz zmodyfikować i dostosować do naszych potrzeb.

: EC2, I, IAM, Lambda, Scheduler
Tomasz Stachlewski
Architekt systemów IT na Polskę dla Amazon Web Services. Na co dzień doradza klientom w tworzeniu architektur systemów, które mają zostać zmigrowane lub utworzone w chmurze AWS i w pełni wykorzystywać możliwości jakie niesie ze sobą chmura. Doradza wielu wiodącym firmom (począwszy od startupów po korporacje) z różnych branż m.in. IT, telekomunikacja, finanse. Prowadzi szkolenia dla polskich i zagranicznych partnerów podczas których przekazuje w jaki sposób firmy powinny korzystać z chmury, jak powinna wyglądać ich droga z tradycyjnej infrastruktury do infrastruktury chmurowej, aby zmaksymalizować korzyści z tego płynące. Absolwent informatyki na Politechnice Łódzkiej oraz studiów podyplomowych z zarządzania projektami na SGH.

Related Articles

Wprowadzenie do AWS Cognito – konfiguracja środowiska programistycznego dla .NET

4 kwietnia 2017Robert Senktas

Spotkanie z kuzynką Atheną, wujkiem DynamoDB (TTL) i ciotką Lambdą. Ze strony rodziny Amazon AWS

8 marca 2017Adam Smolnik

CloudFormation i StackSets, łatwe zarządzanie na dużą skalę

13 września 2017Łukasz Dorosz

Najnowsze wpisy

  • Wiosenne porządki z AWS Glue cz.3 4 września 2018
  • Jak przyśpieszyć ładowanie zawartości stron WWW? 28 czerwca 2018
  • Wiosenne porządki z AWS Glue cz.2 22 czerwca 2018

Szkolenia AWS

  • Kursy wprowadzające
  • Dla Architektów
  • Dla Developerów
  • SysOps
  • DevOps
  • Big Data
  • Bezpieczeństwo

ACTION Centrum Edukacyjne

Znajdź nas na:

Facebook
LinkedIn
YouTube
RSS

Copyright by ACTION Centrum Edukacyjne Sp. z o.o.