U podstaw automatyzacji leżą różnego rodzaju programy komputerowe lub skrypty pisane, by wykonywać za nas konkretne, powtarzalne zadania. Co w przypadku, w którym nasze rozwiązanie musi być uruchamiane co godzinę lub mimo wszystko zajmuje czas (np. długo przelicza dane), albo kiedy chcielibyśmy je w prosty sposób udostępnić innym? Odpowiedzią mogą być maszyny wirtualne Google Compute Engine. W tym artykule dowiesz się, jak wynająć i skonfigurować maszynę GCE, a przykład, agregujący dane ze stron internetowych, pozwoli zobrazować proste wykorzystanie jej możliwości w procesie automatyzacji.
Czym jest maszyna wirtualna (VM – ang. Virtual Machine)?
Najprościej rzecz ujmując VM jest emulacją prawdziwego komputera, na której możemy uruchomić dowolny podmiot – program, system operacyjny czy nawet inną maszynę wirtualną. Najczęściej spotykane są pełno-systemowe VM, co oznacza, że są całkowitymi substytutami fizycznej maszyny – dla użytkownika końcowego nie różnią się one niczym od zwykłego komputera. Oczywiście za takim doświadczeniem stoją bardzo złożone programy, udostępniające porcje faktycznego hardware’u, który w dodatku może współistnieć w wielu środowiskach niezależnie.
Czym jest Google Compute Engine (GCE)?
GCE jest usługą pozwalającą na łatwe tworzenie (wypożyczanie) i konfigurowanie maszyn wirtualnych. Usługa ta jest częścią Google Cloud Platform (GCP), więc maszyny te udostępniane są w tzw. regionach, czyli centrach danych Google Cloud w różnych miejscach świata.
Jako użytkownicy do dyspozycji otrzymujemy wiele możliwych konfiguracji naszych maszyn, ale dla ułatwienia możemy podzielić je na 4 grupy – maszyny współdzielone, standardowe, z priorytetem CPU lub RAM oraz niestandardowe. Koszt maszyny zależny jest od czasu jej pracy, regionu i rodzaju. Istnieje jednak jeden wyjątek – najbardziej bazowa maszyna “f1-micro” jest bezpłatna. Warto wspomnieć, że większość podstawowych opcji w usługach GCP jest darmowa. Więcej na ten temat można doczytać na stronie https://cloud.google.com/free.
W kolejnej części tekstu dowiemy się jak skonfigurować własną maszynę, a dalej poznamy przykład wykorzystania takiej usługi.
Jak skonfigurować maszynę w GCE?
Pierwsze kroki będą podobne dla każdej usługi GCP. Po pierwsze musimy mieć konto Google, po drugie musimy skonfigurować je tak, by mieć dostęp do konsoli w Google Cloud Platform, co wiąże się m.in. z podaniem numeru karty płatniczej. Następnie zakładamy swój projekt i jesteśmy gotowi do rozpoczęcia pracy z GCE.
Jeśli wszystko zostało poprawnie skonfigurowane, to po wybraniu Compute Engine z menu usług po lewej stronie powita nas panel „Instancje maszyn wirtualnych”, gdzie wystarczy wybrać „Utwórz” by przejść do panelu konfiguracyjnego instancji VM. Przesuwając się po polach od góry do dołu zaczynamy od pola nazwy, gdzie wpisana jest już generyczna nazwa instancji, którą możemy zmienić.
Kolejnymi polami są „Region” i „Strefa”, umożliwiające wybór centrum danych GCP, w którym utworzona zostanie maszyna – Stany Zjednoczone są najtańszymi regionami, choć będą występowały niewielkie problemy związane z opóźnieniami w połączeniach. Regiony Europy są droższe, ale szybsze.
Następnie można wybrać jedną z predefiniowanych konfiguracji sprzętowych maszyn, lub ustawić je ręcznie (w ramach istniejących ograniczeń). W zaawansowanych opcjach możemy wybrać np. inny typ procesora, dodać GPU lub ustawić liczbę dostępnych rdzeni czy pamięci RAM.
W kolejnym kroku możemy zdecydować się na wdrożenie i konfigurację kontenera.
W większości przypadków przejdziemy do wyboru systemu operacyjnego dostępnego na naszej maszynie. Dostępna jest gama dystrybucji darmowego systemu Linux oraz płatne wersje Windows Server.
W ustawieniach tożsamości i dostępu możemy wybrać rodzaje API innych produktów Google, dzięki czemu do ich użycia wystarczą domyślne dane uwierzytelniające. W ustawieniu zapory sieciowej możemy otworzyć porty http i https.
Opcje „Zarządzanie, dyski, sieć, klucze SSH” są bardziej zaawansowane i można zostawić je w ustawieniach domyślnych. Warto zaznaczyć, że jeśli chcemy opisać swoją maszynę lub nadać jej etykietę to można to zrobić w zakładce zarządzanie. Jeśli będziemy chcieli korzystać z zewnętrznych narzędzi do łączenia się z maszyną to w zakładce „Klucze SSH” należy podać swój klucz publiczny.
Z prawej strony pojawią się szacowane koszty za pełny miesiąc pracy maszyny, jeśli są one akceptowalne, to wystarczy kliknąć „Utwórz” i nasza VM będzie za kilka chwil gotowa.
Z tak przygotowaną maszyną możemy połączyć się i rozpocząć pracę na wybranym systemie. Instancję można także zatrzymać, aby ograniczyć generowane przez nią koszta – wciąż będziemy płacić za przestrzeń dysków twardych oraz niektóre inne opcje, ale główna opłata za czas pracy maszyny zostanie wstrzymana.
Do czego użyć instancji GCE?
Prawda jest taka, że instancji możemy użyć do wszystkiego, do czego użyjemy zwykłego komputera, ale nie tylko. Małe instancje GCE mogą być wykorzystane jako proste serwery dla stron internetowych, systemy automatycznie przeliczające dane, lub nawet kontrolery uruchamiające i zamykające większe instancje, na których wykonywane są bardziej skomplikowane zadania. Otrzymujemy po prostu uniwersalną platformę, dzięki której można stworzyć prawdziwy automat, pracujący (po odpowiedniej konfiguracji) bez naszej ingerencji. Nie mniej jednak GCE to tylko platforma i aby skorzystać z jej możliwości, musimy mieć jakiś rodzaj instrukcji, które VM zrozumie i będzie mogła wykonać – mowa tu o skryptach i programach. Wiedząc co jest potrzebne do stworzenia automatycznego procesu, przejdźmy do przykładu.
Obecnie praca z danymi jest nieodzownym elementem prawie każdej branży. Załóżmy, że codziennie rano musimy sprawdzić wartości prezentowane na kilku stronach internetowych, a następnie na ich podstawie wyliczyć jakiś wskaźnik i umieścić go w raporcie, który później wysyłamy dalej. Zaczynamy więc od zdobycia instrukcji – kodu, który wykonywać będzie za nas odpowiednie zadania. Możemy zlecić to zadanie programistom lub spróbować napisać skrypt samemu. Warto zaznaczyć, że na instancjach GCE obsługujących systemy Linux preinstalowany jest Python 2.7, dzięki czemu z większą łatwością możemy eksperymentować z kodem sami. Z tego również powodu w przykładzie posłużymy się właśnie tym językiem programowania.
Prędzej czy później otrzymamy kilka linijek kodu wykonującego wyżej opisane zadanie. Poniższy, przykładowy kod dodatkowo wysyła wiadomość email za pomocą serwisu Mailgun, w której znajdują się zagregowane dane pochodzące ze strony internetowej z różnymi statystykami oraz z bazy Eurostatu. Aby zadziałał, za pomocą podstawowych narzędzi systemu Linux zainstalować wymagane moduły potrzebne do uruchomienia kodu. W pierwszej kolejności należy zainstalować python pip wpisując w konsoli systemu i potwierdzając wymogi modułów
$ sudo apt-get install python-pip
$ sudo pip install pandas
Kolejnym krokiem będzie dostosowanie kodu podmieniając zmienną send_to imieniem, nazwiskiem i mailem adresata, a user oraz api_key odpowiednimi wartościami uzyskanymi z serwisu Mailgun. Następnie należy zapisać kod np. jako raport.py.
import pandas as pd
import requests
df = pd.read_html("https://www.internetworldstats.com/stats4.htm")
df = df[6][2:-2]
df.rename(columns=df.iloc[0], inplace=True)
df.reset_index(inplace=True, drop=True)
df.drop(0, inplace=True)
df.dropna(axis=1, inplace=True)
df[u'Users % in Europe'] = pd.to_numeric(df[u'Users % in Europe'].str.strip(' %'))
df[u'Population ( 2018 Est. )'] = pd.to_numeric(df[u'Population ( 2018 Est. )'])
pl = df.loc[df[u'EUROPE'] == u'Poland'].transpose()
big = df.loc[(df[u'Users % in Europe'] < 100) & (df[u'Population ( 2018 Est. )'] > 20000000)].max()
df = pd.concat([pl,big], axis=1)
df.columns = df.iloc[0]
df.drop([u'EUROPE'], inplace=True)
eurostat = requests.get('http://ec.europa.eu/eurostat/wdds/rest/data/v2.1/json/en/tin00096?'+
'unit=PC_IND&geo=PL&time=2017').json()
df2 = pd.DataFrame({str(eurostat['label']): str(eurostat['value'][u'0'])+' %'}, index=[eurostat['dimension']['geo']
['category']['label']['PL']+'_'+
eurostat['dimension']['time']
['category']['label']['2017']])
indicator = float(df[u'Poland'].iloc[-1]) / ((eurostat['value'][u'0']/100.) * float(df[u'Poland'].iloc[0]))
df = df.to_html()
df2 = df2.to_html()
send_to = "IMIE NAZWISKO <ADRES@EMAIL>"
user = 'USER_ID.mailgun.org'
api_key = 'MAILGUN_API_KEY'
def send_simple_message(to):
return requests.post(
"https://api.mailgun.net/v3/%s/messages" % user,
auth=("api", api_key),
data={"from": "Mailgun Sandbox <postmaster@%s>" % user,
"to": to,
"subject": "Daily Summary",
"html": df + '\n' + df2 + "Overlap ludzi korzystajacych z FB i robiacych zakupy w interencie: %s %%"
% str(round(indicator, 2)*100)})
send_simple_message(send_to)
Mając zestaw instrukcji można uruchomić instancję GCE zgodnie z opisanymi wcześniej wytycznymi i połączyć się z nią przez protokół SSH, a następnie wgrać pożądany kod.
W wyskakującym okienku pojawi się konsola charakterystyczna dla systemów Linux. W prawym górnym rogu okna znajduje się ikona trybiku, pozwalająca na dostosowanie opcji konsoli oraz przesyłanie plików do folderu home. Wystarczy wybrać plik, który chcemy przesłać i gotowe. Kolejnym krokiem jest ustawienie automatu. Pomoże nam w tym już program cron (harmonogram zadań na systemach Linux).
Zakładając, że nasz skrypt działa poprawnie, pozostało nam tylko wprowadzenie kilku komend, które spowodują regularne uruchamianie skryptu od poniedziałku do piątku o godzinie 7 rano. Koszt rozwiązania – 0 zł.
$ sudo mv ~/raport.py /raport.py
$ sudo crontab -e
następnie w ostatniej linii wystarczy dopisać:
0 7 1-5 python /raport.py
I gotowe! Jeden problem z głowy – codziennie rano przyjdzie do nas następujący mail:
Czy to wszystko?
Oczywiście w tym przykładzie dane nie zmieniają się zbyt dynamicznie, więc zasadność codziennego raportowania jest niewielka, inaczej byłoby w przypadku np. kursów walut lub wskaźnika użytkowników, wyliczanego online na danej stronie. Możliwości na tym się jednak nie kończą: większość rozwiązań, oferowanych przez Google, posiada swoje API (przykłady na https://developers.google.com/apis-explorer/#p/), tak więc nasze automatyczne raporty mogą wykonywać obliczenia na danych z systemów takich jak DoubleClick Manager, Google Analytics i DoubleClick Search i systematycznie zbierać je w jednym miejscu, np. wysyłając e-mail, uploadując raporty w dowolnym formacie na Google Cloud Storage, czy nawet tworząc tabele w BigQuery. Cała ta zabawa z maszynami wymaga pewnych podstaw programowania. Tak jak wspominałem na początku, VM są po prostu częścią całego procesu automatyzacji zadań. Nie warto się jednak zniechęcać do części programistycznej – większość rozwiązań i usług dostępnych na rynku, posiada dokumentację swojego API, nierzadko popartą przykładami w różnych językach programowania (tak jest choćby w przypadku Google’a), a internet pełen jest rzetelnie opisanych skryptów czy kawałków kodu, gotowych automatyzować dla nas cały wachlarz najróżniejszych procesów.
Mam nadzieję, że dzięki temu artykułowi przybliżyłem podstawy wykorzystania wirtualnych maszyn w procesie automatyzacji. Zapraszam do pytań, komentowania i dzielenia się pomysłami.