AWS Lambda에서의 .NET 워크로드

모듈 1

모듈 1: AWS Lambda 소개

 학습 모듈

개요

이 자습서에서는 AWS Lambda에서 .NET을 사용하는 방법을 알아봅니다. AWS Lambda에 대한 사전 지식은 없더라도 AWS 및.NET에 대해서는 잘 알고 있어야 합니다. 이 교육 과정에서는 명령줄, Visual Studio, Visual Studio Code 및 Rider를 사용하여 .NET Lambda 함수를 생성, 배포, 실행, 테스트 및 디버깅하는 방법을 배우게 됩니다.

입문 모듈에서는 서버리스 컴퓨팅과 그 장점은 무엇인지, AWS Lambda와 어떤 관련이 있는지 알아봅니다. .NET AWS Lambda 함수를 얼마나 쉽게 시작할 수 있는지 보여주는 두 가지 예시가 아래에 나와 있습니다.

 소요 시간

45분

서버리스 컴퓨팅

서버리스 컴퓨팅에 대해 이야기하기 전에 잠시 기존의 컴퓨팅에 대해 살펴보겠습니다.

규모를 막론하고 많은 회사에서 온프레미스 서버 또는 데이터 센터 기반 서버를 사용하여 애플리케이션을 실행합니다. 이러한 회사에서 서버가 추가로 필요하면 서버를 구매하여 물리적으로 설치 및 구성하고, 보안을 유지하고, 유지 관리해야 합니다. (경우에 따라 데이터 센터에서 사용자를 대신하여 물리적으로 설치해 주기도 하지만 나머지는 사용자가 처리해야 합니다.)

이 모든 작업이 완료되면 회사가 해당 서버에 애플리케이션을 배포할 수 있습니다. 이러한 작업은 대부분의 회사에서 몇 주 또는 몇 달이 걸릴 수 있습니다. 지금까지는 이러한 지연으로 인해 애플리케이션 규모 조정이 어려웠습니다.

클라우드 컴퓨팅 덕분에 이러한 작업이 훨씬 더 쉬워졌습니다. 회사는 몇 분 만에 서버 인스턴스 하나(또는 여러 인스턴스)를 시작할 수 있습니다. 회사는 가상 머신과 운영 체제를 원하는 방식으로 구성하여 자체적인 가상 머신 이미지를 만들 수 있습니다. 이렇게 하면 서버가 시작된 후 필요한 구성의 양이 줄어들지만 패치, 보안 업데이트, 소프트웨어 업데이트 등을 통해 서버를 최신 상태로 유지해야 할 필요성은 여전히 남게 됩니다.

대부분의 경우, 이러한 서버는 항상 사용하지 않아도 연중무휴 24시간 운영됩니다. 서버는 애플리케이션에서 예상하는 최대 워크로드를 처리하도록 프로비저닝되는 경우가 많습니다. 하지만 이 피크 시간을 벗어나면 서버는 적어도 부분적으로 유휴 상태가 됩니다. 적절한 조정 정책을 사용하면 이 문제를 해결하는 데 도움이 될 수 있지만 제대로 하기가 어려울 수 있습니다.

또한, 서버 프로비저닝 및 유지 관리 작업과 서버의 유휴 시간으로 인해 비용이 발생하여 회사에 직접적인 도움이 되지 않습니다.
이 경우 대안으로 서버리스 컴퓨팅이 있습니다. 서버도 없고 유지 관리도 필요 없으며 확장이 자동으로 처리되며, 코드를 작성하고 배포하면 AWS에 인프라를 처리하도록 맡깁니다.

AWS는 서버리스 컴퓨팅을 위한 두 가지 옵션을 제공합니다. 컨테이너 기반 애플리케이션을 위한 AWS Fargate, 그리고 이벤트 기반 애플리케이션을 위한 AWS Lambda입니다.

AWS Lambda

AWS Lambda는 서비스에서 수신한 이벤트에 응답하여 코드를 실행하는 서버리스 컴퓨팅 서비스입니다. SNS, SQS, S3, DynamoDB, API 게이트웨이 등과 같은 다른 AWS 서비스에서 이벤트를 생성할 수 있습니다.

API Gateway 또는 Lambda 함수 URL을 사용하면 HTTP 요청에 대한 응답으로 Lambda 함수가 실행되도록 트리거할 수 있습니다. Lambda 함수를 직접 호출할 수도 있지만 이 역시 이벤트로 간주됩니다.

AWS Lambda를 사용하기 위해 인프라를 프로비저닝할 필요는 없습니다. 또한, AWS는 하루에 아무리 많은 횟수를 실행하더라도 애플리케이션의 요구 사항에 맞춰 자동으로 크기를 조정합니다. AWS에서 관리하는 Lambda 인프라는 가용성이 높고 내결함성이 뛰어납니다.

Lambda 함수를 사용하면 사용한 컴퓨팅 리소스에 대해서만 비용을 지불하면 됩니다. 코드가 실행되지 않으면 비용을 지불하지 않습니다.

이미 익숙한 IDE를 사용하여 .NET 애플리케이션을 작성한 다음, AWS 도구(또는 선택한 IaC)를 사용하여 AWS Lambda에 애플리케이션을 배포합니다.

Lambda 함수가 이벤트에서 호출되면 실행 환경이 생성되고, 초기화 코드(예: 생성자)가 실행된 후 이벤트를 처리하는 코드가 실행됩니다.

코드 실행이 완료되면 실행 환경이 임의의 기간 동안 재사용할 수 있는 상태로 유지됩니다.

다른 이벤트가 도착하면 동일한 실행 환경이 사용되며 초기화 코드는 다시 실행되지 않습니다.

실행 환경을 사용할 수 없는 경우, 새 실행 환경이 생성되고 초기화 코드가 다시 실행됩니다.

AWS Lambda 함수는 현재 .NET Core 3.1 및 .NET 6에 대한 관리형 런타임을 제공합니다. .NET의 다른 버전에서 애플리케이션을 작성하려는 경우, Lambda 사용자 지정 런타임 또는 애플리케이션의 컨테이너 기반 버전을 사용할 수 있습니다.

AWS는 Lambda 함수에 C# 및 F# 프로젝트 템플릿을 제공합니다. 명령줄, Visual Studio, Visual Studio Code, Rider에서 사용할 수 있습니다.

.NET Lambda 함수를 x86_64 및 arm64 프로세서에서 실행할 수 있습니다. 어떤 프로세서 아키텍처를 선택하더라도 애플리케이션 작성 방법에는 영향을 주지 않습니다. 선택한 프로세서에 배포하려면 단일 구성 파라미터를 변경하기만 하면 됩니다.

AWS Lambda의 주요 기능

새로운 언어를 배우지 않아도 됩니다. 기존 C#와 F# 지식을 사용하여 Lambda 함수를 작성할 수 있습니다.

Lambda 함수를 SNS, SQS, S3, Step Functions, DynamoDB 등의 다른 AWS 서비스와 함께 사용하여 이벤트 기반 애플리케이션을 생성할 수 있습니다. 또는 이러한 서비스의 이벤트에 대한 응답으로 사용자 지정 작업을 수행할 수 있습니다.

실행 중인 여러 Lambda 함수를 오케스트레이션해야 하는 경우, AWS Step Functions를 사용할 수 있습니다. Step Functions를 사용하면 Lambda 함수의 실행을 관리하는 상태 머신을 생성할 수 있습니다.

따라서 프로비저닝하거나 관리할 인프라가 없습니다. AWS는 사용자를 대신하여 이 모든 작업을 처리합니다. 사용자는 프로세서 아키텍처와 함수에 할당할 메모리 양만 결정하면 됩니다. AWS는 선택한 메모리에 따라 적절한 CPU 속도, 네트워크 대역폭 및 디스크 I/O를 선택합니다.

Lambda 함수는 가용성이 높고 내결함성이 뛰어나 각 리전의 여러 가용 영역에서 실행됩니다.

AWS Lambda 함수는 이벤트 도착 후 밀리초 이내에 시작되며, 수신 이벤트 볼륨에 맞춰 신속하게 자동으로 규모를 조정할 수 있습니다.

사용한 만큼만 비용을 지불하면 되고 요금은 밀리초 단위로 청구됩니다.

Lambda는 넉넉한 상시 프리 티어를 제공하므로 매월 100만 건의 무료 요청과 매월 40만GB/초의 컴퓨팅 시간을 사용할 수 있습니다.

버스트 트래픽 패턴이 있는 경우, Lambda는 이러한 요구 사항에 맞게 규모를 조정할 수 있으며 트래픽이 감소하면 더 이상 필요하지 않은 리소스에 대해서는 비용을 지불하지 않아도 됩니다.

Lambda는 컴퓨팅 절감형 플랜에 포함되어, 1~3년 동안 일정량의 컴퓨팅 시간을 약정하여 사용하는 대가로 더 저렴한 가격을 제공합니다.

다음 섹션에서는 AWS Lambda를 얼마나 쉽게 시작할 수 있는지 살펴보겠습니다. 몇 분만 작업하면 클라우드에서 두 개의 .NET AWS Lambda 함수를 실행할 수 있습니다.

.NET AWS Lambda 함수를 손쉽게 시작할 수 있다는 것을 보여주는 두 가지 예시

예상 시간: 30분

여기에 제시된 예시를 따라할 수도 있지만 반드시 그럴 필요는 없습니다.

서버리스 기술을 사용해 본 적이 없다면 처음에는 힘들게 느껴질 수 있습니다. 시작하는 방법을 아는 것조차 이해하기 어려울 수 있습니다.

이 짧은 모듈을 마치면 AWS에서 두 개의 .NET Lambda 함수를 설치하고 실행할 수 있게 됩니다.

하나는 명령줄에서 호출하고, 다른 하나는 거의 아무런 노력 없이 설치할 수 있는 공개 HTTPS 엔드포인트를 통해 호출합니다.

명령줄을 사용하여 두 예시를 모두 만들고 빌드 후 배포합니다.

사전 요구 사항

1. AWS 계정.

AWS 계정이 없는 경우, 계정 생성 및 활성화에 대한 이 페이지를 참조하세요. 새 계정을 생성하면 프리 티어가 자동으로 활성화됩니다. 프리 티어는 특정 AWS 서비스를 최대 1회까지 무료로 사용할 수 있게 해줍니다. 여기에서 프리 티어에 대해 자세히 알아보세요.

2. 설치 및 구성된 AWS CLI.

AWS CLI가 없는 경우, 다운로드하여 설치하세요. 그런 다음, 보안 인증 정보와 기본 리전으로 AWS CLI를 구성합니다. 기본 리전 선택은 지리적 위치와 사용하려는 AWS 서비스에 따라 달라집니다. 서비스 이용 가능 여부는 리전에 따라 다릅니다.

AWS 사용자는 AdministratorAccess 정책이 연결되어 있어야 합니다. 자세한 내용은 모듈 3의 권한 관련 참고 사항 섹션을 참조하세요.

3. .NET 6 SDK

.NET 6 SDK가 설치되어 있지 않은 경우, 다운로드하여 설치하세요.

도구 및 템플릿 받기

나중에 나올 모듈에서 사용 가능한 도구 및 템플릿에 대해 자세히 설명하겠지만, 지금은 아래 두 명령을 실행하여 시작할 수 있습니다.

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

데모 1: Lambda 함수의 'Hello World!'

이 함수는 사용자가 작성할 수 있는 가장 기본적인 Lambda 함수로, 입력을 받아 응답을 반환하며 몇 분 안에 시작 및 실행할 수 있습니다.

1단계 - .NET 프로젝트 생성

명령줄/터미널 창에서 다음 명령을 실행하여 새 Lambda 함수를 생성합니다.

dotnet new lambda.EmptyFunction -n HelloLambda

2단계 - Lambda 함수 배포

HelloLambda/src/HelloLambda 디렉터리로 변경합니다.

cd HelloLambda/src/HelloLambda

관심이 있다면, 이 디렉터리의 프로젝트를 여세요. Function.cs라는 파일이 보일 것입니다. 이 위치에 함수를 실행하는 코드가 있습니다. 지금은 파일에서 아무것도 변경하지 마세요.

명령줄에서 다음 명령어를 실행하여 함수를 배포합니다.

dotnet lambda deploy-function --function-name HelloLambda

다음과 같은 출력이 표시됩니다.

Visual Studio용 AWS Toolkit은 ECR 퍼블릭 레지스트리 작업을 지원하지 않으며 프라이빗 레지스트리의 새 리포지토리에 대한 자동 스캔 및 리포지토리 암호화와 같은 기능을 활성화하는 작업을 지원하지 않습니다. 이러한 기능이 필요하다면 AWS Management Console이나 명령줄 도구(예: AWS CLI 및 AWS Tools for PowerShell)를 사용하여 리포지토리를 생성하세요.

이 시점에서 두 가지 중 하나가 일어날 것입니다.

  1. AWS 계정에 역할이 없는 경우, ‘새 IAM 역할의 이름을 입력’할지 묻는 메시지가 표시됩니다. 이름으로 HelloLambdaRole을 사용합니다.
  2. AWS 계정에 역할이 있는 경우, 목록이 표시되지만 아래쪽에 새 IAM 역할 생성에 해당 번호를 입력합니다. 그러면 '새 IAM 역할의 이름 입력'을 요청하는 메시지가 표시됩니다. 이름으로 HelloLambdaRole을 사용합니다.

이제 현재 생성하고 있는 역할에 연결할 수 있는 권한 목록이 표시됩니다. AWSLambdaBasicExecutionRole을 선택합니다. 제 목록의 6번입니다.

역할, 권한 및 Lambda 함수가 생성될 때까지 몇 초 정도 기다리세요.

3단계 - Lambda 함수 호출

명령줄에서 다음을 실행합니다.

dotnet lambda invoke-function --function-name HelloLambda --payload "Hello World!" 

출력에서 다음을 볼 수 있습니다.

이제 작업이 완료되었습니다! 클라우드에 Lambda 함수를 배포했습니다!

4단계 - 정리

Lambda 함수를 사용하면 실행되지 않을 때는 요금이 청구되지 않지만 다른 AWS 서비스와 함께 사용하면 서비스가 유휴 상태인 경우에도 요금이 청구됩니다. 사용하지 않는 리소스는 항상 삭제하는 것이 좋습니다.

다음 명령을 실행하여 Lambda 함수를 만듭니다.

dotnet lambda delete-function --function-name HelloLambda 

단, 이렇게 해도 생성한 역할은 삭제되지 않고 함수만 삭제됩니다.

데모 2: Lambda 함수에서 실행되는 .NET API

이 데모에서는 HTTPS 요청을 처리하는.NET API 애플리케이션을 만들어 보겠습니다. 새로운 최소 API 템플릿을 사용하거나 컨트롤러 템플릿이 포함된 이전의 전체 API를 사용할 수 있습니다. 과정은 동일합니다. .NET 6 최상위 명령문과 API 엔드포인트에 익숙하다면 최소 템플릿인 serverless.AspNetCoreMinimalAPI를 사용하는 것을 고려해 보세요. 최상위 명령문에 익숙하지 않은 경우, 이전 템플릿인 serverless.AspNetCoreWebAPI를 사용하세요.

1단계 - .NET 프로젝트 생성

최소 API 템플릿을 사용하려면 다음 명령어를 실행합니다.

dotnet new serverless.AspNetCoreMinimalAPI -n HelloLambdaAPI

컨트롤러가 포함된 전체 API 템플릿에 더 익숙하다면 다음 명령어를 실행하세요.

dotnet new serverless.AspNetCoreWebAPI -n HelloLambdaAPI

2단계 - S3 버킷 생성

이는 일회성 단계입니다. 3단계 명령어에는 배포와 관련된 파일을 저장할 S3 버킷이 필요합니다.

사용자 계정뿐만 아니라 모든 AWS 계정과 모든 리전에서 고유한 버킷 이름을 생성해야 합니다.

us-east-1을 사용하는 경우 다음 명령을 실행합니다.

aws s3api create-bucket --bucket your-unique-bucket-name1234 

다른 리전을 사용하려면 다음을 실행하세요.

aws s3api create-bucket --bucket your-unique-bucket-name1234 --create-bucket-configuration LocationConstraint=REGION

선택한 버킷 이름을 사용 중인 경우, 다음과 같은 오류가 표시됩니다.

CreateBucket 작업을 호출하는 동안 오류가 발생했습니다(BucketAlreadyExists). 요청된 버킷 이름을 사용할 수 없습니다. 버킷 네임스페이스는 시스템의 모든 사용자가 공유합니다. 다른 이름을 선택하고 다시 시도하세요.

3단계 - Lambda 함수 배포

HelloLambdaAPI/src/HelloLambdaAPI 디렉터리로 변경합니다.

명령줄에서 다음 명령어를 실행하여 함수를 배포합니다.

dotnet lambda deploy-serverless --stack-name HelloLambdaAPI --s3-bucket your-unique-bucket-name1234

잠시 기다려 주세요...

빌드 및 배포 프로세스와 관련된 몇 가지 출력이 표시되며, 마지막에는 다음 링크가 나옵니다.

Output Name                    Value
------------------------------ --------------------------------------------------
ApiURL                         https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/

브라우저에서 엽니다. 선택한 프로젝트 템플릿에 따라 아래 메시지 중 하나가 표시됩니다.

4단계 - 정리

Lambda 함수 및 관련 리소스를 제거하려면 다음 명령어를 실행합니다.

dotnet lambda delete-serverless HelloLambdaAPI

결론

훌륭합니다. 단 몇 분 만에 두 개의 Lambda 함수를 배포했습니다. .NET Lambda 함수를 이렇게 쉽게 시작할 수 있습니다!

이 페이지의 내용이 도움이 되었나요?

.NET 개발을 위한 도구