Pierwsze kroki z .NET z funkcjami AWS Lambda

Pierwsze kroki z .NET z funkcjami AWS Lambda

AWS Lambda Functions to model przetwarzania bezserwerowego, który umożliwia uruchamianie kodu bez serwerów. Zazwyczaj są napisane w językach takich jak JavaScript i Python, ale AWS obsługuje teraz wiele różnych środowisk wykonawczych, w tym. NET dla C#.

Dlaczego warto korzystać. NET dla Lambdy?

Obecnie Lambda jest dostępnych w wielu różnych językach, więc masz wiele opcji. Zazwyczaj JavaScript i Python są używane do prostych funkcji automatyzacji, które zapewniają szybkie uruchomienie i uruchomienie. Ale nie są one najbardziej wydajne w przypadku intensywnego przetwarzania, a dynamicznie pisane języki skryptowe są poważną wadą w przypadku złożonych aplikacji.

Jeśli wolisz język C#, używanie go dla Lambdy nie ma zbyt wielu wad, zwłaszcza jeśli przejście na Python lub JavaScript jest zbyt żmudne. Narzędzia dostarczane przez AWS są również dobre i masz dostęp do całego AWS SDK, co oznacza, że ​​możesz łatwo wyszukiwać usługi takie jak Lambda i DynamoDB.

Ponadto AWS obsługuje całe środowisko wykonawcze. NET, co oznacza, że ​​możesz używać języków innych niż C#, które kompilują się również do plików binarnych. INTERNET. C# jest najpopularniejszy, ale funkcje lambda można również pisać w języku F# lub VB.NET .

Jak to działa?

Języki takie jak Java i C# wydają się być dużo ładniejsze, ale ich używanie ma swoje wady. Oba są kompilowane do kodu bajtowego, który należy skompilować podczas uruchamiania, dzięki czemu mają więcej czasu na uruchomienie, szczególnie podczas zimnego uruchamiania. „Zimny ​​start” ma miejsce wtedy, gdy AWS nie uruchomił funkcji w ciągu ostatnich kilku minut, więc nie będzie ona buforowana i będzie musiała ponownie się skompilować, aby ją uruchomić. Ten proces może spowodować, że funkcje będą reagować sekundę lub dłużej, co nie jest dobre w przypadku aplikacji internetowych.

Jednak ten problem jest znacznie łagodzony, jeśli bardzo często używasz Lambdy. Możesz także całkowicie skrócić czas zimnego startu dzięki dedykowanej równoległości . Typowy czas odpowiedzi dla. NET jest bardzo duży, a wydajność dorównuje w pełni skompilowanym językom, takim jak Go i Rust.

Jeśli obecnie używasz Javy dla funkcji Lambda, C# może być realnym zamiennikiem, ponieważ jest to nowoczesne środowisko uruchomieniowe. NET 6 zużywa mniej pamięci iw większości przypadków uruchamia się szybciej niż JVM.

Konfigurowanie funkcji lambda C#

Najpierw będziesz potrzebować zainstalowanego. INTERNET. Obsługa AWS. NET Core 3.1 i. NET 6, więc każdy z tych dwóch środowisk wykonawczych będzie działał, ale co najważniejsze, będziesz potrzebować dotnet zainstalowanego CLI, aby móc zainstalować szablony Lambda. Możesz dostać. NET z portalu Microsoft Documentation Portal .

Będziesz musiał zainstalować szablony Lambda i globalne narzędzia Lambda.

dotnet new -i Amazon.Lambda.Templates

dotnet tool install -g Amazon.Lambda.Tools

Stwarza to wiele opcji; możesz je wszystkie wymienić za pomocą:

dotnet new --list

To narzędzie jest bardzo przydatne, ponieważ zawiera wiele spakowanych szablonów wstępnie skonfigurowanych do różnych zastosowań. Zazwyczaj potrzebujesz jednej funkcji na projekt, aby utrzymać małe rozmiary kompilacji, ale możesz mieć wiele funkcji w jednej bibliotece DLL, jeśli używasz szablonów bezserwerowych AWS, które są wdrażane przy użyciu szablonów CloudFormation. Są znacznie trudniejsze w zarządzaniu, więc używaj ich tylko wtedy, gdy ci przyniosą korzyść.

Jednak z plikami rozwiązań. NET, możesz mieć wiele równoległych projektów odwołujących się do współdzielonych zestawów, więc nie jest to wielka sprawa.

Na razie użyjemy prostego szablonu „Pustej funkcji”, który tworzy projekt za pomocą. NET 6. Możesz go utworzyć z wiersza poleceń lub z ekranu nowego projektu edytora.

dotnet new lambda.EmptyFunction --name SimpleLambdaFunction --profile default --region us-east-1

Generuje to bardzo prostą funkcję — pobiera ciąg znaków jako dane wejściowe, a także przekazuje ILambdaContext. Jest Main() to funkcja punktu wejścia dla twojej Lambdy i będzie wywoływana przez środowisko wykonawcze za każdym razem, gdy wywołana zostanie funkcja Lambda. Ta konkretna funkcja zwraca string, ale możesz również to zrobić async i powrócić Task<string?>.

U góry zobaczysz atrybut zestawu, który konfiguruje serializator JSON. Wewnętrznie Lambda dokona deserializacji zawartości wejściowej, a następnie wywoła funkcję. Następnie, jeśli coś zwróci, zostanie to zapisane w strumieniu odpowiedzi. Biblioteki Lambda obsługują ten wzorzec za Ciebie, a kod, który otacza Twoją funkcję, znajduje się w HandlerWrapper.

Zasadniczo obsługuje wszystkie rodzaje sygnatur metod, a jeśli twoja funkcja pobiera dane wejściowe, deserializuje te dane wejściowe. Jeśli funkcja zwróci dane wyjściowe, zserializuje je dla Ciebie. Naprawdę nie musisz tego robić, ponieważ możesz pisać funkcje, które operują na surowych Stream klasach, ale jest to fajna klasa opakowująca, która ułatwia sprawę.

Oznacza to, że możesz dowolnie definiować własne modele danych wejściowych i wyjściowych przekazywanych do iz funkcji, co jest jedną z miłych korzyści przetwarzania JSON w C#.

W tej funkcji deserializuje InputModel klasę, czeka asynchronicznie przez sekundę, a następnie zwraca OutputModel klasę. Ta klasa jest serializowana z powrotem do strumienia wyjściowego, aby Lambda mogła ją przetworzyć.

Uruchamianie funkcji lambda

Uruchamianie funkcji po utworzeniu jest dość łatwe, ponieważ interfejs wiersza poleceń Lambda. NET udostępnia metodę jego wdrażania. Po prostu biegnij deploy-function z

dotnet lambda deploy-function SimpleNETFunction

Musisz wybrać rolę uprawnień lub utworzyć nową, a także może być konieczne dodanie uprawnień do tej nowej roli. Powinieneś teraz zobaczyć funkcję w konsoli:

Lambda udostępnia wbudowany tester, do którego można przekazać JSON.

Spowoduje to wykonanie i pokaże wszystkie szczegóły dotyczące wykonania. W tym przypadku, przy bardzo małej funkcji minimum, czas zimnego startu wynosił mniej niż 500 ms, co jest całkiem przyzwoite. NET i ogólnie dla Lambda. Gdy tylko się rozgrzeje, płatny czas trwania zostaje skrócony do kilku milisekund.

W tym przypadku funkcja nie zajmowała w ogóle dużo pamięci, a zmniejszenie funkcji do 128 MB nie sprawiało żadnych problemów.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *