컨테이너 이미지를 사용하여 .NET Lambda 함수 배포 - AWS Lambda

컨테이너 이미지를 사용하여 .NET Lambda 함수 배포

.NET Lambda 함수의 컨테이너 이미지를 빌드하는 세 가지 방법이 있습니다.

작은 정보

Lambda 컨테이너 함수가 활성 상태가 되는 데 걸리는 시간을 줄이려면 Docker 설명서의 다단계 빌드 사용을 참조하세요. 효율적인 컨테이너 이미지를 빌드하려면 Dockerfile 작성 모범 사례를 따르세요.

이 페이지에서는 Lambda용 컨테이너 이미지를 빌드, 테스트 및 배포하는 방법을 설명합니다.

.NET용 AWS 기본 이미지

AWS는 .NET에 대한 다음과 같은 기본 이미지를 제공합니다.

태그 런타임 운영 체제 Dockerfile 사용 중단

8

.NET 8 Amazon Linux 2023 GitHub의 .NET 8용 Dockerfile

6

.NET 6 Amazon Linux 2 GitHub의 .NET 6용 Dockerfile

2024년 11월 12일

Amazon ECR 리포지토리: gallery.ecr.aws/lambda/dotnet

.NET용 AWS 기본 이미지 사용

필수 조건

이 섹션의 단계를 완료하려면 다음이 필요합니다.

  • .NET SDK - 다음 단계에서는 .NET 8 기본 이미지를 사용합니다. .NET 버전이 Dockerfile에 지정한 기본 이미지의 버전과 일치하는지 확인하세요.

  • Docker

기본 이미지를 사용하여 이미지 생성 및 배포

다음 단계에서는 Amazon.Lambda.TemplatesAmazon.Lambda.Tools를 사용하여 .NET 프로젝트를 생성합니다. 그런 다음 도커 이미지를 빌드하고 Amazon ECR에 업로드하고 Lambda 함수에 배포합니다.

  1. Amazon.Lambda.Templates NuGet 패키지를 설치합니다.

    dotnet new install Amazon.Lambda.Templates
  2. lambda.image.EmptyFunction 템플릿을 사용하여.NET 프로젝트를 생성합니다.

    dotnet new lambda.image.EmptyFunction --name MyFunction --region us-east-1
  3. MyFunction/src/MyFunction 디렉터리로 이동합니다. 여기에 프로젝트 파일이 저장됩니다. 다음 파일을 검사합니다.

    • aws-lambda-tools-defaults.json – Lambda 함수를 배포할 때 이 파일에 명령줄 옵션을 지정합니다.

    • Function.cs - Lambda 핸들러 함수 코드입니다. 기본 Amazon.Lambda.Core 라이브러리와 기본 LambdaSerializer 속성을 포함하는 C# 템플릿입니다. 직렬화 요구 사항들과 옵션에 대한 자세한 내용은 Lambda 함수의 직렬화 섹션을 참조하세요. 제공된 코드를 테스트에 사용하거나 사용자 고유의 코드로 바꿀 수 있습니다.

    • MyFunction.csproj - 애플리케이션을 구성하는 파일과 어셈블리가 나열된 .NET 프로젝트 파일입니다.

    • Readme.md - 이 파일에는 샘플 Lambda 함수에 대한 자세한 정보가 들어 있습니다.

  4. src/MyFunction 디렉터리에서 Dockerfile을 검사합니다. 제공된 Dockerfile을 테스트에 사용하거나 사용자 고유의 Dockerfile로 바꿀 수 있습니다. 사용자 고유의 Dockerfile을 사용하는 경우 다음 사항을 확인하세요.

    • FROM 속성을 기본 이미지의 URI로 설정합니다. .NET 버전이 기본 이미지의 버전과 일치해야 합니다.

    • CMD 인수를 Lambda 함수 핸들러로 설정합니다. aws-lambda-tools-defaults.jsonimage-command와 일치해야 합니다.

    예 Dockerfile
    # You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM public.ecr.aws/lambda/dotnet:8 # Copy function code to Lambda-defined environment variable COPY publish/* ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "MyFunction::MyFunction.Function::FunctionHandler" ]
  5. Amazon.Lambda.Tools .NET 글로벌 도구를 설치합니다.

    dotnet tool install -g Amazon.Lambda.Tools

    Amazon.Lambda.Tools가 이미 설치되어 있는 경우 최신 버전이 설치되어 있는지 확인합니다.

    dotnet tool update -g Amazon.Lambda.Tools
  6. 아직 이동하지 않은 경우 디렉터리를 MyFunction/src/MyFunction으로 변경합니다.

    cd src/MyFunction
  7. Amazon.Lambda.Tools를 사용하여 도커 이미지를 빌드하고 새 Amazon ECR 리포지토리로 푸시하고 Lambda 함수를 배포합니다.

    --function-role로 함수에 대한 실행 역할의 Amazon 리소스 이름(ARN)이 아닌 역할 이름을 지정합니다. 예를 들면 lambda-role입니다.

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    Amazon.Lambda.Tools .NET 글로벌에 대한 자세한 내용은 GitHub의 AWS .NET CLI용 확장 리포지토리를 참조하세요.

  8. 함수를 호출합니다.

    dotnet lambda invoke-function MyFunction --payload "Testing the function"

    모든 것이 성공하면 다음을 볼 수 있습니다.

    Payload: "TESTING THE FUNCTION" Log Tail: START RequestId: id Version: $LATEST END RequestId: id REPORT RequestId: id Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB
  9. Lambda 함수를 삭제합니다.

    dotnet lambda delete-function MyFunction

런타임 인터페이스 클라이언트에서 대체 기본 이미지 사용

OS 전용 기본 이미지나 대체 기본 이미지를 사용하는 경우 이미지에 런타임 인터페이스 클라이언트를 포함해야 합니다. 런타임 인터페이스 클라이언트는 Lambda와 함수 코드 간의 상호 작용을 관리하는 Lambda 런타임 API을 확장합니다.

다음 예제에서는 비 AWS 기본 이미지를 사용하여.NET용 컨테이너 이미지를 빌드하는 방법과 .NET용 Lambda 런타임 인터페이스 클라이언트인 Amazon.Lambda.RuntimeSupport 패키지를 추가하는 방법을 보여줍니다. 예제 Dockerfile에서는 Microsoft .NET 8 기본 이미지를 사용합니다.

필수 조건

이 섹션의 단계를 완료하려면 다음이 필요합니다.

  • .NET SDK - 다음 단계에서는 .NET 8 기본 이미지를 사용합니다. .NET 버전이 Dockerfile에 지정한 기본 이미지의 버전과 일치하는지 확인하세요.

  • Docker

대체 기본 이미지를 사용하여 이미지 생성 및 배포

  1. Amazon.Lambda.Templates NuGet 패키지를 설치합니다.

    dotnet new install Amazon.Lambda.Templates
  2. lambda.CustomRuntimeFunction 템플릿을 사용하여.NET 프로젝트를 생성합니다. 이 템플릿에는 Amazon.Lambda.RuntimeSupport 패키지가 포함되어 있습니다.

    dotnet new lambda.CustomRuntimeFunction --name MyFunction --region us-east-1
  3. MyFunction/src/MyFunction 디렉터리로 이동합니다. 여기에 프로젝트 파일이 저장됩니다. 다음 파일을 검사합니다.

    • aws-lambda-tools-defaults.json – Lambda 함수를 배포할 때 이 파일에 명령줄 옵션을 지정합니다.

    • Function.cs - 이 코드에는 Amazon.Lambda.RuntimeSupport 라이브러리를 부트스트랩으로 초기화하는 Main 메서드가 있는 클래스가 포함되어 있습니다. Main 메서드는 함수 프로세스의 진입점입니다. Main 메서드는 부트스트랩이 작업할 수 있는 래퍼로 함수 처리기를 래핑합니다. 자세한 내용은 GitHub 리포지토리의 Using Amazon.Lambda.RuntimeSupport as a class library를 참조하세요.

    • MyFunction.csproj - 애플리케이션을 구성하는 파일과 어셈블리가 나열된 .NET 프로젝트 파일입니다.

    • Readme.md - 이 파일에는 샘플 Lambda 함수에 대한 자세한 정보가 들어 있습니다.

  4. aws-lambda-tools-defaults.json 파일을 열고 다음 줄을 추가합니다.

    "package-type": "image", "docker-host-build-output-dir": "./bin/Release/lambda-publish"
    • package-type: 배포 패키지를 컨테이너 이미지로 정의합니다.

    • docker-host-build-output-dir: 빌드 프로세스의 출력 디렉터리를 설정합니다.

    예 aws-lambda-tools-defaults.json
    { "Information": [ "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", "dotnet lambda help", "All the command line options for the Lambda command can be specified in this file." ], "profile": "", "region": "us-east-1", "configuration": "Release", "function-runtime": "provided.al2023", "function-memory-size": 256, "function-timeout": 30, "function-handler": "bootstrap", "msbuild-parameters": "--self-contained true", "package-type": "image", "docker-host-build-output-dir": "./bin/Release/lambda-publish" }
  5. MyFunction/src/MyFunction 디렉터리에 Dockerfile을 생성합니다. 다음 예제 Dockerfile은 AWS 기본 이미지 대신 Microsoft .NET 기본 이미지를 사용합니다.

    • FROM 속성을 기본 이미지 식별자로 설정합니다. .NET 버전이 기본 이미지의 버전과 일치해야 합니다.

    • COPY 명령을 사용하여 함수를 /var/task 디렉터리에 복사합니다.

    • Docker 컨테이너가 시작될 때 실행할 모듈로 ENTRYPOINT를 설정합니다. 이 경우 모듈은 Amazon.Lambda.RuntimeSupport 라이브러리를 초기화하는 부트스트랩입니다.

    예 Dockerfile
    # You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM mcr.microsoft.com/dotnet/runtime:8.0 # Set the image's internal work directory WORKDIR /var/task # Copy function code to Lambda-defined environment variable COPY "bin/Release/net8.0/linux-x64" . # Set the entrypoint to the bootstrap ENTRYPOINT ["/usr/bin/dotnet", "exec", "/var/task/bootstrap.dll"]
  6. Amazon.Lambda.Tools .NET 글로벌 도구 확장을 설치합니다.

    dotnet tool install -g Amazon.Lambda.Tools

    Amazon.Lambda.Tools가 이미 설치되어 있는 경우 최신 버전이 설치되어 있는지 확인합니다.

    dotnet tool update -g Amazon.Lambda.Tools
  7. Amazon.Lambda.Tools를 사용하여 도커 이미지를 빌드하고 새 Amazon ECR 리포지토리로 푸시하고 Lambda 함수를 배포합니다.

    --function-role로 함수에 대한 실행 역할의 Amazon 리소스 이름(ARN)이 아닌 역할 이름을 지정합니다. 예를 들면 lambda-role입니다.

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    Amazon.Lambda.Tools .NET CLI 확장에 대한 자세한 내용은 GitHub의 AWS Extensions for .NET CLI 리포지토리를 참조하세요.

  8. 함수를 호출합니다.

    dotnet lambda invoke-function MyFunction --payload "Testing the function"

    모든 것이 성공하면 다음을 볼 수 있습니다.

    Payload: "TESTING THE FUNCTION" Log Tail: START RequestId: id Version: $LATEST END RequestId: id REPORT RequestId: id Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB
  9. Lambda 함수를 삭제합니다.

    dotnet lambda delete-function MyFunction