メニュー
AWS Lambda
開発者ガイド

Lambda 関数ハンドラ (Go)

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 コンテキスト、名前文字列) (文字列、エラー): これは、Lambda ハンドラ署名を指し、実行されるコードを含んでいます。また、次に示すパラメータも含まれます。

    • ctx context.Context: Lambda 関数呼び出しへのランタイム情報を提供します。ctx は、コンテキストオブジェクト (Go) を経由して利用できる情報を活用する宣言を行う変数です。

    • 名前文字列: 値が return ステートメントに返される name の変数名の入力タイプです。

    • 文字列エラー: スタンダード エラー を返します。カスタムエラー処理の詳細については、「関数エラー (Go) 」を参照してください。

    • return fmt.Sprintf("Hello %s!", name), nil: フォーマットされた 「こんにちは」の挨拶をハンドラ署名として指定した名前で単純に返します。nil は、エラーがなく、関数が正常に実行されたことを示します。

  • func main(): Lambda 関数コードが実行するエントリポイント。これは必須です。

    func main(){} コードの括弧内に lambda.Start(HandleRequest) を追加すると、Lambda 関数が実行されます。

    注記

    Go 言語スタンダードごとに、開いた括弧内で {main 関数署名の最後に直接置く必要があります。

構造化されたタイプを使用した 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) 」を参照してください。

次のリストは、有効なハンドラ署名の一覧です。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 { invokeCount = invokeCount + 1 log.Print(myObjects) return invokeCount } func main() { lambda.Start(LambdaHandler) }

次のステップ

コンテキストオブジェクト (Go)