API Gateway + Lambdaで構築するサムネイル生成システム
by
Kanazawa Yuki
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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秒を超過)