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

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

출처: AWS Lambda 개발자 안내서 Lambda에서 컨텍스트 객체는 호출, 함수, 실행 환경에 대한 정보를 담은 메서드와 속성을 제공해요. Lambda가 함수를 실행할 때 핸들러에 컨텍스트 객체를 전달해요. 핸들러에서 컨텍스트 객체를 사용하려면 선택적으로 핸들러의 입력 매개변수로 선언할 수 있어요. 핸들러에서 다음 작업을 하려면 컨텍스트 객체가 필요해요.

주제(Topics)

컨텍스트 객체에서 지원하는 변수, 메서드, 속성

Lambda 컨텍스트 라이브러리는 다음 전역 변수, 메서드, 속성을 제공해요.

전역 변수(Global variables)

  • FunctionName – Lambda 함수의 이름이에요.
  • FunctionVersion – 함수의 버전이에요.
  • MemoryLimitInMB – 함수에 할당된 메모리 용량이에요.
  • LogGroupName – 함수의 로그 그룹이에요.
  • LogStreamName – 함수 인스턴스의 로그 스트림이에요.

컨텍스트 메서드(Context methods)

  • Deadline – 실행이 타임아웃되는 날짜를 Unix 시간(밀리초)으로 반환해요.

컨텍스트 속성(Context properties)

  • InvokedFunctionArn – 함수를 호출할 때 사용되는 Amazon Resource Name(ARN)이에요. 호출자가 버전 번호나 별칭(alias)을 지정했는지도 알려줘요.
  • AwsRequestID – 호출 요청의 식별자예요.
  • Identity – (모바일 앱) 요청을 승인한 Amazon Cognito 자격 증명에 대한 정보예요.
  • ClientContext – (모바일 앱) 클라이언트 애플리케이션이 Lambda에 제공한 클라이언트 컨텍스트예요.

호출 컨텍스트 정보 접근

Lambda 함수는 자신의 환경과 호출 요청에 대한 메타데이터에 접근할 수 있어요. 이 메타데이터는 Package context에서 접근할 수 있어요. 핸들러가 매개변수로 context.Context를 포함하면 Lambda는 함수에 대한 정보를 컨텍스트의 Value 속성에 삽입해요. context.Context 객체의 내용에 접근하려면 lambdacontext 라이브러리를 import해야 해요.

package main
 
import (
        "context"
        "log"
        "github.com/aws/aws-lambda-go/lambda"
        "github.com/aws/aws-lambda-go/lambdacontext"
)
 
func CognitoHandler(ctx context.Context) {
        lc, _ := lambdacontext.FromContext(ctx)
        log.Print(lc.Identity.CognitoIdentityPoolID)
}
 
func main() {
        lambda.Start(CognitoHandler)
}

위 예시에서 lc는 컨텍스트 객체가 캡처한 정보를 소비하는 데 사용하는 변수이고, log.Print(lc.Identity.CognitoIdentityPoolID)는 그 정보(여기서는 CognitoIdentityPoolID)를 출력해요.

다음 예시는 컨텍스트 객체를 사용해서 Lambda 함수가 완료되는 데 걸리는 시간을 모니터링하는 방법을 보여줘요. 이렇게 하면 성능 기대치를 분석하고 필요에 따라 함수 코드를 조정할 수 있어요.

package main

import (
        "context"
        "log"
        "time"
        "github.com/aws/aws-lambda-go/lambda"
)

func LongRunningHandler(ctx context.Context) (string, error) {

        deadline, _ := ctx.Deadline()
        deadline = deadline.Add(-100 * time.Millisecond)
        timeoutChannel := time.After(time.Until(deadline))

        for {

                select {

                case <- timeoutChannel:
                        return "Finished before timing out.", nil

                default:
                        log.Print("hello!")
                        time.Sleep(50 * time.Millisecond)
                }
        }
}

func main() {
        lambda.Start(LongRunningHandler)
}

AWS SDK 클라이언트 초기화 및 호출에서 컨텍스트 사용

핸들러가 AWS SDK for Go를 사용해 다른 서비스에 호출해야 한다면 컨텍스트 객체를 핸들러의 입력으로 포함하세요. AWS에서 대부분의 AWS SDK 호출에 컨텍스트 객체를 전달하는 것이 모범 사례예요. 예를 들어 Amazon S3 PutObject 호출은 첫 번째 인수로 컨텍스트 객체(ctx)를 받아요.

// Upload an object to S3
    _, err = s3Client.PutObject(ctx, &s3.PutObjectInput{
        ...
    })

SDK 클라이언트를 올바르게 초기화하려면 컨텍스트 객체를 사용해서 올바른 구성을 로드한 다음 그 구성 객체를 클라이언트에 전달할 수도 있어요.

// Load AWS SDK configuration using the default credential provider chain
    cfg, err := config.LoadDefaultConfig(ctx)
    ...
    s3Client = s3.NewFromConfig(cfg)

SDK 클라이언트를 메인 핸들러 밖(즉 초기화 단계)에서 초기화하려면 자리 표시자(placeholder) 컨텍스트 객체를 전달할 수 있어요.

func init() {
	// Initialize the S3 client outside of the handler, during the init phase
	cfg, err := config.LoadDefaultConfig(context.TODO())
	...
	s3Client = s3.NewFromConfig(cfg)
}

이런 방식으로 클라이언트를 초기화하면 메인 핸들러의 SDK 호출에서 올바른 컨텍스트 객체를 전달해야 해요.

더 알아보기 (Learn more)

Go 핸들러에 대한 자세한 내용은 Go 핸들러를 참고하세요.