API Gateway向けの AWS Lambda のハンドラーをGoで作成する場合、普通に書くとこのように、main関数から特定のシグネチャの関数を lambda.Start で呼び出す。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-handler.html
API GatewayのパスごとにFunctionを紐づけている場合に、ヘッダーからトレース用の情報を取得したり、ユーザー情報を取得したりといった各ハンドラー共通で実行する処理を書きたい。
API Gateway ---⇒ /hello HelloFunction
└-----⇒ /bye ByeFunction
hello/main.go
bye/main.go
各ハンドラーのコードに同じ処理を書くのは、数が増えたときに間違えやすくなるので、なんとかしたい。
http handlerのミドルウェア
net/httpでwebサーバーを作るときに、各http handlerに共通で実行したい処理を実装するパターンの一つとして、ミドルウェアを書くことがある。
参考 HTTP Middleware の作り方と使い方 - 技術メモ
これは引数に http.Handler
をとって http.Handler
を返す関数で、ハンドラーの前後に処理を挟み込むのと、ミドルウェア自身をミドルウェアでラップすることができる。
これをさらにwrapして、設定値を渡すような書き方もできる。echoのミドルウェアはこのような実装になっている。
lambda handlerのミドルウェアに応用する
同様の方法でミドルウェアを書くとこんな感じになる。
実用的な例としては以下のようになる。
hello/main.go