AWS Lambda 함수로 .NET 시작하기

AWS Lambda 함수로 .NET 시작하기

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

사용하는 이유. 람다용 NET?

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

C# 언어를 선호한다면 특히 Python이나 JavaScript로 전환하는 것이 너무 지루한 경우 Lambda에 사용하는 것이 너무 많은 단점이 없습니다. AWS에서 제공하는 도구도 훌륭하고 전체 AWS SDK에 액세스할 수 있으므로 Lambda 및 DynamoDB와 같은 서비스를 쉽게 검색할 수 있습니다.

또한 AWS는 전체 런타임을 지원합니다. NET을 지원하므로 바이너리로 컴파일되는 C# 이외의 언어도 사용할 수 있습니다. 그물. C#이 가장 많이 사용되지만 F# 또는 VB.NET에서 람다 함수를 작성할 수도 있습니다 .

어떻게 작동합니까?

Java 및 C#과 같은 언어는 훨씬 더 좋은 경향이 있지만 사용하는 데에는 단점이 있습니다. 둘 다 시작 시 컴파일해야 하는 바이트 코드로 컴파일되므로 특히 콜드 시작 시 시작 시간이 더 많습니다. “콜드 스타트”는 AWS가 지난 몇 분 동안 기능을 실행하지 않아 캐시되지 않으며 실행하려면 제 시간에 다시 컴파일해야 하는 경우입니다. 이 프로세스로 인해 함수가 응답하는 데 1초 이상 걸릴 수 있으며 이는 웹 애플리케이션에 좋지 않습니다.

그러나 이 문제는 Lambda를 매우 자주 사용하면 크게 완화됩니다. 또한 전용 병렬 처리 로 콜드 스타트 ​​시간을 완전히 줄일 수 있습니다 . 에 대한 일반적인 응답 시간. NET은 매우 크고 성능은 Go 및 Rust와 같은 완전히 컴파일된 언어와 동등합니다.

현재 Lambda 함수에 Java를 사용하고 있는 경우 C#은 최신 런타임이므로 실행 가능한 대체품이 될 수 있습니다. NET 6은 메모리를 덜 사용하고 대부분의 경우 JVM보다 빠르게 시작됩니다.

C# 람다 함수 설정

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

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 명령줄 인터페이스 때문에 매우 쉽습니다. NET은 배포 방법을 제공합니다. 그냥 deploy-function 실행

dotnet lambda deploy-function SimpleNETFunction

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

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

이렇게 하면 실행되고 실행에 대한 모든 세부 정보가 표시됩니다. 이 경우 매우 작은 최소 기능으로 콜드 스타트 ​​시간이 500ms 미만으로 상당히 괜찮습니다. NET 및 일반적으로 Lambda의 경우. 따뜻해지면 유료 지속 시간이 몇 밀리초로 줄어듭니다.

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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다