C# 함수 정보를 가져오는 Lambda 컨텍스트 객체 사용하기

C# 함수 정보를 가져오는 Lambda 컨텍스트 객체 사용하기

Lambda가 함수를 실행할 때 핸들러에 컨텍스트 객체를 전달해요. 이 객체는 호출, 함수, 실행 환경에 대한 정보를 담은 속성을 제공해요.

출처: AWS Lambda 개발자 안내서

본문

컨텍스트 속성(Context properties)

  • FunctionName – Lambda 함수의 이름이에요.
  • FunctionVersion – 함수의 버전이에요.
  • InvokedFunctionArn – 함수를 호출할 때 사용되는 Amazon Resource Name(ARN)이에요. 호출자가 버전 번호나 별칭(alias)을 지정했는지도 알려줘요.
  • MemoryLimitInMB – 함수에 할당된 메모리 용량이에요.
  • AwsRequestId – 호출 요청의 식별자예요.
  • LogGroupName – 함수의 로그 그룹이에요.
  • LogStreamName – 함수 인스턴스의 로그 스트림이에요.
  • RemainingTime(TimeSpan) – 실행이 타임아웃되기까지 남은 시간(밀리초)이에요.
  • Identity – (모바일 앱) 요청을 승인한 Amazon Cognito 자격 증명에 대한 정보예요.
  • ClientContext – (모바일 앱) 클라이언트 애플리케이션이 Lambda에 제공한 클라이언트 컨텍스트예요.
  • Logger – 함수의 로거 객체예요.

ILambdaContext 객체의 정보를 사용해서 모니터링 목적으로 함수 호출에 대한 정보를 출력할 수 있어요. 다음 코드는 컨텍스트 정보를 구조화된 로깅 프레임워크에 추가하는 방법의 예시예요. 이 예시에서 함수는 AwsRequestId를 로그 출력에 추가해요. 함수는 또한 RemainingTime 속성을 사용해서 Lambda 함수 타임아웃이 임박했을 때 진행 중인 작업(inflight task)을 취소해요.

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace GetProductHandler;

public class Function
{
    private readonly IDatabaseRepository _repo;
    
    public Function()
    {
        this._repo = new DatabaseRepository();
    }
    
    public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        Logger.AppendKey("AwsRequestId", context.AwsRequestId);
        
        var id = request.PathParameters["id"];

        using var cts = new CancellationTokenSource();
        
        try
        {
            cts.CancelAfter(context.RemainingTime.Add(TimeSpan.FromSeconds(-1)));
            
            var databaseRecord = await this._repo.GetById(id, cts.Token);
            
            return new APIGatewayProxyResponse 
            {
                StatusCode = (int)HttpStatusCode.OK,
                Body = JsonSerializer.Serialize(databaseRecord)
            };
        }
        catch (Exception ex)
        {
            return new APIGatewayProxyResponse 
            {
                StatusCode = (int)HttpStatusCode.InternalServerError,
                Body = JsonSerializer.Serialize(new { error = ex.Message })
            };
        }
        finally
        {
            cts.Cancel();
        }
    }
}

더 알아보기 (Learn more)

C# 로깅에 대한 자세한 내용은 C# 함수의 로깅을 참고하세요.