Go の AWS Lambda 関数ハンドラー - AWS Lambda

Go の AWS Lambda 関数ハンドラー

Lambda 関数ハンドラーは、イベントを処理する関数コード内のメソッドです。関数が呼び出されると、Lambda はハンドラーメソッドを実行します。ハンドラーによってレスポンスが終了するか、レスポンスが返ったら、別のイベントを処理できるようになります。

Go で書き込まれた Lambda 関数は、Go 実行可能ファイルとして作成されます。Lambda 関数コードでは、Go の Lambda プログラミングモデルを実装する github.com/aws/aws-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 と名付けられることが必要です。

  • インポート: これを使用して、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 関数エラー」を参照してください。

次のリストは、有効なハンドラー署名の一覧です。 TInTOut は、 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) }