GoLambda

Go の AWS Lambda context オブジェクト - AWS Lambda

Lambda では実行時に context.Context を受け取ることができ、 Lambda が起動した時間+Lambdaのタイムアウト秒を DeadLine として取得することができる。

package main
 
import (
        "context"
        "log"
        "time"
        "github.com/aws/aws-lambda-go/lambda"
)
 
func longFunc(ctx, err chan error) {
    time.Sleep(2 * time.Second)
    close(err)
}
 
func LongRunningHandler(ctx context.Context) (string, error) {
 
	deadline, _ := ctx.Deadline()
	deadline = deadline.Add(-1 * time.Second)
	timeoutChannel := time.After(time.Until(deadline))
 
	errChan := make(chan error)
 
	go longFunc(ctx, errChan)
 
	select {
	case <-timeoutChannel:
		return nil, errors.New("timeout")
	case err := <-errChan:
        if err != nil {
            return nil, err
        } else {
            return "success", nil
        }
	}
 
}
 
func main() {
        lambda.Start(LongRunningHandler)
}