Go Conference 2022 Spring 発表資料 https://gocon.jp/2022spring/sessions/a11-s/
GoとLambdaを使用した高パフォーマンスでサーバレスなマイクロサービスの開発と運用©tottie / Renée French
View Slide
三上 悟Tech Lead at VoicysaicologicGoの開発は2021年〜PHP => Ruby => Node.js => Python => Go自己紹介
Go x AWS Lambda
・ユースケース・他のランタイムと違い:ベンチマーク・開発の始め方
ユースケース:メール配信の不達調査メール送信・メールアドレスによる会員登録、アクティベーション・パスワード再発行・パスワード更新さまざまな理由によってメールが届かないという問い合わせがある
SendGridメール配信プラットフォーム(SaaS)Web APIメール送信するWebhookを使ってメールのイベントを受け取れるSendGrid ClientSendGridSendGrid WebhookAPI Gatewayメール送信HTTP POSTLambdaDynamoDB
どんなイベントが受け取るか?https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html
・管理画面からイベントデータがダウンロードできない・管理画面から数千件までしか見ることができない・どのメールがどういう理由でエラーになったか見つけるのが大変なぜ、Webhookが必要?
AWS Lambdaはイベントの発生に応じてプログラムを実行する環境を提供するクラウドコンピューティングサービス・AWSを利用している・スパイクする・必要なときだけイベントのログが見たい・常時サーバー不要。コストを抑えたいなぜ、AWS Lambdaを選定したのか?
なぜ、他のランタイムに比べてGoを使うのか?背景・LambdaはメインでNode.jsが使われています。LambdaといえばNode.js・開発のメイン言語は99%がGo言語・Goはランタイムが1.xのみ (重要)・ランタイム比較のベンチマーク結果が良好だった
Goはランタイムが1つ
Goは高パフォーマンスなのか?
ランタイム比較のベンチマークOSSのベンチマークプログラムを試しましたhttps://github.com/Aleksandr-Filichkin/aws-lambda-runtimes-performance複数のランタイムをサポートしてますが、Python3.9/Node.js14.x/Goを選択参考にした記事https://filia-aleks.medium.com/benchmarking-all-aws-lambda-runtimes-in-2021-cold-start-part-1-e4146fe89385ベンチマーク計測には、JMeterを使いました。同時10ユーザー 3回リクエスト
ランタイム比較のベンチマーク結果Node.jsよりは良い。Pythonは同等
ランタイム比較のベンチマーク128MBより256MBのほうが良い
実際に運用してみた結果
SendGrid ClientSendGridSendGrid WebhookAPI Gatewayメール送信HTTP POSTLambdaDynamoDBベンチマークの時と同じ構成
まとめ・Node.jsに比べれば高パフォーマンス・50ms or die の世界では使えない・128MBより256MBのほうが良い傾向さらにメモリ割り当て別で見たい場合は AWS公式で紹介されている「 aws-lambda-power-tuning」Operating Lambda: パフォーマンスの最適化 – Part 2・コールドスタート対策はLambdaのProvisionedCouncurrencyを設定しだい
開発の始め方
公式ドキュメント:はじめの一歩https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html
Githubhttps://github.com/aws/aws-lambda-goeventsフォルダに豊富にサンプルがあります!
API-Gateway x Lambda: 最初の一歩aws-lambda-go/events/README_ApiGatewayEvent.md
API-Gateway x Lambdaaws-lambda-go/events/apigw.go でRequest/Responseを知る
他のランタイムと同じ
その他:M1 Macを使っている人は注意
まとめ・当分、Goはランタイムが1つのためメンテナンスが楽です・他のランタイムに比べてもGoのパフォーマンスは良いです・最初は、AWSの公式ドキュメントを読みましょう・次に、Githubにあるソースコードのサンプルを読みましょう・Request/Responseの構造体を読みましょう
ご清聴ありがとうございました