AWS Lambda 함수와 함께 .NET 사용 시작하기

0
325

AWS Lambda 함수와 함께 .NET 사용 시작하기

AWS Lambda Functions는 서버 없이 코드를 실행할 수 있는 서버리스 컴퓨팅 모델입니다. 이들은 일반적으로 JavaScript 및 Python과 같은 언어로 작성되지만 AWS는 이제 C#용 .NET을 비롯한 다양한 런타임을 지원합니다.

Lambda에 .NET을 사용하는 이유는 무엇입니까?

이제 Lambda에 사용할 수 있는 다양한 언어가 있으므로 많은 옵션이 있습니다. 일반적으로 빠른 시작 시간을 고려한 간단한 자동화 기능에는 JavaScript와 Python이 사용됩니다. 그러나 무거운 처리에 대해서는 가장 성능이 좋지 않으며 동적으로 유형이 지정된 스크립팅 언어는 복잡한 응용 프로그램의 주요 단점입니다.

C#이 선택한 언어인 경우 특히 Python 또는 JavaScript로 전환하는 것이 너무 번거로운 경우 Lambda에 C#을 사용하는 데 큰 단점이 없습니다. AWS가 제공하는 도구도 훌륭하고 전체 AWS SDK에 액세스할 수 있습니다. 즉, Lambda 및 DynamoDB와 같은 서비스에 대한 조회를 쉽게 수행할 수 있습니다.

또한 AWS는 전체 .NET 런타임을 지원하므로 C# 외에 .NET 바이너리로 컴파일되는 다른 언어를 사용할 수 있습니다. C#이 압도적으로 가장 인기가 있지만 F# 또는 VB.NET에서 Lambda 함수를 작성할 수도 있습니다.

어떻게 수행합니까?

Java 및 C#과 같은 언어는 일반적으로 훨씬 훌륭하지만 사용에 단점이 있습니다. 둘 다 시작할 때 컴파일해야 하는 바이트코드로 컴파일되므로 특히 콜드로 시작할 때 시작 시간이 더 오래 걸립니다. “콜드 스타트”는 AWS가 지난 몇 분 동안 함수를 실행하지 않았기 때문에 캐시되지 않은 경우를 말하며, 이를 시작하고 실행하려면 Just-In-Time 컴파일을 다시 수행해야 합니다. 이 프로세스로 인해 함수가 응답하는 데 1초 이상 걸릴 수 있으며 이는 웹 애플리케이션에 좋지 않습니다.

그러나 이 문제는 Lambda를 매우 자주 사용하는 경우 크게 완화됩니다. 프로비저닝된 동시성을 사용하여 콜드 스타트 ​​시간을 완전히 줄일 수도 있습니다. .NET의 일반 응답 시간은 매우 높으며 성능은 Go 및 Rust와 같이 완전히 컴파일된 언어와 동등합니다.

현재 Lambda 함수에 Java를 사용하고 있다면 최신 .NET 6 런타임이 대부분의 경우 JVM보다 더 적은 메모리를 사용하고 시작하기 때문에 C#이 실행 가능한 대체품이 될 수 있습니다.

C# Lambda 함수 설정

먼저 .NET이 설치되어 있어야 합니다. AWS는 .NET Core 3.1 및 .NET 6을 지원하므로 두 런타임 중 하나가 작동하지만 가장 중요한 것은 다음이 필요합니다. dotnet Lambda 템플릿을 설치할 수 있도록 CLI가 설치되었습니다. Microsoft의 문서 포털에서 .NET을 얻을 수 있습니다.

Lambda 템플릿과 전역 Lambda 도구를 설치해야 합니다.

dotnet new -i Amazon.Lambda.Templates
dotnet tool install -g Amazon.Lambda.Tools

이 설치에는 많은 옵션이 있습니다. 다음을 사용하여 모두 나열할 수 있습니다.

dotnet new --list

이 도구는 다양한 사용 사례에 맞게 미리 구성된 많은 패키지 템플릿과 함께 제공되므로 매우 좋습니다. 일반적으로 빌드 크기를 작게 유지하려면 프로젝트당 하나의 함수가 필요하지만 CloudFormation 템플릿을 사용하여 배포하는 AWS의 서버리스 템플릿을 사용하는 경우 하나의 DLL에 여러 함수를 가질 수 있습니다. 이것들은 관리하기가 훨씬 더 복잡하므로 이점이 있는 경우에만 사용하십시오.

하지만 .NET의 솔루션 파일을 사용하면 공통 어셈블리를 나란히 참조하는 여러 프로젝트를 가질 수 있으므로 큰 문제가 되지 않습니다.

지금은 .NET 6을 사용하여 프로젝트를 생성하는 간단한 빈 함수 템플릿을 사용하겠습니다. 이 템플릿은 명령줄이나 편집기의 새 프로젝트 화면에서 만들 수 있습니다.

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

이것은 매우 간단한 함수를 생성합니다. 문자열을 입력으로 사용하고 ILambdaContext. 이것이 Main() Lambda에 대한 진입점 함수이며 Lambda 함수가 호출될 때마다 런타임에 의해 호출됩니다. 이 특정 함수는 string하지만 당신은 또한 그것을 만들 수 있습니다 async 그리고 반환 Task<string?>.

상단에 JSON 직렬 변환기를 구성하는 어셈블리 속성이 표시됩니다. 내부적으로 Lambda는 입력 콘텐츠의 역직렬화를 처리한 다음 함수를 호출합니다. 그 후에 무언가를 반환하면 응답 스트림에 기록됩니다. Lambda 라이브러리는 이 상용구를 자동으로 처리하며 함수를 래핑하는 코드는 HandlerWrapper.

기본적으로 모든 종류의 메서드 서명을 처리하고 함수가 입력을 받으면 해당 입력을 역직렬화합니다. 함수가 출력을 반환하면 해당 출력을 직렬화합니다. 원시에서 작동하는 함수를 작성할 수 있으므로 실제로 이 작업을 수행할 필요가 없습니다. Stream 클래스이지만 이것은 일을 더 쉽게 만들어주는 멋진 래퍼 클래스입니다.

이것이 의미하는 바는 C#으로 JSON을 처리할 때의 좋은 장점 중 하나인 함수로 전달되거나 함수에서 전달되는 입력 및 출력에 대해 자신의 모델을 자유롭게 정의할 수 있다는 것입니다.

이 함수에서는 역직렬화합니다. InputModel 클래스에서 1초 동안 비동기식으로 대기한 다음 OutputModel 수업. 이 클래스는 Lambda가 처리할 수 있도록 출력 스트림으로 다시 직렬화됩니다.

Lambda 함수 실행

함수를 만든 후 실행하면 Lambda .NET CLI가 배포 방법을 제공하므로 매우 간단합니다. 단순히 실행 deploy-function ~와 함께

dotnet lambda deploy-function SimpleNETFunction

IAM 역할을 선택하거나 새 역할을 생성해야 하며 이 새 역할에 권한을 추가해야 할 수 있습니다. 이제 콘솔에 함수가 표시되어야 합니다.

Lambda는 JSON을 전달할 수 있는 내장 테스터를 제공합니다.

이렇게 하면 실행되고 실행에 대한 모든 세부 정보가 표시됩니다. 이 경우 매우 작은 최소 기능으로 콜드 시작 시간이 500ms 미만으로 .NET 및 일반적으로 Lambda에 꽤 적합합니다. 따뜻해지면 청구되는 기간이 몇 밀리초로 줄어듭니다.

이 경우 이 함수는 메모리를 많이 사용하지 않았으며 함수를 128MB로 낮추어도 문제가 발생하지 않았습니다.