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)
}