Slide 1

Slide 1 text

サーバーレス環境を  より改善してみた話 ServerlessDays Tokyo 2022 Virtual @sgash708 2022/12/17

Slide 2

Slide 2 text

About ● Sugar Sato (@sgash708) ● コロニー株式会社所属 ● キャンプ、ゲーム、音楽 ● Lambdaという名前の猫とくらす

Slide 3

Slide 3 text

Qolony, inc 2018年創業。コンサルティング事業を推進。 2020年4月より、新しいサービスの企画とデベロッパーチームの 体制構築を開始。 課題解決の方法とエキスパートが集まる課題解決プラットフォー ム『Experty』を2022年4月にローンチして運営しています。

Slide 4

Slide 4 text

過去に...

Slide 5

Slide 5 text

Agenda ● 以前の構成 ● アップデート理由 ● 現在の構成 ● アップデート内容 ● 活用例 ● まとめ

Slide 6

Slide 6 text

以前の構成

Slide 7

Slide 7 text

Angular, TypeScript GithubActionsでCICD TypeScript, Express 外部サービス連携で必要なイン ターネットアクセス サービスに必要なデータの蓄積 ユーザ情報やマスタ情報等 ユーザ情報の追加や変更 認証はJWTで行う チャット情報の操作 APIから操作可能な範囲のみ Amplify API Gateway Lambda NAT Gateway Internet Gateway DynamoDB Cognito RDS サービス全体の構成図

Slide 8

Slide 8 text

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 チャット機能の構成図

Slide 9

Slide 9 text

なぜアップデートしたのか

Slide 10

Slide 10 text

● サービスのPMFを達成するため、頻繁な方向転換 ○ 機能の削除や新機能開発の日々 ○ 時には全体を作り直すことも...

Slide 11

Slide 11 text

● 技術的負債の洗い出し ○ 完全なサーバーレスにできていないこと ○ RDS(MySQL)の使用 ■ VPC LambdaとRDS Proxyが必須化していた ○ RDS Proxy ■ SQL実行のパフォーマンスが非常に悪い ■ 動作が重たくなる影響が大きかった

Slide 12

Slide 12 text

現在の構成

Slide 13

Slide 13 text

Golang, Gin Angular, TypeScript チャット情報の操作 サービスに必要なデータの蓄積 ユーザ情報やマスタ情報等 ユーザ情報の追加や変更 認証はJWTで行う GithubActionsでCICD DynamoDBと OpenSearch(ElasticSearch)を 同期して、サービスの検索強化 メールアドレス認証 CloudFront API Gateway Lambda SES Cognito DynamoDB Lambda OpenSearch サービス全体の構成図

Slide 14

Slide 14 text

認証はLambdaで行う さらに、チャットへの参照権限をチェック (e.g. 権限のないグループへの操作をブロック ) CloudFront Appsync Lambda Lambda DynamoDB Messages - PK1〜PK4 - SK1〜SK4 - type - GSI - attributes チャット機能の構成図

Slide 15

Slide 15 text

どんなアップデートをしたのか

Slide 16

Slide 16 text

● 当時、RDSのために必要だった ○ 関連リソースを削減できた! ○ コストダウン ■ NATGatewayの料金 VPCの削除

Slide 17

Slide 17 text

● DynamoDBに集約 ○ チャットのみに使っていたDynamoDBを活用 ○ APIレスポンスの向上(≒20ms) ■ 1000ms => 20ms ● OpenSearchを活用してサービスの検索の品質向上 ○ DynamoDBとミラーリング ● コストの削減(検証環境アカウント) ○ RDS: ≒$65/month ○ DynamoDB: ≒$0.15/month RDSとのお別れ

Slide 18

Slide 18 text

● スキーマをRDBに寄せすぎない ○ prefixを用いたリレーションの活用 ○ PKとSKとattributesとtype ○ Attributeをシンプルに保つ ■ ネストしたデータ構造も変更可能 ■ スキーマ変更に耐えるように itemの例 RDSとのお別れ

Slide 19

Slide 19 text

dynamodbのスキーマ rdsのスキーマ RDSとのお別れ

Slide 20

Slide 20 text

● その他の取り組み ○ Appsyncの認証をLambdaにした ○ Amplifyの削除 update前のserverless.yml update後のserverless.yml

Slide 21

Slide 21 text

実際の活用例

Slide 22

Slide 22 text

1. 職務経歴書検索機能 ファイルのアップロード S3にファイルがアップロー ドを起点に、Lambda呼び 出される 経歴書解析用のコンテナを 使用 経歴書を解析して、DynamoDB に格納 DynamoDB S3 Lambda ECR

Slide 23

Slide 23 text

1. 職務経歴書検索機能 ● ServelessとECR ○ OCRのために作成したイメージがECRにない?! ■ servelessで作成されたリポジトリ内に存在 ■ イメージタグで管理 serverless.yml イメージタグとして管理される

Slide 24

Slide 24 text

2. 月次メール配信機能 Lambda Lambda DynamoDB SES 毎月20日の9:00(JST)に対 象ユーザのitem作成 5分に一回のメール配信実 行 メール配信したら対象の itemを削除

Slide 25

Slide 25 text

2. 月次メール配信機能 ● LambdaのCronの時間 ○ JSTと勘違い... ○ UTCなので日付をまたぐ処理などに注意 ● SESの送信上限 ○ 14件/sec (利用頻度によって緩和) ○ 同じ時間に、一括送信をしたい ■ 一回のメールで50人まで送信可能 ■ Bccを使うことで、ToAddressを除いた49人に送信 ■ ToにはサービスのEmailアドレスを使用 ■ 最大:49人*14件=686件

Slide 26

Slide 26 text

● LambdaからDynamoDBのitem削除時にハマる... ○ ループで一件づつの削除 ■ 消した処理の時間差でitemが取得できてしまう ■ BatchWriteItemで回避 2. 月次メール配信機能

Slide 27

Slide 27 text

まとめ

Slide 28

Slide 28 text

Summary ● サーバーレスって楽しい! ○ 小さく開発するため要件の変化に対応 ○ ビジネスロジックに注力できる ○ 料金も現状抑えられている ■ 円安にも強い ● 課題感 ○ 拡張性の高い設計にできるか(主にDynamoDB)

Slide 29

Slide 29 text

Engineers Recruiting qolony.co.jp https://qolony.co.jp/recruit_engineer/

Slide 30

Slide 30 text

Thank you for listening!