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

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Lambda 함수 핸들러(Go)

Lambda 함수의 핸들러는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다. 함수는 핸들러가 응답을 반환하거나 종료하거나 제한 시간이 초과될 때까지 실행됩니다.

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

예 Lambda 함수로 이동
package main import ( "context" "fmt" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"name"` } func HandleRequest(ctx context.Context, event *MyEvent) (*string, error) { if event == nil { return nil, fmt.Errorf("received nil event") } message := fmt.Sprintf("Hello %s!", event.Name) return &message, nil } func main() { lambda.Start(HandleRequest) }

다음은 이 함수에 대한 샘플 입력입니다.

{ "name": "Jane" }

다음을 참고합니다.

  • 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, 이벤트 *MyEvent) (*문자열, 오류): 이것은 Lambda 핸들러의 서명입니다. Lambda 함수의 진입점으로 함수가 호출될 때 실행되는 로직을 포함합니다. 또한 포함된 파라미터들은 다음을 나타냅니다.

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

    • 이벤트 * MyEvent: 을 가리키는 이름의 파라미터입니다. event MyEvent Lambda 함수에 대한 입력을 나타냅니다.

    • *string, error: 핸들러가 두 개의 값을 반환합니다. 첫 번째는 Lambda 함수의 결과를 포함하는 문자열에 대한 포인터입니다. 두 번째는 오류 유형으로 오류가 없는 경우 nil이며 문제가 발생할 경우 표준 오류 정보를 포함합니다. 사용자 지정 오류 처리에 대한 자세한 내용은 AWS Lambda 함수 오류(Go) 단원을 참조하세요.

    • return &message, nil: 두 개의 값을 반환합니다. 첫 번째는 문자열 메시지에 대한 포인터로 입력 이벤트의 Name 필드를 사용하여 구성된 인사말입니다. 두 번째 값인 nil은 함수에 오류가 발생하지 않았음을 나타냅니다.

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

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

이름 지정

provided.al2 및 provided.al2023 런타임

.zip 배포 패키지에서 provided.al2 또는 provided.al2023 런타임을 사용하는 Go 함수의 경우 함수 코드가 포함된 실행 파일의 이름을 bootstrap으로 지정해야 합니다. .zip 파일로 함수를 배포하는 경우 bootstrap 파일이 .zip 파일의 루트에 있어야 합니다. 컨테이너 이미지에서 provided.al2 또는 provided.al2023 런타임을 사용하는 Go 함수의 경우 실행 파일에 모든 이름을 사용할 수 있습니다.

핸들러에는 아무 이름이나 사용할 수 있습니다. 코드에서 핸들러 값을 참조하려면 _HANDLER 환경 변수를 사용합니다.

go1.x runtime

go1.x 런타임을 사용하는 Go 함수의 경우 실행 파일과 핸들러는 어떤 이름이든 공유할 수 있습니다. 예를 들어 핸들러 값을 Handler로 설정하면 Lambda는 Handler 실행 파일에서 main() 함수를 호출합니다.

Lambda 콘솔에서 함수 핸들러 이름을 변경하려면 런타임 설정 창에서 편집을 선택합니다.

구조화된 유형을 이용한 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) { if event == nil { return nil, fmt.Errorf("received nil event") } return &MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil } func main() { lambda.Start(HandleLambdaEvent) }

다음은 이 함수에 대한 샘플 입력입니다.

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

응답은 다음과 같습니다.

{ "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 함수의 단일 인스턴스는 여러 이벤트를 동시에 처리하지 못합니다.

예 글로벌 변수가 있는 Go 함수
참고

이 코드는 AWS SDK for Go V2를 사용합니다. 자세한 내용은 AWS SDK for Go V2 사용 시작하기를 참조하세요.

package main import ( "context" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "log" ) var invokeCount int var myObjects []types.Object func init() { // Load the SDK configuration cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { log.Fatalf("Unable to load SDK config: %v", err) } // Initialize an S3 client svc := s3.NewFromConfig(cfg) // Define the bucket name as a variable so we can take its address bucketName := "examplebucket" input := &s3.ListObjectsV2Input{ Bucket: &bucketName, } // List objects in the bucket result, err := svc.ListObjectsV2(context.TODO(), input) if err != nil { log.Fatalf("Failed to list objects: %v", err) } myObjects = result.Contents } func LambdaHandler(ctx context.Context) (int, error) { invokeCount++ for i, obj := range myObjects { log.Printf("object[%d] size: %d key: %s", i, obj.Size, *obj.Key) } return invokeCount, nil } func main() { lambda.Start(LambdaHandler) }