Lambda 관리형 인스턴스용 .NET 런타임
.NET 런타임의 경우 Lambda 관리형 인스턴스는 실행 환경당 단일 .NET 프로세스를 사용합니다. 여러 동시 요청은 .NET 태스크를 사용하여 처리됩니다.
동시성 구성
Lambda가 각 실행 환경에 보내는 최대 동시 요청 수는 함수 구성의 PerExecutionEnvironmentMaxConcurrency 설정으로 제어됩니다. 이 설정은 선택 사항이며, 기본값은 런타임에 따라 달라집니다. .NET 런타임의 경우 기본값은 vCPU당 32개 동시 요청으로, 또는 자체 값을 구성할 수 있습니다. Lambda는 각 실행 환경의 용량에 따라 구성된 최대 수까지 동시 요청 수를 자동으로 조정하여 이러한 요청을 수용합니다.
다중 동시성 함수 빌드
Lambda 관리형 인스턴스를 사용할 때는 다른 다중 동시성 환경에서와 동일한 동시성 안전 관행을 적용해야 합니다. 핸들러 객체는 모든 태스크에서 공유되므로 변경 가능한 상태는 스레드 안전 상태여야 합니다. 여기에는 컬렉션, 데이터베이스 연결 및 요청 처리 도중 수정된 모든 정적 객체가 포함됩니다.
AWS SDK 클라이언트는 스레드 안전 상태이기에 별도의 처리가 필요하지 않습니다.
예제: 데이터베이스 연결 풀
다음 코드는 동시 요청 간에 공유되는 정적 데이터베이스 연결 객체를 사용합니다. SqlConnection 객체는 스레드 안전 상태가 아닙니다.
public class DBQueryHandler { // Single connection shared across threads - NOT SAFE private SqlConnection connection; public DBQueryHandler() { connection = new SqlConnection("your-connection-string-here"); connection.Open(); } public string Handle(object input, ILambdaContext context) { using var cmd = connection.CreateCommand(); cmd.CommandText = "SELECT ..."; // your query using var reader = cmd.ExecuteReader(); ... } }
이를 해결하려면 연결 풀에서 가져온 각 요청에 대해 별도의 연결을 사용합니다. Microsoft.Data.SqlClient와 같은 ADO.NET 공급자는 연결 객체가 열릴 때 연결 풀링을 자동으로 지원합니다.
public class DBQueryHandler { public DBQueryHandler() { } public string Handle(object input, ILambdaContext context) { using var connection = new SqlConnection("your-connection-string-here"); connection.Open(); using var cmd = connection.CreateCommand(); cmd.CommandText = "SELECT ..."; // your query using var reader = cmd.ExecuteReader(); ... } }
예제: 컬렉션
표준 .NET 컬렉션은 스레드에 있어 안전하지 않습니다.
public class Handler { private static List<string> items = new List<string>(); private static Dictionary<string, object> cache = new Dictionary<string, object>(); public string FunctionHandler(object input, ILambdaContext context) { items.Add(context.AwsRequestId); cache["key"] = input; return "Success"; } }
동시성 안전을 위해 System.Collections.Concurrent 네임스페이스의 컬렉션을 사용합니다.
public class Handler { private static ConcurrentBag<string> items = new ConcurrentBag<string>(); private static ConcurrentDictionary<string, object> cache = new ConcurrentDictionary<string, object>(); public string FunctionHandler(object input, ILambdaContext context) { items.Add(context.AwsRequestId); cache["key"] = input; return "Success"; } }
공유 /tmp 디렉터리
/tmp 디렉터리는 실행 환경의 모든 동시 요청에서 공유됩니다. 동일한 파일에 대한 동시 쓰기로 인해 다른 요청이 파일을 덮어쓰는 등 데이터가 손상될 수 있습니다. 이를 해결하려면 공유 파일에 대한 파일 잠금을 구현하거나 요청당 고유한 파일 이름을 사용하여 충돌을 방지합니다. 사용 가능한 공간이 소진되지 않도록 불필요한 파일을 정리해야 합니다.
로깅
다중 동시 시스템에서는 로그 인터리브(로그에서 서로 다른 요청의 로그 항목이 인터리브됨)가 정상적인 동작입니다. Lambda 관리형 인스턴스를 사용하는 함수는 항상 고급 로깅 제어가 도입된 구조화된 JSON 로그 형식을 사용합니다. 이 형식에는 requestId가 포함되어 로그 항목을 단일 요청과 연관시킬 수 있습니다. context.Logger 객체를 사용하여 로그를 생성하면 requestId가 각 로그 항목에 자동으로 포함됩니다. 자세한 내용은 .NET에서 Lambda 고급 로깅 제어 사용을 참조하세요.
요청 컨텍스트
context.AwsRequestId 속성을 사용하면 현재 요청의 요청 ID에 액세스할 수 있습니다.
context.TraceId 속성을 사용하면 X-Ray 트레이스 ID에 액세스할 수 있습니다. 이렇게 하면 현재 요청의 트레이스 ID에 대한 동시성 안전 액세스 권한이 제공됩니다. Lambda는 Lambda 관리형 인스턴스에서 _X_AMZN_TRACE_ID 환경 변수를 지원하지 않습니다. AWS SDK를 사용할 때 X-Ray 트레이스 ID가 자동으로 전파됩니다.
초기화 및 종료
함수 초기화는 실행 환경당 한 번 발생합니다. 초기화 도중 생성된 객체는 요청 간에 공유됩니다.
확장이 포함된 Lambda 함수의 경우 실행 환경은 종료 중에 SIGTERM 신호를 내보냅니다. 이 신호는 확장에서 버퍼 비우기와 같은 정리 태스크를 트리거하는 데 사용됩니다. SIGTERM 이벤트를 구독하여 데이터베이스 연결 종료와 같은 함수 정리 태스크를 트리거할 수 있습니다. 실행 환경 수명 주기에 대한 자세한 내용은 Lambda 실행 환경 수명 주기 이해를 참조하세요.
종속성 버전
Lambda 관리형 인스턴스에는 다음과 같은 최소 패키지 버전이 필요합니다.
-
Amazon.Lambda.Core: 버전 2.7.1 이상
-
Amazon.Lambda.RuntimeSupport: 버전 1.14.1 이상
-
OpenTelemetry.Instrumentation.AWSLambda: 버전 1.14.0 이상
-
AWSXRayRecorder.Core: 버전 2.16.0 이상
-
AWSSDK.Core: 버전 4.0.0.32 이상
Powertools for AWS Lambda(.NET)
Powertools for AWS Lambda(.NET) 및 AWS Distro for OpenTelemetry - Instrumentation for DotNet