Czy mogę automatycznie uruchamiać i zamykać moją instancję Amazon za pomocą Amazon API? Czy możesz opisać, jak można to zrobić? Najlepiej byłoby uruchamiać instancję i zatrzymywać ją w określonych odstępach czasu każdego dnia.
api
amazon-ec2
amazon-web-services
Makaron
źródło
źródło
Odpowiedzi:
Na wypadek, gdyby ktoś natknął się na to stare pytanie, obecnie możesz osiągnąć to samo, dodając harmonogram do grupy z automatycznym skalowaniem: zwiększ liczbę wystąpień w grupie z automatycznym skalowaniem do 1 w określonych momentach, a potem zmniejsz ją z powrotem do 0 .
Ponieważ ta odpowiedź ma wiele wyświetleń, pomyślałem, że zamieściłem link do bardzo pomocnego przewodnika na ten temat: Uruchamianie instancji EC2 w cyklicznym harmonogramie z automatycznym skalowaniem
źródło
Możesz spróbować bezpośrednio skorzystać z narzędzi API Amazon EC2. Potrzebujesz tylko dwóch poleceń: ec2-start-instances i ec2-stop-instances. Upewnij się, że zmienne środowiskowe, takie jak EC2_HOME, AWS_CREDENTIAL_FILE, EC2_CERT, EC2_PRIVATE_KEY, itp. Są odpowiednio skonfigurowane, a wszystkie poświadczenia AWS, pliki certyfikatów i kluczy prywatnych znajdują się we właściwej lokalizacji - więcej informacji znajdziesz w dokumentacji narzędzi AWS EC2 API.
Możesz najpierw przetestować polecenie ręcznie, a gdy wszystko działa dobrze, skonfigurować Unix crontab lub Scheduled Tasks w systemie Windows. Możesz znaleźć poniższy przykład dla pliku Linux / etc / crontab (nie zapominaj, że wszystkie wymienione powyżej zmienne środowiskowe muszą być obecne dla użytkownika „twoje konto”.
Jestem programistą projektu BitNami Cloud, w którym pakujemy narzędzia AWS (w tym te, o których wspomniałem) w darmowym, łatwym w użyciu instalatorze, który możesz wypróbować: stos pakietów BitNami CloudTools
źródło
Zalecam zapoznanie się z Przewodnikiem Pierwsze kroki EC2 , który pokazuje, jak zrobić to, czego potrzebujesz, używając narzędzi wiersza poleceń EC2. Możesz łatwo zapisać to w zadaniu cron (w systemie Linux / UNIX) lub zaplanowanym zadaniu w systemie Windows, aby wywołać polecenia uruchamiania i zatrzymywania w określonym czasie.
Jeśli chcesz to zrobić z własnego kodu, możesz użyć API SOAP lub REST; szczegółowe informacje można znaleźć w Podręczniku programisty .
źródło
Aby to zrobić, napisałem kod w Pythonie, korzystając z biblioteki Boto. Możesz to dostosować do własnego użytku. Upewnij się, że uruchamiasz to jako część zadania cron, a wtedy będziesz mógł uruchomić lub zamknąć tyle instancji, ile potrzebujesz podczas wykonywania zadań cron.
#!/usr/bin/python # # Auto-start and stop EC2 instances # import boto, datetime, sys from time import gmtime, strftime, sleep # AWS credentials aws_key = "AKIAxxx" aws_secret = "abcd" # The instances that we want to auto-start/stop instances = [ # You can have tuples in this format: # [instance-id, name/description, startHour, stopHour, ipAddress] ["i-12345678", "Description", "00", "12", "1.2.3.4"] ] # -------------------------------------------- # If its the weekend, then quit # If you don't care about the weekend, remove these three # lines of code below. weekday = datetime.datetime.today().weekday() if (weekday == 5) or (weekday == 6): sys.exit() # Connect to EC2 conn = boto.connect_ec2(aws_key, aws_secret) # Get current hour hh = strftime("%H", gmtime()) # For each instance for (instance, description, start, stop, ip) in instances: # If this is the hour of starting it... if (hh == start): # Start the instance conn.start_instances(instance_ids=[instance]) # Sleep for a few seconds to ensure starting sleep(10) # Associate the Elastic IP with instance if ip: conn.associate_address(instance, ip) # If this is the hour of stopping it... if (hh == stop): # Stop the instance conn.stop_instances(instance_ids=[instance])
źródło
Jeśli nie jest to krytyczne dla misji - prostą rzeczą jest zaplanowanie uruchamiania pliku wsadowego „SHUTDOWN” (Windows) o 3 nad ranem każdego dnia. Wtedy przynajmniej nie ryzykujesz przypadkowego pozostawienia niechcianej instancji działającej w nieskończoność.
Oczywiście to tylko połowa historii!
źródło
Firma, dla której pracuję, miała klientów regularnie pytających o to, dlatego napisaliśmy bezpłatną aplikację do planowania EC2 dostępną tutaj:
http://blog.simple-help.com/2012/03/free-ec2-scheduler/
Działa w systemach Windows i Mac, umożliwia tworzenie wielu dziennych / tygodniowych / miesięcznych harmonogramów i pozwala używać pasujących filtrów w celu łatwego dołączania dużej liczby instancji lub zawiera te, które dodasz w przyszłości.
źródło
Potok danych AWS działa dobrze. https://aws.amazon.com/premiumsupport/knowledge-center/stop-start-ec2-instances/
Jeśli chcesz wykluczyć dni od rozpoczęcia (np. Weekend), dodaj obiekt ShellCommandPrecondition.
W konsoli AWS / potoku danych utwórz nowy potok. Łatwiej jest edytować / importować definicję (JSON)
Umieść skrypt Bash do pobrania i wykonania jako warunek wstępny w swoim segmencie S3
Podczas aktywacji i uruchamiania potoku w dni weekendowe stan kondycji rurociągu konsoli AWS wyświetla wprowadzający w błąd „BŁĄD”. Skrypt bash zwraca błąd (wyjście 1), a EC2 nie jest uruchamiany. W dniach od 1 do 5 stan jest „ZDROWY”.
Aby automatycznie zatrzymać EC2 po zamknięciu biura, używaj komendy AWS CLI codziennie bez warunku wstępnego.
źródło
Aby to zrobić, możesz spojrzeć na Ylastic . Wydaje się, że alternatywą jest uruchomienie jednej maszyny, która zamyka / uruchamia inne wystąpienia przy użyciu zadania cron lub zaplanowanego zadania.
Oczywiście, jeśli potrzebujesz tylko jednej instancji, jest to drogie rozwiązanie, ponieważ jedna maszyna musi zawsze działać, a płacenie ~ 80 USD miesięcznie za jedną maszynę do wykonywania zadań cron nie jest opłacalne.
źródło
Automatyczne skalowanie jest ograniczone do przerywania wystąpień. Jeśli chcesz zatrzymać instancję i zachować stan serwera, najlepszym rozwiązaniem jest zewnętrzny skrypt.
Możesz to zrobić, uruchamiając zadanie w innej instancji, która działa 24 godziny na dobę, 7 dni w tygodniu lub możesz skorzystać z usługi innej firmy, takiej jak Ylastic (wspomniana powyżej) lub Rocket Peak .
Na przykład w C # kod zatrzymujący serwer jest całkiem prosty:
źródło
IMHO dodawanie harmonogramu do grupy z automatycznym skalowaniem jest najlepszym podejściem podobnym do chmury, jak wspomniano wcześniej.
Ale jeśli nie możesz zamknąć swoich instancji i użyć nowych, na przykład jeśli masz powiązane elastyczne adresy IP itp.
Możesz utworzyć skrypt Ruby, aby uruchamiać i zatrzymywać instancje na podstawie zakresu dat i godzin.
#!/usr/bin/env ruby # based on https://github.com/phstc/amazon_start_stop require 'fog' require 'tzinfo' START_HOUR = 6 # Start 6AM STOP_HOUR = 0 # Stop 0AM (midnight) conn = Fog::Compute::AWS.new(aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']) server = conn.servers.get('instance-id') tz = TZInfo::Timezone.get('America/Sao_Paulo') now = tz.now stopped_range = (now.hour >= STOP_HOUR && now.hour < START_HOUR) running_range = !stopped_range if stopped_range && server.state != 'stopped' server.stop end if running_range && server.state != 'running' server.start # if you need an Elastic IP # (everytime you stop an instance Amazon dissociates Elastic IPs) # # server.wait_for { state == 'running' } # conn.associate_address server.id, 127.0.0.0 end
Zajrzyj na amazon_start_stop, aby za darmo utworzyć harmonogram za pomocą Heroku Scheduler .
źródło
Mimo że istnieją sposoby na osiągnięcie tego za pomocą automatycznego skalowania, może to nie być odpowiednie we wszystkich przypadkach, ponieważ powoduje zakończenie instancji. Zadania Cron nigdy nie będą działać dla pojedynczej instancji (chociaż można go doskonale wykorzystać w sytuacjach takich jak zatrzymanie pojedynczej instancji i planowanie innych instancji podczas uruchamiania wielu instancji). Możesz użyć wywołań interfejsu API, takich jak StartInstancesRequest i StopInstancesRequest, aby osiągnąć to samo, ale ponownie musisz polegać na trzecim zasobie. Istnieje wiele aplikacji do planowania wystąpień AWS z wieloma funkcjami, ale dla prostego rozwiązania polecam bezpłatną aplikację, taką jak snapleaf.io
źródło
Tak, możesz to zrobić za pomocą AWS Lambda. Możesz wybrać wyzwalacz w Cloudwatch, który działa na wyrażeniach Cron w UTC.
Oto powiązany link https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/
Inną alternatywą jest do użytku
awscli
, który jest dostępny zpip
,apt-get
,yum
lubbrew
, a następnie działaaws configure
z poświadczeniami eksportowanych z IAM i wykonując następujący skrypt bash, aby zatrzymać EC2 który został oznaczony zName: Appname
iValue: Appname Prod
. Możesz użyćawscli
do otagowania swoich instancji lub otagowania ich ręcznie z konsoli AWS.aws ec2 stop-instances
zatrzyma instancję ijq
jest używany do filtrowania zapytania json i pobierania prawidłowego identyfikatora instancji przy użyciu tagów zaws ec2 describe-instances
.Aby sprawdzić, czy się
aws configure
powiodło i zwraca wynik json, uruchom,aws ec2 describe-instances
a identyfikator działającej instancji powinien znajdować się w danych wyjściowych. Oto przykładowe dane wyjściowePoniższy skrypt bash
stop-ec2.sh
w/home/centos/cron-scripts/
którym jest inspirowana z tym SO postuUruchom plik za pomocą
sh /home/centos/cron-scripts/stop-ec2.sh
i sprawdź, czy instancja EC2 została zatrzymana. Aby debugować, uruchomaws ec2 describe-instances | jq '.Reservations[].Instances | select(.[].Tags[].Value | startswith("Appname Prod") ) | select(.[].Tags[].Key == "Appname") | {InstanceId: .[].InstanceId, PublicDnsName: .[].PublicDnsName, State: .[].State, LaunchTime: .[].LaunchTime, Tags: .[].Tags} | [.]' | jq -r .[].InstanceId
i sprawdź, czy zwraca poprawny identyfikator instancji, który został oznaczony.Następnie
crontab -e
można dodać następujący wiersz30 14 * * * sh /home/centos/cron-scripts/stop-ec2.sh >> /tmp/stop
który będzie rejestrował dane wyjściowe
/tmp/stop
. To30 14 * * *
jest wyrażenie cron UTC, które możesz sprawdzićhttps://crontab.guru/
. Podobnie zamiana naaws ec2 start-instances
może rozpocząć instancję.źródło
Uważam, że pierwsze pytanie było trochę zagmatwane. Zależy to od tego, czego potrzebuje Pasta: 1. uruchom / zakończ (magazyn instancji) - Automatyczne skalowanie to właściwe rozwiązanie (odpowiedź Nakedible) 2. uruchom / zatrzymaj instancję rozruchową EBS - automatyczne skalowanie nie pomoże, używam zdalnych zaplanowanych skryptów (tj. , ec2 CLI).
źródło
Nie możesz tego zrobić automatycznie, a przynajmniej nie bez programowania i manipulacji API w plikach skryptów. Jeśli chcesz mieć niezawodne rozwiązanie do zatrzymywania, ponownego uruchamiania i zarządzania obrazami (prawdopodobnie w celu kontrolowania kosztów w Twoim środowisku), możesz spojrzeć na LabSlice . Zastrzeżenie: pracuję dla tej firmy.
źródło