Paweł Łukasiewicz
2022-04-10
Paweł Łukasiewicz
2022-04-10
Udostępnij Udostępnij Kontakt
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#): AWS Lambda: szablon Po kliknięciu przycisku Next zostaniemy poproszeni o wybranie szablonu projektu – w naszym przypadku będzie to Empty Function: AWS Lambda: funkcja Zostanie utworzony projekt, który przyjmie poniższą strukturę: AWS Lambda: pierwszy projekt 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: AWS Lambda: publikowanie funkcji

Definiujemy nazwę naszej funkcji, dodajemy opis a następnie klikamy przycisk Next: AWS Lambda: publikowanie funkcji

Jeżeli używacie świeżo utworzonego konta bez żadnej konfiguracji dostaniecie poniższy błąd: AWS Lambda: brak odpowiedniej roli 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ę: AWS Lambda: dodawanie uprawnień

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: AWS Lambda: konfiguracja 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: AWS Lambda: publikowanie funkcji

Jeżeli wszystko przebiegnie pomyślnie zobaczycie poniższy ekran, który pozwoli Wam przetestować przygotowaną funkcję: AWS Lambda: test Zanim wciśniemy przycisk Invoke wprowadzamy dane wejściowe: AWS Lambda: 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: AWS Lambda: konsola aws Możemy dodatkowo sprawdzić czy konfiguracja jest zgodna z naszymi ustawieniami: AWS Lambda: ustawienia

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: AWS Lambda: monitorowanie

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.