Strona Główna / Blog

Programujemy Bez Zmartwień. Przyglądamy się IBM Cloud Functions

Przemek Malak

Przemek Malak

AWS Architect (Development) w Chmurowisku. Ponad 18 lat w branży IT. Architekt rozwiązań chmurowych i mobilnych oraz Programista (przez duże P). Entuzjasta rozwiązań Serverless, posiadacz kilku certyfikacji AWS (Architect, Developer, SysOps).

Interesują Was przystępne rozwiązania developerskie, które pozwalają zaoszczędzić czas? Porozmawiajmy zatem o FaaS, Function as a Service. Nie mylić z serverless. To nie to samo!

FaaS != Serverless

Function as a Service to usługa typu serverless, która pozwala na wykonanie kodu bez potrzeby zarządzania jakimikolwiek serwerami.

Dziś chciałem sprawdzić, co w temacie rozwiązań serverless ma do zaoferowania IBM Cloud.

IBM Cloud i Function as a Service

FaaS w chmurze IBM oparty jest na technologii ApacheOpenWhisk. Ktoś mógłby zatem zapytać, po co płacić za użycie rozwiązania open source?

No właśnie po to, żeby go używać, a nie tracić czasu na konfigurowanie, zarządzanie i patchowanie. To jest siła chmur publicznych, a szczególnie rozwiązań serverless. Dzięki nim możemy skupić się wyłącznie na tworzeniu aplikacji, nie przejmując się obsługą serwerów.

Dokumentacja na stronach IBM jest obszerana i dobrze wyjaśnia zagadnienie. Zawiera ona podstawowe architektury, które możemy wykorzystać w naszych rozwiązaniach, a dla niektórych, np. Serverless web application and API są tutoriale.

Sprawdźmy więc, jak IBM Cloud Functions wyglądają w praktyce.

Szybki start z IBM Cloud Functions

Po zalogowaniu się na nasze konto z przybornika wybieramy Functions:

Po chwili powinniśmy ujrzeć konsolę, z której będziemy mogli zarządzać naszymi funkcjami w chmurze IBM.

Przycisk Start Creating aż kusi, żeby go nacisnąć, ale my przyjrzyjmy się na początek cennikowi.

IBM Cloud Functions – Jak płacimy?

IBM Cloud Functions oferują teoretycznie nieograniczoną skalowalność w modelu płatności pay-as-you-go. Według dokumentacji funkcja będzie się automatycznie skalowała do 10.000 równoległych wywołań.

Płacimy tylko za to, z czego skorzystamy. Ważny jest czas, przez który nasza funkcja działała oraz to, ile przydzieliliśmy jej pamięci. W tej chwili płacimy $0,000017 za sekundę i gigabajt pamięci.

Przy niewielkim użyciu funkcji możemy nawet nie dostać rachunku.

IBM FaaS w akcji. Tworzymy naszą funkcję

Funkcja w IBM Cloud nazwana jest akcją. Zobaczmy zatem, jak utworzyć jedną z nich.

Z menu po lewej stronie konsoli wybieramy Actions:

A następnie Create:

Oraz Create Action:

Ukaże nam się interfejs, w którym możemy utworzyć akcję.

Jeżeli budujemy jakąś większą funkcjonalność, możemy naszą akcję opakować razem z innymi w tak zwanym pakiecie (package). Pozwoli nam to na łatwiejsze zarządzanie funkcjami.

Za pomocą pakietów możemy także dzielić się akcjami z innymi osobami.

Budowanie akcji. Dostępne możliwości

Musimy oczywiście wybrać także runtime, w którym nasza akcja będzie pracowała. W tej chwili możemy wybrać jedną z poniższych opcji:

  • Node.js 6
  • Node.js 8
  • Python 3
  • Swift 4
  • Ruby 2.5
  • PHP 7

Co ciekawe, gdy już mamy naszą akcję i chcielibyśmy zmienić jej konfigurację, pojawia nam się nieco więcej możliwości:

Wygląda na to, że w pierwszym widoku nie mamy „przestarzałych” opcji.

Ciekawostką dla programistów MACOS i iOS będzie obecność języka Swift. Biorąc pod uwagę współpracę IBM z Apple, nie powinno to dziwić.

Możemy utworzyć także akcje korzystające z Javy bądź Dockera. Musimy posłużyć się jednak wtedy CLI.

No dobrze, runtime już wybrany, powróćmy do naszej akcji.

Klikamy Create i otwiera się przed nami edytor online, w którym możemy edytować kod akcji.

Akcja jest właściwie gotowa. Oczywiście w rzeczywistości jej kod byłby odrobinę bardziej skomplikowany. Na tym skupimy się za chwilę.

Wywołanie akcji w IBM Cloud Functions

Spójrzmy na kod wygenerowany automatycznie przez samą platformę:

#
#
# main() will be run when you invoke this action
#
# @param Cloud Functions actions accept a single parameter, which must be a JSON object.
#
# @return The output of this action, which must be a JSON object.
#
#

Jak widać, wywołanie akcji spowoduje wykonanie metody main(). Do samej metody przekazywany jest jeden parametr, obiekt w formacie JSON. Co ciekawe, funkcja MUSI też zwracać obiekt w takim samym formacie. Nie stanowi to jednak problemu.

Dopiszmy jeszcze do kodu naszej akcji jedną linię, za pomocą której zalogujemy obiekt przekazywany do akcji.

Po zmianach nasz kod powinien wyglądać tak:

import sys

def main(dict):   
    print(dict)
    return { 'message': 'Hello world' }

Sprawdźmy teraz, jak możemy ten kod uruchomić. Z samym uruchomieniem akcji związane są parametry, które można znaleźć w menu.

Parametry akcji

Opcja ta bardzo się przydaje. Umożliwia ona zdefiniowanie domyślnych parametrów dla akcji.

Jeżeli zdefiniujemy je tak jak poniżej:

To teraz, jeżeli wywołamy akcję bez podania czegokolwiek na wejściu, otrzyma ona zdefiniowane przez nas parametry:

Co ważne, możemy jednak te wartości „nadpisać” w wywołaniu. Załóżmy, że naszemu wywołaniu towarzyszyć będą takie dane:

W ten sposób nadpiszemy wartość dla par1 oraz dodamy dodatkowy parametr par3:

Bardzo ważne ustawienia znajdują się w zakładce Runtime. Możemy w niej zmienić runtime dla naszej akcji, ale także, co istotniejsze, w odpowiedni sposób ustalić ilość przydzielanej pamięci oraz timeout, czyli czas, po którym nasz akcja zostanie terminowana bez względu na to, czy wcześniej sama zakończy działanie.

Ustawienie tych dwóch parametrów jest ważne. Nie powinniśmy ustawiać wartości maksymalnej dla timeout, gdyż w przypadku, gdy nasza akcja „zawiesi się”, niepotrzebnie zapłacimy za 10 minut pracy. Dobierzmy tę wartość z małym zapasem, ale dopasujmy ją do konkretnej akcji.

Przydzielanie pamięci

Z czasem, który nasza akcja potrzebuje na swoje działania, ściśle związany jest drugi parametr, ilość pamięci, którą jej przydzielamy.

Tu nie mam dla Was ani dobrej rady, ani złotego środka. W przypadku akcji produkcyjnych powinniśmy przetestować, jak działa nasza akcja przy różnych ustawieniach. Niekoniecznie więcej pamięci będzie oznaczało większy rachunek. Istnieje możliwość, że przy zwiększonych zasobach nasza akcja wykona się dużo szybciej. A płacimy przecież za połączenie czasu i zasobów.

W tym momencie możemy przydzielić akcji 2GB pamięci w interwałach co 32MB. Najdłuższy czas, po którym nasza akcja zostanie terminowana, to 10 minut.

Punkty dostępowe naszej akcji

Tworząc akcję w IBM Cloud, dostajemy od razu dwa rodzaje punktów dostępowych: Web Action i REST API.

Z API REST powiązany jest także klucz API, którym musimy uwierzytelniać nasze zapytania. Interfejs usługi przygotuje dla nas wywołanie curl, a klikając na zaznaczony przycisk, dostaniemy od razu całe wywołanie wraz z odpowiednim kluczem:

curl -u 94f22efd-e992-4c82-914d-bf72ref095b0:as1YitjkCIj8rgyjkltrUSBrtymKmken89DuYBhNyZdcXHupfRPXTT9Odjl0qCbPQ -X POST https://openwhisk.eu-gb.bluemix.net/api/v1/namespaces/przemek%40chmurowisko.pl_dev/actions/MyFirstAction?blocking=true

Kluczy API nigdy nie powinniśmy przekazywać dalej, aby udostępnić nasze akcje. Do tego celu możemy użyć API Gateway bądź właśnie Web Actions.

Korzystanie z Web Actions

Web Actions nie zapewniają żadnej autoryzacji i cały proces musimy, w razie potrzeby, wykonać sami. Wywołania akcji są w tym przypadku anonimowe.

Włączenie Web Actions udostępni adres URL, za pomocą którego możemy wywoływać naszą akcję bez żadnej autoryzacji. Adres jest taki sam dla każdej metody REST.

Akcję można oczywiście także zintegrować z innymi usługami w IBM Cloud.

Podsumowanie

Chmura IBM kojarzy się nam przede wszystkim z usługami kognitywnymi. Wiele osób utożsamia ją z usługą Watson, o której pisaliśmy już jakiś czas temu.

Warto wiedzieć jednak, że w IBM Cloud znajdziemy także bardziej „przyziemne” narzędzia, które możemy z łatwością wykorzystać w swoich rozwiązaniach. Jednym z nich są usługi Function as a Service. Powinny one zainteresować (prawie) każdego developera.

To najbardziej pożądana umiejętność na rynku w 2020 roku!

Jak zostać Azure Data Engineer? WEBINAR

Dołącz do listy mailingowej!

Dołącz do naszego newslettera

Staramy się wysyłać tylko wartościowe informacje, np. co miesiąc dostaniesz spis najważniejszych nowości z chmur Azure, AWS i GCP, z krótkimi opisami i linkami.