Slide 1

Slide 1 text

2020/03/14 JAWS DAYS 2020 API Gateway + Lambdaで 構築するサムネイル生成システム https://www.lancers.jp/ Yuki Kanazawa

Slide 2

Slide 2 text

2020/03/14 JAWS DAYS 2020 自己紹介 2 氏名:金澤 裕毅 出身:宮城県仙台市 ランサーズSRE(2013/11-) Github:yKanazawa Twitter: @yakitori009 Language: C++, Java, PHP, Go 趣味: 将棋とか

Slide 3

Slide 3 text

2020/03/14 JAWS DAYS 2020 About Lancers https://www.lancers.jp/ Genre: Crowdsourcing Start: 2008/4 PHP 5.2 → 5.3 → 5.6 → 7.3 CakePHP 1.2 → 1.3 → 2.8 → 2.10

Slide 4

Slide 4 text

2020/03/14 JAWS DAYS 2020 4 ランサーズのサーバー構成 EC2 instance CloudSearch CloudFront Route 53 CloudFront ALB ALB API Gateway Lambda Auto Scaling App S3 Aurora Reader Aurora Reader Aurora Writer Api ElastiCache Redis AI系API サムネイル表示 仕事検索 ランサー検索 ランサーズ Batch PHP7 CakePHP2.10 Python3 MySQL5.7

Slide 5

Slide 5 text

2020/03/14 JAWS DAYS 2020 以前のサムネイル生成処理

Slide 6

Slide 6 text

2020/03/14 JAWS DAYS 2020 6 以前のサムネイル生成処理 CloudFront Route 53 User ALB EC2 App S3 www.lancers.jp img.lancers.jp img.lancers.jp www.lancers.jp

Slide 7

Slide 7 text

2020/03/14 JAWS DAYS 2020 7 以前のサムネイル生成処理の問題点 ●リソース問題 ○巨大画像アップロード時にImageMagickが暴走 ■メモリ1GB以上消費 ■/tmp/に数GBのファイルを生成 ●セキュリティ問題 ○ImageMagickは脆弱性の報告数が多い ○今後も報告される可能性 ●安定性の問題 ○マイページの3枚のサムネイル生成が高確率で失敗する ■一時ファイルの上書きが起きていた可能性 Appサーバーが 落ちる

Slide 8

Slide 8 text

2020/03/14 JAWS DAYS 2020 8 対策例:サムネイルサーバーを分離 CloudFront Route 53 User ALB EC2 S3 www.lancers.jp img.lancers.jp img.lancers.jp www.lancers.jp ALB EC2 App MultiAZで 2台以上必要

Slide 9

Slide 9 text

2020/03/14 JAWS DAYS 2020 新システムの構築

Slide 10

Slide 10 text

2020/03/14 JAWS DAYS 2020 10 Lambdaの制限 ImageMagick だと厳しい

Slide 11

Slide 11 text

2020/03/14 JAWS DAYS 2020 11 新しいサムネイル生成処理 CloudFront Route 53 User ALB Lambda S3 www.lancers.jp img2.lancers.jp img2.lancers.jp www.lancers.jp API Gateway EC2 Golangの 画像ライブラリで変換

Slide 12

Slide 12 text

2020/03/14 JAWS DAYS 2020 12 新システムのメリット ●リソース問題の解決 ○Golangの画像変換ライブラリを利用 ■失敗した時のみImageMagickを利用 ●サーバ分離によるセキュリティの確保 ○Appサーバーからサムネイル生成を分離 ○Lambda内に処理を隠蔽 ●安定、確実な生成処理 ○1つ1つのサムネイル生成処理が個々のLambdaで処理 ○ファイルの上書きが起こらない

Slide 13

Slide 13 text

2020/03/14 JAWS DAYS 2020 サーバー費用の見積もりとメモリ設定

Slide 14

Slide 14 text

2020/03/14 JAWS DAYS 2020 14 Lambdaの費用

Slide 15

Slide 15 text

2020/03/14 JAWS DAYS 2020 15 Lambdaの費用見積もり ●Lambdaのメモリ量を増やすと処理時間も早くなる ○メモリ量と費用は必ずしも比例しない ●巨大画像の処理を想定 ○動的なメモリ設定の変更は可能だが面倒 ■処理が多くなる ○→最大の3008MBに設定 メモリ (MB) 100秒単位の価格 1000万回の価格 平均処理時間 128MB 約0.0000250円 約250円 約1800ms 256MB 約0.0000500円 約500円 約800ms … 3008MB 約0.0005000円 約5875円 約400ms ●1$=120円で計算 ●1ヶ月1000万回で計算

Slide 16

Slide 16 text

2020/03/14 JAWS DAYS 2020 結果

Slide 17

Slide 17 text

2020/03/14 JAWS DAYS 2020 17 巨大画像の処理時間とメモリ使用量 ●15917 x 16344 の画像で検証 ●既存システム(EC2 + ImageMagick) ○処理時間:13秒 ○メモリ消費:1GB以上 ○ストレージ消費:数GB ■/tmp/に作成 ○Appサーバーへの影響:あり ●新システム(Lambda + Go) ○処理時間:11秒 ○メモリ消費:1313MB ○ストレージ消費:なし ○Appサーバーへの影響:なし ■※Lambda側に処理が隔離されている

Slide 18

Slide 18 text

2020/03/14 JAWS DAYS 2020 18 Lambda起動数、平均処理時間、成功率 ●平均処理時間:約220ms ●サムネイル生成成功率:99.9%以上 ○1日に数回だけ失敗(タイムアウト20秒を超過)