AWS Lambda関数をネイティブGoランタイムで作成する際のTIPS

梅雨明け後の沖縄よりこんにちは、皆さん今日も元気にGo言語でコードを書いてますか?

今年のはじめ、2018年1月よりかねてより待望のGo言語でのAWS Lambda関数の開発が正式にサポートされました。それより以前はapexを活用してこんな感じでLambda関数をGo言語で書いていたと思います。書いてましたよね?

Node 4.xのEOLが迫る(本当はもう過ぎてる)今日このごろ、蓄積された膨大なGo言語のLambda資産をそろそろNative Goランタイムに移したいと思いますよね?

幸いなことに、こちらのプルリクエストがすでにマージされていますので、少しコードを書き換えて & apexをv1.0.0-rc1以上に上げてデプロイし直すことで、Native Go ランタイムを利用することが出来るようになります。

ということで、今日はNative Goランタイムに移行する際に利用するイベントをまとめてみたいと思います。apex + golang で作成された関数は、受け取るイベントごとにほぼ機械的に書き換えることができます。

以下、ハンドラを “main” とした例でご紹介します。

API Gateway の Lambda proxy を利用する場合

API Gateway の Lambdaプロキシ統合のリクエストを受け、レスポンスを返す場合には events.APIGatewayProxyRequest とevents.APIGatewayProxyResponse を利用します。ドキュメントはこちらです。

自分の中では最も利用回数は少ないのですが、一般的には多そうなので初めにご紹介します。

func main() {
lambda.Start(shim)
}

func shim(context context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
}

SNSイベントを利用する場合

自分の中ではSNSでLambdaをキックするパターンが一番多いんじゃないか?と思うのですが、皆様の活用範囲ではいかがでしょうか。

この場合利用するイベントは events.SNSEvent です。ドキュメントはこちら。関数はこんな感じになります。

func main() {
lambda.Start(shim)
}

func shim(context context.Context, event events.SNSEvent) (e error) {
}

CloudWatchEventを利用する場合

CloudWatchのイベント経由でLambdaを起動することもよくありますね。いわゆるcronやバッチ系の処理に利用します。ドキュメントはあれ、、、無いですが、これを見れば一目瞭然でしょう。関数はこんな感じになりますね。

func main() {
lambda.Start(shim)
}

func shim(context context.Context, event events.CloudWatchEvent) (e error) {
}

カスタムオーソライザーを作成する場合

ちょっと変わり種?の API Gateway で認証を実装するときに作るカスタムオーソライザーも良く作成するLambda関数の1つですね。このLambda関数では、イベントは events.APIGatewayCustomAuthorizerRequest を利用します。ドキュメントはこちら。関数はこんな感じで、PolicyDocument を events.APIGatewayCustomAuthorizerResponse でレスポンスします。

func main() {
lambda.Start(shim)
}

func shim(ctx context.Context, event events.APIGatewayCustomAuthorizerRequest) (events.APIGatewayCustomAuthorizerResponse, error) {
}

その他

この他、もちろんS3のイベントだったり、DynamoDB ストリームやKinesisのストリーミング系のイベントだったりと、おおよそイベントとして取り扱えるものは揃っているはずです。サポート内容は、こちらのソースを見れば確認することができます。

aws/aws-lambda-go
_aws-lambda-go – Libraries, samples and tools to help Go developers develop AWS Lambda functions._github.com

ちなみに、Lambda関数自身に関する情報(関数名やRequestIDなど)は、lambdacontext.FromContextを使って context から取り出すことが可能です。

lambdacontext.FromContext(ctx)

以上、皆さんのGo言語+Lambdaライフがより快適になれば幸いです。

投稿者プロフィール

アバター画像
西島
"沖縄の自宅からリモートワークで参画している根っからのクラウド・コミュニティ大好き人間。
オープンソースとクラフトビールをこよなく愛する。"