AWS Lambda 함수 핸들러(Go) - AWS Lambda

AWS Lambda 함수 핸들러(Go)

Lambda 함수의 핸들러는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다. 핸들러가 존재하거나 응답을 반환할 때, 또 다른 이벤트를 처리하기 위해 사용할 수 있게 됩니다.

Go에서 작성된 Lambda 함수는 Go 실행 파일로 작성됩니다. Lambda 함수 코드에서는 github.com/aws/aws-lambda-go/lambda 패키지를 포함해야 합니다. 이 패키지는 Go용 Lambda 프로그래밍 모델을 구현합니다. 또한 핸들러 함수 코드와 main() 함수를 구현해야 합니다.

package main import ( "fmt" "context" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"name"` } func HandleRequest(ctx context.Context, name MyEvent) (string, error) { return fmt.Sprintf("Hello %s!", name.Name ), nil } func main() { lambda.Start(HandleRequest) }

다음을 참조하세요.

  • package main: Go에서 func main()을 포함하는 패키지의 이름은 항상 main으로 지정해야 합니다.

  • import: 이 명령을 사용하면 Lambda 함수에 필요한 라이브러리를 포함시킬 수 있습니다. 이 인스턴스에서는 다음을 포함합니다.

    • context: AWS Lambda 컨텍스트 객체(Go).

    • fmt: 함수의 반환 값 형식을 지정하는 데 사용되는 Go 서식 객체입니다.

    • github.com/aws/aws-lambda-go/lambda: 앞서 언급한 것처럼 Go용 Lambda 프로그래밍 모델을 구현합니다.

  • func HandleRequest(ctx context.Context, name MyEvent) (string, error): 이것은 Lambda 핸들러 서명이며 실행할 해당 코드를 포함합니다. 또한 포함된 파라미터들은 다음을 나타냅니다.

    • ctx context.Context: Lambda 함수 호출을 위한 런타임 정보를 제공합니다. ctxAWS Lambda 컨텍스트 객체(Go)를 통해 사용 가능한 정보를 활용하기 위해 선언하는 변수입니다.

    • name MyEvent: name 명령문으로 값을 반환할 return의 변수 이름이 포함된 입력 유형입니다.

    • string, error: 성공 관련 문자열과 표준 오류 정보라는 두 값을 반환합니다. 사용자 지정 오류 처리에 대한 자세한 내용은 AWS Lambda 함수 오류(Go) 단원을 참조하세요.

    • return fmt.Sprintf("Hello %s!", name), nil: 입력 이벤트에 제공된 이름과 함께 형식이 지정된 "Hello" 인사를 반환합니다. nil은 오류가 없었으며 해당 함수가 성공적으로 실행되었음을 나타냅니다.

  • func main(): Lambda 함수 코드를 실행하는 진입점입니다. 이 항목은 필수입니다.

    func main(){} 코드 대괄호 사이에 lambda.Start(HandleRequest)를 추가하면 Lambda 함수가 실행됩니다. Go 언어 표준에 따라 여는 대괄호 {main 함수 서명의 맨 끝에 직접 위치해야 합니다.

구조화된 유형을 이용한 Lambda 함수 핸들러

위 예제에서 입력 유형은 단순한 문자열이었습니다. 다만 구조화된 이벤트에서 다음과 같이 함수 핸들러로 전달할 수도 있습니다.

package main import ( "fmt" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"What is your name?"` Age int `json:"How old are you?"` } type MyResponse struct { Message string `json:"Answer:"` } func HandleLambdaEvent(event MyEvent) (MyResponse, error) { return MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil } func main() { lambda.Start(HandleLambdaEvent) }

요청은 다음과 같은 형식으로 나타납니다.

# request { "What is your name?": "Jim", "How old are you?": 33 }

응답은 다음과 같습니다.

# response { "Answer": "Jim is 33 years old!" }

내보내기를 위해서는 이벤트 구문의 필드 이름이 대문자로 표시되어야 합니다. AWS 이벤트 소스의 이벤트를 처리하는 것에 대한 자세한 내용은 aws-lambda-go/events를 참조하세요.

유효한 핸들러 서명

Go에서 Lambda 함수 핸들러를 빌드할 때 몇 가지 옵션들이 있으며 다만 다음과 같은 규칙들을 반드시 준수해야 합니다.

  • 핸들러는 하나의 함수여야 합니다.

  • 핸들러는 0~2개의 인수를 취할 수 있습니다. 인수가 2개일 경우, 첫 번째 인수는 context.Context를 구현해야 합니다.

  • 핸들러는 0~2개의 인수를 반환할 수 있습니다. 반환 값이 1개일 경우, 이 값은 error를 구현해야 합니다. 반환 값이 2개일 경우, 두 번째 값은 error를 구현해야 합니다. 오류 처리 정보 구현에 관한 자세한 내용은 AWS Lambda 함수 오류(Go)를 참조하세요.

다음 목록은 유효한 핸들러 서명을 열거합니다. TInTOutencoding/json 표준 라이브러리와 호환 가능한 유형을 나타냅니다. 이러한 유형들이 역직렬화되는 방식에 관한 자세한 내용은 func Unmarshal을 참조하시기 바랍니다.

  • func ()
  • func () error
  • func (TIn) error
  • func () (TOut, error)
  • func (context.Context) error
  • func (context.Context, TIn) error
  • func (context.Context) (TOut, error)
  • func (context.Context, TIn) (TOut, error)

전역 상태 사용

Lambda 함수의 핸들러 코드와 무관한 전역 변수들을 선언하고 수정해야 합니다. 또한 핸들러는 그것이 로드될 때 실행되는 init 함수를 선언할 수 있습니다. 이 함수는 표준 Go 프로그램과 마찬가지로 AWS Lambda에서도 동일하게 동작합니다. Lambda 함수의 단일 인스턴스는 여러 이벤트를 동시에 처리하지 못합니다.

package main import ( "log" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/aws" ) var invokeCount = 0 var myObjects []*s3.Object func init() { svc := s3.New(session.New()) input := &s3.ListObjectsV2Input{ Bucket: aws.String("examplebucket"), } result, _ := svc.ListObjectsV2(input) myObjects = result.Contents } func LambdaHandler() (int, error) { invokeCount = invokeCount + 1 log.Print(myObjects) return invokeCount, nil } func main() { lambda.Start(LambdaHandler) }