Slide 1

Slide 1 text

GoとLambdaを使用した高パフォーマンスでサーバレスな マイクロサービスの開発と運用 ©tottie / Renée French

Slide 2

Slide 2 text

三上 悟 Tech Lead at Voicy saicologic Goの開発は2021年〜 PHP => Ruby => Node.js => Python => Go 自己紹介

Slide 3

Slide 3 text

Go x AWS Lambda

Slide 4

Slide 4 text

・ユースケース ・他のランタイムと違い:ベンチマーク ・開発の始め方

Slide 5

Slide 5 text

ユースケース:メール配信の不達調査 メール送信 ・メールアドレスによる会員登録、アクティベーション ・パスワード再発行 ・パスワード更新 さまざまな理由によってメールが届かないという問い合わせがある

Slide 6

Slide 6 text

SendGrid メール配信プラットフォーム(SaaS) Web APIメール送信する Webhookを使ってメールのイベントを受け取れる SendGrid Client SendGrid SendGrid Webhook API Gateway メール送信 HTTP POST Lambda DynamoDB

Slide 7

Slide 7 text

どんなイベントが受け取るか? https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html

Slide 8

Slide 8 text

・管理画面からイベントデータがダウンロードできない ・管理画面から数千件までしか見ることができない ・どのメールがどういう理由でエラーになったか見つけるのが大変 なぜ、Webhookが必要?

Slide 9

Slide 9 text

AWS Lambdaはイベントの発生に応じてプログラムを実行する環境を提供する クラウドコンピューティングサービス ・AWSを利用している ・スパイクする ・必要なときだけイベントのログが見たい ・常時サーバー不要。コストを抑えたい なぜ、AWS Lambdaを選定したのか?

Slide 10

Slide 10 text

なぜ、他のランタイムに比べてGoを使うのか? 背景 ・LambdaはメインでNode.jsが使われています。LambdaといえばNode.js ・開発のメイン言語は99%がGo言語 ・Goはランタイムが1.xのみ (重要) ・ランタイム比較のベンチマーク結果が良好だった

Slide 11

Slide 11 text

Goはランタイムが1つ

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Goは高パフォーマンスなのか?

Slide 15

Slide 15 text

ランタイム比較のベンチマーク 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-par t-1-e4146fe89385 ベンチマーク計測には、JMeterを使いました。 同時10ユーザー 3回リクエスト

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

ランタイム比較のベンチマーク結果 Node.jsよりは良い。Pythonは同等

Slide 18

Slide 18 text

ランタイム比較のベンチマーク 128MBより256MBのほうが良い

Slide 19

Slide 19 text

実際に運用してみた結果

Slide 20

Slide 20 text

SendGrid Client SendGrid SendGrid Webhook API Gateway メール送信 HTTP POST Lambda DynamoDB ベンチマークの時と同じ構成

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

まとめ ・Node.jsに比べれば高パフォーマンス ・50ms or die の世界では使えない ・128MBより256MBのほうが良い傾向 さらにメモリ割り当て別で見たい場合は AWS公式で紹介されている「 aws-lambda-power-tuning」 Operating Lambda: パフォーマンスの最適化 – Part 2 ・コールドスタート対策はLambdaのProvisionedCouncurrencyを設定しだい

Slide 25

Slide 25 text

開発の始め方

Slide 26

Slide 26 text

公式ドキュメント:はじめの一歩 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html

Slide 27

Slide 27 text

Github https://github.com/aws/aws-lambda-go eventsフォルダに豊富にサンプルがあります!

Slide 28

Slide 28 text

API-Gateway x Lambda: 最初の一歩 aws-lambda-go/events/README_ApiGatewayEvent.md

Slide 29

Slide 29 text

API-Gateway x Lambda aws-lambda-go/events/apigw.go でRequest/Responseを知る

Slide 30

Slide 30 text

他のランタイムと同じ

Slide 31

Slide 31 text

その他:M1 Macを使っている人は注意

Slide 32

Slide 32 text

まとめ ・当分、Goはランタイムが1つのためメンテナンスが楽です ・他のランタイムに比べてもGoのパフォーマンスは良いです ・最初は、AWSの公式ドキュメントを読みましょう ・次に、Githubにあるソースコードのサンプルを読みましょう ・Request/Responseの構造体を読みましょう

Slide 33

Slide 33 text

ご清聴ありがとうございました