Wprowadzenie
W tym wpisie utworzymy swoją pierwszą funkcję Lambda wykorzystując język C#. Proces pisania i wdrażania kodu wykonamy wykorzystując środowisko Visual Studio. Jeżeli jeszcze nie dodaliście AWS Toolkit do Waszego środowiska zerknijcie do jednego z poprzednich wpisów: AWS Lambda: konfiguracja środowiska
W pierwszym kroku dodamy nowy projekt wykorzystując szablon AWS Lambda Project (.NET Core – C#):
Po kliknięciu przycisku Next zostaniemy poproszeni o wybranie szablonu projektu – w naszym przypadku będzie to Empty Function:
Zostanie utworzony projekt, który przyjmie poniższą strukturę:
Głównym plikiem w naszym projekcie jest Function.cs w którym tworzony jest handler ze zdarzeniem i kontekstem dla Lambdy:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace MyFirstLambda
{
public class Function
{
/// <summary>
/// A simple function that takes a string and does a ToUpper
/// </summary>
/// <param name="input"></param>
/// <param name="context"></param>
/// <returns></returns>
public string FunctionHandler(string input, ILambdaContext context)
{
return input?.ToUpper();
}
}
}
Poniższy atrybut jest użwany do serializowania parametrów wejściowych JSON funkcji Lambda do klasy .NET:
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
Handler
Handler jest przygotowany w poniższy sposób:
public string FunctionHandler(string input, ILambdaContext context)
{
return input?.ToUpper();
}
Spójrzmy na jego składowe:
-
FunctionHandler - punkt wejściowy dla funkcji Lambda;
- string input - parametr wejściowy naszej metody;
-
ILambdaContext - interfejs opisujący kontekst, tj. nazwa funkcji, ustawienia timeotów, etc.
Handler funkcji Lambda może być wywołany w sposób synchroniczny oraz asynchroniczny. Jeżeli wywołujemy w sposób synchroniczny (tak jak na powyższym przykładzie) możemy zdefiniować zwracany typ. W przypadku wywołania asynchronicznego typ ten musi być typem void.
Na ten moment nie wprowadzamy żadnych zmian (funkcja będzie zwracała nam wejściowy łańcuch znaków w postaci dużych liter). Skupimy się na deploy’u i przetestowaniu działania naszej funkcji. W tym celu klikamy prawym przyciskiem myszy na nasz projekt i wybieramy opcję: Publish to AWS Lambda:
Definiujemy nazwę naszej funkcji, dodajemy opis a następnie klikamy przycisk Next:
Jeżeli używacie świeżo utworzonego konta bez żadnej konfiguracji dostaniecie poniższy błąd:
Związany jest on z uprawnieniami danego użytkownika do wykonywania operacji na naszym koncie. W jednym z pierwszych wpisów poprzedniego cyklu dodaliśmy naszemu użytkownikowi uprawnienie AmazonEC2ReadOnlyAccess pozwalające na podgląd instancji. Tym razem dodamy politykę AdministratorAccess, która daje nam pełną kontrolę:
Na kolejnym ekranie wprowadzamy nazwę roli, dostępną pamięć oraz ustawiamy timeout naszej funkcji. W tym przypadku dokonałem utworzenia nowej roli na bazie już istniejącej, tj. AWSLambda_FullAccess. Dla dwóch pozostałych parametrów pozostawiłem wartości domyślne:
Na ten moment nie umieszczamy naszej lambdy w wirtualnej sieci prywatnej. O tym będziemy szerzej mówić w kolejnych wpisach, kiedy nieco więcej uwagi przywiążemy do architektury naszej aplikacji.
Jedyne co może budzić wasze wątpliwości to rola przypisana do funkcji. Role definują uprawnienia dostępu do usług oraz zasobów AWS. Możemy np. przygotować role, która ma uprawnienia do wysyłania logów czy przesyłania danych ‘śledzących’ do AWS X-Ray (potężne narzędzie pozwalające na sprawdzenie do dokładnie działo się w naszej aplikacji). Dobrą praktyką jest tworzenie roli, której uprawnienia nie wykraczają poza to co jest wymagane do poprawnego działania. Na ten moment nie chcę niczego komplikować ale idąc dalej z kolejnymi wpisami będziemy przywiązywać do tego zagadnienia więcej uwagi.
Klikamy przycisk Upload, który rozpoczyna proces publikowania naszej funkcji:
Jeżeli wszystko przebiegnie pomyślnie zobaczycie poniższy ekran, który pozwoli Wam przetestować przygotowaną funkcję:
Zanim wciśniemy przycisk Invoke wprowadzamy dane wejściowe:
W polu wyjściowy widzimy wprowadzony ciąg znaków w formie wielkich liter – osiągnęliśmy to co sobie założyliśmy.
Konsola AWS
To jeszcze nie koniec, przechodzimy do konsoli AWS w celu sprawdzenia czy nasza funkcja została rzeczywiście utworzona i opublikowana z poziomu Visual Studio. Korzystając z wyszukiwarki usług przechodzimy do naszych funkcji:
Możemy dodatkowo sprawdzić czy konfiguracja jest zgodna z naszymi ustawieniami:
Ostatni krok to przejście do zakładki Monitoring w celu sprawdzenia czy nasza funkcja została wywołana i czy pojawiły się jakieś błędy:
W kolejnym wpisie przejdziemy do nieco bardziej praktycznych przykładów wykorzystania funkcji Lambda. Przygotujemy funkcję, która będzie reagować na dodanie pliku do S3.