Jak uruchomić i zatrzymać wystąpienie AWS EC2 na podstawie harmonogramu opartego na czasie

17

Czy istnieje prosty sposób na uruchamianie i zatrzymywanie instancji AWS EC2 o określonej godzinie każdego dnia? Mogłoby to zaoszczędzić sporo pieniędzy na moich serwerach programistycznych i testowych.

Tim
źródło

Odpowiedzi:

16

Aktualizacja

AWS wydało narzędzie o nazwie „ Harmonogram wystąpień ”, w tym pełne przewodnik konfiguracji, do którego prowadzi odnośnik z tej strony. Wygląda na ulepszenie harmonogramu EC2, który opisuję poniżej, z kilkoma dodatkowymi funkcjami, ale zasadniczo jest to ta sama rzecz.

Poniższy przewodnik nadal będzie działał, ale prawdopodobnie lepiej przyjrzeć się harmonogramowi instancji dla nowych instalacji.

Oryginalny post

AWS ma narzędzie o nazwie EC2 Scheduler, które zapewnia bardzo elastyczną kontrolę nad uruchamianiem i zatrzymywaniem instancji EC2.

Narzędzie pozwala zdefiniować domyślne czasy rozpoczęcia i zakończenia podczas konfiguracji narzędzia, które można zmienić później. Możesz wybrać, które instancje mają być kontrolowane, a Ty możesz określić różne czasy rozpoczęcia i zakończenia dla każdej instancji za pomocą znaczników.

Choć jest to świetne narzędzie, dokumentacja jest nieco niejasna i myląca. To tak, jakby dokumentację napisał inżynier, który napisał narzędzie i wie o nim wszystko, a nie pisarz techniczny.

Uwaga : jeśli masz opinie lub poprawki, komentarze są mile widziane. Jeśli masz pytanie oparte na tym, proszę rozpocząć własne pytanie.

Co to jest EC2 Scheduler

To narzędzie jest funkcją Lambda współpracującą ze zdarzeniami Cloudwatch i DynamoDB. Jest wdrażany za pomocą szablonu Cloudformation, który również konfiguruje niezbędne role i zasady IAM. Możesz przeczytać o architekturze tutaj .

Architektura harmonogramu AWS EC2

Rozlokowanie

Zacznij od przejścia do tej strony i kliknięcia „uruchom rozwiązanie”. W tej chwili bezpośredni link jest tutaj , ale może się zmienić.

Wybierz region, w którym chcesz wdrożyć zasoby u góry konsoli. Skrypt kontroluje instancje EC2 w dowolnym regionie, ale działa w jednym regionie.

Tagowanie instancji EC2

Jest to omówione w dokumentacji tutaj , ale nie jest tak proste, jak mogłoby być.

Możesz kontrolować, które wystąpienia są uruchamiane i zatrzymywane, oznaczając je.

Najprostszy przypadek wymaga oznaczenia każdego wystąpienia EC2, które chcesz uruchomić i zatrzymać zgodnie z harmonogramem. Aby to zrobić, znajdź instancję EC2 w konsoli, kliknij tagi i utwórz ten tag

Oznaczanie instancji EC2 dla programu planującego

Aby włączyć kopiowanie i wklejanie:

  • Klucz: harmonogram: ec2-startstop
  • Wartość: true

Jeśli chcesz, aby określona instancja była uruchamiana i zatrzymywana w innym harmonogramie, dołączasz dodatkowe informacje do klucza i wartości tagu. Na przykład jeśli chcesz, aby instancja zaczęła się o godzinie 1500 UTC i zatrzymała się o godzinie 2400 UTC we wtorek, czwartek i piątek, wprowadź następujące informacje.

Klucz: harmonogram: ec2-startstop: late Wartość: 1500; 2400; utc; wt., Czw., Pt.

Zauważ, że słowo „późno” może być dowolnym ciągiem, „późno” nie ma specjalnego znaczenia.

Za pomocą tego narzędzia możesz przeliczyć UTC na czas lokalny .

Możesz użyć edytora znaczników do zbiorczego tworzenia znaczników. To może łatwiej skonfigurować znaczniki zbiorcze, co może być przydatne w przypadku różnych ustawień dla deweloperów, testów i produkcji. Wątpię jednak, czy użyłbyś tego w produkcji.

Parametry CloudFormation

Po uruchomieniu szablonu CloudFormation musisz wprowadzić wiele parametrów. Większość możesz pozostawić domyślnie. Oto niektóre z najważniejszych parametrów

  • Nazwa stosu: nazwij to jak chcesz. Tak to się nazywa w CloudFormation.
  • Niestandardowa nazwa znacznika: jest to „klucz” znacznika umieszczonego względem instancji EC2. Pozostaw wartość domyślną, chyba że masz dobry powód lub potrzebujesz wielu instalacji.
  • Domyślny czas rozpoczęcia / zatrzymania: Domyślny czas UTC do uruchomienia i zatrzymania instancji
  • DynamoDB: ustawienia są przechowywane w DynamoDB. Możesz zmienić nazwę tabeli i tym podobne. Ponieważ bezpłatna warstwa DynamoDB nie wygasa, większość osób prawdopodobnie nie zostanie obciążona.
  • (drugi ekran) Uprawnienia - jest to czerwony śledź, patrz sekcja poniżej. Pozostaw to ustawienie domyślne i działaj jako administrator podczas próby skonfigurowania programu EC2 Scheduler.
  • Opcje powiadomień: uznałem, że warto skonfigurować powiadomienia SNS, aby sprawdzić, czy działa. Nie spędziłem czasu, aby dowiedzieć się, jak je wyłączyć, po prostu usunąłem go, ponownie uruchomiłem szablon Cloudformation, aby ponownie zainstalować.

Uprawnienia, zasady i role

Sekcja roli Uprawnienia / IAM szablonu CloudFormation to czerwony śledź - tzn. Jest w dużej mierze nieistotna. Określa tylko rolę używaną do uruchomienia skryptu CloudFormation, nie ma znaczenia dla tworzonych zasobów ani roli używanej podczas działania funkcji lambda. Z perspektywy czasu jest to oczywiste, ale nie było dla mnie oczywiste, kiedy zaczynałem.

Niezależnie od roli, którą uruchamiasz ten skrypt jako ta sama rola i uprawnienia wbudowane, są tworzone w IAM. Funkcja Lambda działa przy użyciu „roli harmonogramu ec2”, którą tworzy skrypt.

Poniżej zamieściłem moje zasady na wypadek, gdyby były przydatne dla każdego.

Zdarzenia i metryki CloudWatch

Jeśli chcesz zobaczyć dzienniki z funkcji Lambda, przejdź do Cloudwatch Events. Logowanie jest całkiem dobre. Istnieją również dane, więc możesz zobaczyć, kiedy działa, czas, itp.

Dodatkowy

Kod funkcji lambda jest dostępny na Github .

Zasady

Nie są to na ogół konieczne, ale mogą być dla kogoś, więc dołączę je.

Zasady dotyczące roli IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "iam:CreateRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "dynamodb:*",
                "lambda:*",
                "SNS:Publish",
                "events:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "S3:GetObject",
            "Resource": [
                "arn:aws:s3:::solutions-us-west-2",
                "arn:aws:s3:::solutions-us-west-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
            ]
        }
    ]
}

Polityka zaufania dla roli IAM

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Tim
źródło
Amazon zmienił od tamtej pory - „EC2 Scheduler został zastąpiony przez AWS Instance Scheduler”
Max Barraclough
Dzięki Max, zaktualizowałem odpowiedź, aby zawierała link. Jest dostarczany z pełnym przewodnikiem implementacji, więc nie sądzę, żebym musiał podać pełne instrukcje.
Tim
1
To niewiarygodne, jak lubią komplikować sprawy ...
Mehdi,
10

Jeśli chcesz tylko uruchamiać i zatrzymywać instancje, oto kolejne spojrzenie na to, które również korzysta z usługi Lambda. Zakłada się, że chcesz kontrolować określony identyfikator instancji. Możesz kontrolować wiele instancji, dodając więcej identyfikatorów oddzielonych przecinkiem. (np .: „i-3453453”, „i-45656745”). Identyfikator instancji można znaleźć w sekcji Instancje konsoli AWS.

W konsoli Lambda

  1. Otwórz konsolę AWS Lambda i wybierz opcję Utwórz funkcję.
  2. Wybierz autora od zera.
  3. Wprowadź nazwę swojej funkcji, na przykład „StopEC2Instances”.
  4. Jako środowisko wykonawcze wybierz Python 2.7
  5. Rozwiń menu rozwijane Rola i wybierz Utwórz niestandardową rolę. Spowoduje to otwarcie nowej karty lub okna w przeglądarce.
  6. Z menu rozwijanego Rola IAM wybierz opcję Utwórz nową rolę IAM i wprowadź nazwę roli, na przykład „lambda_start_stop_ec2”.
  7. Wybierz Wyświetl dokument zasad, Edytuj, a następnie wybierz OK po wyświetleniu monitu o przeczytanie dokumentacji. Zamień cały tekst w polityce na:

Kod poniżej

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}
  1. Wybierz Zezwalaj, aby zakończyć tworzenie roli i powrócić do konsoli AWS Lambda.
  2. Aby zatrzymać instancje, zamień cały tekst w edytorze kodów funkcji na następujący:

Kod poniżej

import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

Pamiętaj, aby zastąpić wartości regionu i instancji własnymi.

  1. Z menu rozwijanego Runtime wybierz Python2.7.
  2. W Ustawieniach podstawowych wprowadź 10 sekund dla funkcji Limit czasu.
  3. Wybierz Zapisz.
  4. Powtórz wszystkie kroki, aby utworzyć inną funkcję, która uruchomi instancje, ale następnie użyj tego skryptu Python do uruchomienia wszystkich:

Kod poniżej

import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

Zaplanuj funkcje

Tutaj utworzysz wydarzenie CloudWatch, które w nocy wyzwoli Twoją funkcję Lambda

  1. Otwórz konsolę Amazon CloudWatch.
  2. Wybierz Zdarzenia, a następnie wybierz Utwórz regułę.
  3. Wybierz Harmonogram w opcji Źródło zdarzenia.
  4. Wprowadź przedział czasu lub wyrażenie cron, które mówi Lambda, kiedy zatrzymać twoje instancje. Aby uzyskać więcej informacji na temat poprawnej składni, zobacz Składnia wyrażeń harmonogramu dla reguł.

Uwaga: Wyrażenia Cron są oceniane w UTC. Pamiętaj, aby dostosować wyrażenie do preferowanej strefy czasowej. Oto przykład, w którym funkcja będzie uruchamiana codziennie o godzinie 08:00 GMT / UTC):

0 08 * * ? *
  1. Wybierz Dodaj cel, a następnie wybierz funkcję Lambda.
  2. W polu Funkcja wybierz funkcję Lambda, która zatrzymuje Twoje wystąpienia.
  3. Wybierz Konfiguruj szczegóły.
  4. Wprowadź następujące informacje w podanych polach: W polu Nazwa wpisz znaczącą nazwę, na przykład „StopEC2Instances”. W polu Opis dodaj znaczący opis, na przykład „zatrzymuje instancje EC2 codziennie w nocy”. W polu Stan wybierz opcję Włączone.
  5. Wybierz Utwórz regułę.

Aby ponownie uruchomić instancje rano, powtórz te kroki i użyj preferowanego czasu rozpoczęcia. Jeśli chcesz wysłać wiadomość e-mail za każdym razem, gdy zawiodą funkcje, możesz ustawić temat SNS i skonfigurować wysyłanie tej wiadomości w obszarze Debugowanie w oknie tworzenia funkcji Lmbda.

Źródło tego wszystkiego można znaleźć tutaj: dokumentacja AWS

Netfed
źródło
Jak, u licha, możesz sprawić, by kod Pythona wyglądał dobrze w edytorze, tak jak się właśnie okazało?
netfed
Kliknij pomoc „?” i dowiesz się więcej o korzystaniu z formatowania przecen. serverfault.com/editing-help
jscott
1
To błąd w kodzie formatującym. Musisz umieścić zwykły tekst między różnymi formatowaniami - w tym przypadku blokiem kodu i blokiem numerowanym. Dlatego wstawiam „kod poniżej” - nie ma sensu we wszystkich miejscach, ale działa.
Tim
@Tim Dziękujemy za wyjaśnienie. Nie wiedziałem tego. Rozwiązał również formatowanie wyrażenia cron. Dzięki jeszcze raz.
netfed