컨테이너 이미지를 사용하여 .NET Lambda 함수 배포
.NET Lambda 함수의 컨테이너 이미지를 빌드하는 세 가지 방법이 있습니다.
-
AWS 기본 이미지에는 언어 런타임, Lambda와 함수 코드 간의 상호 작용을 관리하는 런타임 인터페이스 클라이언트 및 로컬 테스트를 위한 런타임 인터페이스 에뮬레이터가 미리 로드되어 있습니다.
-
AWS OS 전용 기본 이미지
는 Amazon Linux 배포판 및 런타임 인터페이스 에뮬레이터 를 포함합니다. 이러한 이미지는 일반적으로 Go 및 Rust와 같은 컴파일된 언어의 컨테이너 이미지와 Lambda가 기본 이미지를 제공하지 않는 언어 또는 언어 버전(예: Node.js 19)의 컨테이너 이미지를 생성하는 데 사용됩니다. OS 전용 기본 이미지를 사용하여 사용자 지정 런타임을 구현할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 .NET용 런타임 인터페이스 클라이언트를 이미지에 포함해야 합니다. -
Alpine Linux, Debian 등의 다른 컨테이너 레지스트리의 대체 기본 이미지를 사용할 수 있습니다. 조직에서 생성한 사용자 지정 이미지를 사용할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 .NET용 런타임 인터페이스 클라이언트를 이미지에 포함해야 합니다.
작은 정보
Lambda 컨테이너 함수가 활성 상태가 되는 데 걸리는 시간을 줄이려면 Docker 설명서의 다단계 빌드 사용
이 페이지에서는 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년 12월 20일 |
Amazon ECR 리포지토리: gallery.ecr.aws/lambda/dotnet
.NET용 AWS 기본 이미지 사용
사전 조건
이 섹션의 단계를 완료하려면 다음이 필요합니다.
기본 이미지를 사용하여 이미지 생성 및 배포
다음 단계에서는 Amazon.Lambda.Templates
-
Amazon.Lambda.Templates
NuGet 패키지를 설치합니다. dotnet new install Amazon.Lambda.Templates
-
lambda.image.EmptyFunction
템플릿을 사용하여.NET 프로젝트를 생성합니다.dotnet new lambda.image.EmptyFunction --name
MyFunction
--regionus-east-1
-
디렉터리로 이동합니다. 여기에 프로젝트 파일이 저장됩니다. 다음 파일을 검사합니다.MyFunction
/src/MyFunction
-
aws-lambda-tools-defaults.json – Lambda 함수를 배포할 때 이 파일에 명령줄 옵션을 지정합니다.
-
Function.cs - Lambda 핸들러 함수 코드입니다. 기본
Amazon.Lambda.Core
라이브러리와 기본LambdaSerializer
속성을 포함하는 C# 템플릿입니다. 직렬화 요구 사항들과 옵션에 대한 자세한 내용은 Lambda 함수의 직렬화 섹션을 참조하세요. 제공된 코드를 테스트에 사용하거나 사용자 고유의 코드로 바꿀 수 있습니다. -
MyFunction.csproj - 애플리케이션을 구성하는 파일과 어셈블리가 나열된 .NET 프로젝트 파일
입니다. -
Readme.md - 이 파일에는 샘플 Lambda 함수에 대한 자세한 정보가 들어 있습니다.
-
-
src/
디렉터리에서 Dockerfile을 검사합니다. 제공된 Dockerfile을 테스트에 사용하거나 사용자 고유의 Dockerfile로 바꿀 수 있습니다. 사용자 고유의 Dockerfile을 사용하는 경우 다음 사항을 확인하세요.MyFunction
-
FROM
속성을 기본 이미지의 URI로 설정합니다. .NET 버전이 기본 이미지의 버전과 일치해야 합니다. -
CMD
인수를 Lambda 함수 핸들러로 설정합니다.aws-lambda-tools-defaults.json
의image-command
와 일치해야 합니다.
참고로 Dockerfile 예제에는 USER 지침
이 포함되어 있지 않습니다. Lambda에 컨테이너 이미지를 배포할 때 Lambda는 권한이 최소 권한인 기본 Linux 사용자를 자동으로 정의합니다. 이는 USER
지침이 제공되지 않을 때root
사용자에게 기본 설정이 적용되는 표준 Docker 동작과는 다릅니다.예 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
" ] -
-
Amazon.Lambda.Tools .NET 글로벌 도구
를 설치합니다. dotnet tool install -g Amazon.Lambda.Tools
Amazon.Lambda.Tools가 이미 설치되어 있는 경우 최신 버전이 설치되어 있는지 확인합니다.
dotnet tool update -g Amazon.Lambda.Tools
-
아직 이동하지 않은 경우 디렉터리를
으로 변경합니다.MyFunction
/src/MyFunction
cd src/
MyFunction
-
Amazon.Lambda.Tools를 사용하여 도커 이미지를 빌드하고 새 Amazon ECR 리포지토리로 푸시하고 Lambda 함수를 배포합니다.
--function-role
로 함수에 대한 실행 역할의 Amazon 리소스 이름(ARN)이 아닌 역할 이름을 지정합니다. 예:lambda-role
.dotnet lambda deploy-function
MyFunction
--function-rolelambda-role
Amazon.Lambda.Tools .NET 글로벌에 대한 자세한 내용은 GitHub의 AWS .NET CLI용 확장
리포지토리를 참조하세요. -
함수를 호출합니다.
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 -
Lambda 함수를 삭제합니다.
dotnet lambda delete-function
MyFunction
런타임 인터페이스 클라이언트에서 대체 기본 이미지 사용
OS 전용 기본 이미지나 대체 기본 이미지를 사용하는 경우 이미지에 런타임 인터페이스 클라이언트를 포함해야 합니다. 런타임 인터페이스 클라이언트는 Lambda와 함수 코드 간의 상호 작용을 관리하는 사용자 지정 런타임을 위한 Lambda 런타임 API 사용을 확장합니다.
다음 예제에서는 비 AWS 기본 이미지를 사용하여.NET용 컨테이너 이미지를 빌드하는 방법과 .NET용 Lambda 런타임 인터페이스 클라이언트인 Amazon.Lambda.RuntimeSupport 패키지
사전 조건
이 섹션의 단계를 완료하려면 다음이 필요합니다.
대체 기본 이미지를 사용하여 이미지 생성 및 배포
-
Amazon.Lambda.Templates
NuGet 패키지를 설치합니다. dotnet new install Amazon.Lambda.Templates
-
lambda.CustomRuntimeFunction
템플릿을 사용하여.NET 프로젝트를 생성합니다. 이 템플릿에는 Amazon.Lambda.RuntimeSupport패키지가 포함되어 있습니다. dotnet new lambda.CustomRuntimeFunction --name
MyFunction
--regionus-east-1
-
디렉터리로 이동합니다. 여기에 프로젝트 파일이 저장됩니다. 다음 파일을 검사합니다.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 함수에 대한 자세한 정보가 들어 있습니다.
-
-
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"
} -
-
디렉터리에 Dockerfile을 생성합니다. 다음 예제 Dockerfile은 AWS 기본 이미지 대신 Microsoft .NET 기본 이미지를 사용합니다.MyFunction
/src/MyFunction
-
FROM
속성을 기본 이미지 식별자로 설정합니다. .NET 버전이 기본 이미지의 버전과 일치해야 합니다. -
COPY
명령을 사용하여 함수를/var/task
디렉터리에 복사합니다. -
Docker 컨테이너가 시작될 때 실행할 모듈로
ENTRYPOINT
를 설정합니다. 이 경우 모듈은Amazon.Lambda.RuntimeSupport
라이브러리를 초기화하는 부트스트랩입니다.
참고로 Dockerfile 예제에는 USER 지침
이 포함되어 있지 않습니다. Lambda에 컨테이너 이미지를 배포할 때 Lambda는 권한이 최소 권한인 기본 Linux 사용자를 자동으로 정의합니다. 이는 USER
지침이 제공되지 않을 때root
사용자에게 기본 설정이 적용되는 표준 Docker 동작과는 다릅니다.예 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
"] -
-
Amazon.Lambda.Tools .NET 글로벌 도구 확장
을 설치합니다. dotnet tool install -g Amazon.Lambda.Tools
Amazon.Lambda.Tools가 이미 설치되어 있는 경우 최신 버전이 설치되어 있는지 확인합니다.
dotnet tool update -g Amazon.Lambda.Tools
-
Amazon.Lambda.Tools를 사용하여 도커 이미지를 빌드하고 새 Amazon ECR 리포지토리로 푸시하고 Lambda 함수를 배포합니다.
--function-role
로 함수에 대한 실행 역할의 Amazon 리소스 이름(ARN)이 아닌 역할 이름을 지정합니다. 예:lambda-role
.dotnet lambda deploy-function
MyFunction
--function-rolelambda-role
Amazon.Lambda.Tools .NET CLI 확장에 대한 자세한 내용은 GitHub의 AWS Extensions for .NET CLI
리포지토리를 참조하세요. -
함수를 호출합니다.
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 -
Lambda 함수를 삭제합니다.
dotnet lambda delete-function
MyFunction