Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サーバーレス環境をより改善してみた話
Search
Sugar Sato
December 17, 2022
2k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
サーバーレス環境をより改善してみた話
Sugar Sato
December 17, 2022
More Decks by Sugar Sato
See All by Sugar Sato
AIと共に生きる技術選定 2026
sgash708
0
160
Bref でサービスを運用している話
sgash708
0
280
tool ディレクティブを導入してみた感想
sgash708
1
280
DeepWiki で Go をもっと好きになろう
sgash708
0
1k
環境変数ライブラリ選手権
sgash708
0
280
はじめての Go * WASM * OCR
sgash708
1
410
もう僕は OpenAPI を書きたくない
sgash708
6
2.6k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
240
testcontainers のススメ
sgash708
1
520
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
The Language of Interfaces
destraynor
162
27k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How to Think Like a Performance Engineer
csswizardry
28
2.6k
Bash Introduction
62gerente
615
220k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Evolving SEO for Evolving Search Engines
ryanjones
0
210
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
HDC tutorial
michielstock
2
700
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
380
Transcript
サーバーレス環境を より改善してみた話 ServerlessDays Tokyo 2022 Virtual @sgash708 2022/12/17
About • Sugar Sato (@sgash708) • コロニー株式会社所属 • キャンプ、ゲーム、音楽 •
Lambdaという名前の猫とくらす
Qolony, inc 2018年創業。コンサルティング事業を推進。 2020年4月より、新しいサービスの企画とデベロッパーチームの 体制構築を開始。 課題解決の方法とエキスパートが集まる課題解決プラットフォー ム『Experty』を2022年4月にローンチして運営しています。
過去に...
Agenda • 以前の構成 • アップデート理由 • 現在の構成 • アップデート内容 •
活用例 • まとめ
以前の構成
Angular, TypeScript GithubActionsでCICD TypeScript, Express 外部サービス連携で必要なイン ターネットアクセス サービスに必要なデータの蓄積 ユーザ情報やマスタ情報等 ユーザ情報の追加や変更
認証はJWTで行う チャット情報の操作 APIから操作可能な範囲のみ Amplify API Gateway Lambda NAT Gateway Internet Gateway DynamoDB Cognito RDS サービス全体の構成図
Groups - PK - GSI1 - unread - lastMessage -
updatedAt チャットへの参照権限をチェック (e.g. 権限のないグループへの操 作をブロック) GraphQLのオペレーションに対 して、DynamoDBのメッセージ テーブルを操作する チャットの書き込みをトリガーし て必要な処理を行う 認証はCognitoのJWT Query - getMessages Mutation - createMessage - updateMessage - deleteMessage Subscription - onCreateMessage - onUpdateMessage - onDeleteMessage Messages - PK - GSI1 - senderId - body {} - postedAt Amplify Appsync DynamoDB DynamoDB Lambda チャット機能の構成図
なぜアップデートしたのか
• サービスのPMFを達成するため、頻繁な方向転換 ◦ 機能の削除や新機能開発の日々 ◦ 時には全体を作り直すことも...
• 技術的負債の洗い出し ◦ 完全なサーバーレスにできていないこと ◦ RDS(MySQL)の使用 ▪ VPC LambdaとRDS Proxyが必須化していた
◦ RDS Proxy ▪ SQL実行のパフォーマンスが非常に悪い ▪ 動作が重たくなる影響が大きかった
現在の構成
Golang, Gin Angular, TypeScript チャット情報の操作 サービスに必要なデータの蓄積 ユーザ情報やマスタ情報等 ユーザ情報の追加や変更 認証はJWTで行う GithubActionsでCICD
DynamoDBと OpenSearch(ElasticSearch)を 同期して、サービスの検索強化 メールアドレス認証 CloudFront API Gateway Lambda SES Cognito DynamoDB Lambda OpenSearch サービス全体の構成図
認証はLambdaで行う さらに、チャットへの参照権限をチェック (e.g. 権限のないグループへの操作をブロック ) CloudFront Appsync Lambda Lambda DynamoDB
Messages - PK1〜PK4 - SK1〜SK4 - type - GSI - attributes チャット機能の構成図
どんなアップデートをしたのか
• 当時、RDSのために必要だった ◦ 関連リソースを削減できた! ◦ コストダウン ▪ NATGatewayの料金 VPCの削除
• DynamoDBに集約 ◦ チャットのみに使っていたDynamoDBを活用 ◦ APIレスポンスの向上(≒20ms) ▪ 1000ms => 20ms
• OpenSearchを活用してサービスの検索の品質向上 ◦ DynamoDBとミラーリング • コストの削減(検証環境アカウント) ◦ RDS: ≒$65/month ◦ DynamoDB: ≒$0.15/month RDSとのお別れ
• スキーマをRDBに寄せすぎない ◦ prefixを用いたリレーションの活用 ◦ PKとSKとattributesとtype ◦ Attributeをシンプルに保つ ▪ ネストしたデータ構造も変更可能
▪ スキーマ変更に耐えるように itemの例 RDSとのお別れ
dynamodbのスキーマ rdsのスキーマ RDSとのお別れ
• その他の取り組み ◦ Appsyncの認証をLambdaにした ◦ Amplifyの削除 update前のserverless.yml update後のserverless.yml
実際の活用例
1. 職務経歴書検索機能 ファイルのアップロード S3にファイルがアップロー ドを起点に、Lambda呼び 出される 経歴書解析用のコンテナを 使用 経歴書を解析して、DynamoDB に格納
DynamoDB S3 Lambda ECR
1. 職務経歴書検索機能 • ServelessとECR ◦ OCRのために作成したイメージがECRにない?! ▪ servelessで作成されたリポジトリ内に存在 ▪ イメージタグで管理
serverless.yml イメージタグとして管理される
2. 月次メール配信機能 Lambda Lambda DynamoDB SES 毎月20日の9:00(JST)に対 象ユーザのitem作成 5分に一回のメール配信実 行
メール配信したら対象の itemを削除
2. 月次メール配信機能 • LambdaのCronの時間 ◦ JSTと勘違い... ◦ UTCなので日付をまたぐ処理などに注意 • SESの送信上限
◦ 14件/sec (利用頻度によって緩和) ◦ 同じ時間に、一括送信をしたい ▪ 一回のメールで50人まで送信可能 ▪ Bccを使うことで、ToAddressを除いた49人に送信 ▪ ToにはサービスのEmailアドレスを使用 ▪ 最大:49人*14件=686件
• LambdaからDynamoDBのitem削除時にハマる... ◦ ループで一件づつの削除 ▪ 消した処理の時間差でitemが取得できてしまう ▪ BatchWriteItemで回避 2. 月次メール配信機能
まとめ
Summary • サーバーレスって楽しい! ◦ 小さく開発するため要件の変化に対応 ◦ ビジネスロジックに注力できる ◦ 料金も現状抑えられている ▪
円安にも強い • 課題感 ◦ 拡張性の高い設計にできるか(主にDynamoDB)
Engineers Recruiting qolony.co.jp https://qolony.co.jp/recruit_engineer/
Thank you for listening!