🥩

Goのlambda.Startにcontextを与える

2024/12/31に公開

背景

  • LambdaのアプリケーションをGoで実装する
  • lambda.Startの引数に渡すメインとなるハンドラーメソッドの前後処理を実装したい
  • 前後処理はライブラリのように扱うことができ、アプリケーション(利用者)毎でIDを生成したい

環境

aws-lambda-go v1.47.0

内容

WithContextValue を使う。Usageにあるように、以下のように第一引数の関数に渡す context に値を渡すことができる。

lambda.StartWithOptions(
    func (ctx context.Context) (string, error) {
        return ctx.Value("foo"), nil
    },
    lambda.WithContextValue("app_key", "app_a")
)

No1. プレーンパターンのデコレータ実装 を例に取ると、HTTPにおけるミドルウェアのようにLambdaのミドルウェアを実装し、メインハンドラーを引数に渡すことで、ミドルウェアの中でcontextから値を取り出すことができる。

lambda.StartWithOptions(
    lambdamiddleware.Do(plain.Handle))
    lambda.WithContextValue("app_key", "app_a")
)

ミドルウェアと考えると前処理が後続処理に影響を与えるのは避けるべきだが、スコープが短く・使い方が限定的ならば許容できそうだ。

参考

Discussion