Go の AWS Lambda 関数ハンドラー
Lambda 関数ハンドラーは、イベントを処理する関数コード内のメソッドです。関数が呼び出されると、Lambda はハンドラーメソッドを実行します。ハンドラーによってレスポンスが終了するか、レスポンスが返ったら、別のイベントを処理できるようになります。
Gomain()
関数の実装が必要となります。
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
と名付けられることが必要です。 -
インポート: これを使用して、Lambda 関数に必要なライブラリを含めます。この場合、次のものが含まれます。
-
コンテキスト: Go の AWS Lambda context オブジェクト.
-
fmt: 関数の戻り値の書式に使用される Go フォーマット
オブジェクト。 -
github.com/aws/aws-lambda-go/lambda: 前に説明した Go 用の Lambda プログラミングモデルを実装します。
-
-
func HandleRequest(ctx context.Context, name MyEvent) (文字列、エラー): Lambda のハンドラー署名で、実行されるコードが含まれています。また、次に示すパラメータも含まれます。
-
ctx context.Context: Lambda 関数呼び出しへのランタイム情報を提供します。
ctx
は、Go の AWS Lambda context オブジェクト を介して利用できる情報を活用する宣言を行う変数です。 -
name MyEvent: 値が
name
ステートメントに返されるreturn
の変数名の入力タイプです。 -
string, error: 成功の文字列と標準 エラー
情報という 2 つの値を返します。カスタムエラー処理の詳細については、「Go の AWS Lambda 関数エラー」を参照してください。 -
return fmt.Sprintf(Hello%s!, name), nil: フォーマットされた「こんにちは」の挨拶を入力イベントとして指定した名前で単純に返します。
nil
は、エラーがなく、関数が正常に実行されたことを示します。
-
-
func main(): Lambda 関数コードが実行されるエントリポイント。これは必須です。
func main(){}
コードの括弧内にlambda.Start(HandleRequest)
を追加すると、Lambda 関数が実行されます。Go 言語スタンダードごとに、開いたかっこ内で{
をmain
関数署名の最後に直接置く必要があります。
命名
Go で関数を設定するとき、ハンドラー設定の値は実行可能ファイル名になります。例えば、ハンドラーの値を Handler
に設定すると、Lambda はHandler
実行可能ファイル内の main()
関数を呼び出します。
Lambda コンソールで関数ハンドラー名を変更するには、[Runtime settings] (ランタイム設定) ペインで [Edit] (編集) を選択します。
構造化されたタイプを使用した 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 までの引数を返す場合があります。単一の戻り値がある場合は、この値が
error
を実装する必要があります。2 つの戻り値がある場合には、2 番目の値がerror
を実装している必要があります。実装エラーの処理情報に関する詳細については、「Go の AWS Lambda 関数エラー」を参照してください。
次のリストは、有効なハンドラー署名の一覧です。 TIn
と TOut
は、 encoding/json 標準ライブラリと互換性のあるタイプを表しています。詳細については、「func アンマーシャリング
-
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
関数をハンドラーが宣言することがあります。これは、AWS Lambda でも標準の Go プログラムと同じように作動します。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) }