API Gateway + Lambdaで構築するサムネイル生成システム

API Gateway + Lambdaで構築するサムネイル生成システム

Lambdaの代表的なユースケースとしてサムネイル変換が挙げられますが、画像アップロード直後に処理する事例がほとんどで、リアルタイムな変換の導入事例は意外と見かけません。API Gatewayと組み合わせればリアルタイムなサムネイル変換も実現可能で、EC2で構築するよりも非常にセキュアで低コストなシステムを構築できます。ImageMagickの潜在的脆弱性からの隔離や、ミリ秒単位の極めて効率的なコンピューティングとメリットを踏まえた、リアルタイムサムネイル変換システムの構築事例を紹介いたします。※ImageMagickに加えてGo言語での変換事例も合わせて紹介する予定です。

652359244199b2b5108a5e09c027e0da?s=128

Kanazawa Yuki

March 13, 2020
Tweet

Transcript

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

    Yuki Kanazawa
  2. 2020/03/14 JAWS DAYS 2020 自己紹介 2 氏名:金澤 裕毅 出身:宮城県仙台市 ランサーズSRE(2013/11-)

    Github:yKanazawa Twitter: @yakitori009 Language: C++, Java, PHP, Go 趣味: 将棋とか
  3. 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
  4. 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
  5. 2020/03/14 JAWS DAYS 2020 以前のサムネイル生成処理

  6. 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
  7. 2020/03/14 JAWS DAYS 2020 7 以前のサムネイル生成処理の問題点 •リソース問題 ◦巨大画像アップロード時にImageMagickが暴走 ▪メモリ1GB以上消費 ▪/tmp/に数GBのファイルを生成

    •セキュリティ問題 ◦ImageMagickは脆弱性の報告数が多い ◦今後も報告される可能性 •安定性の問題 ◦マイページの3枚のサムネイル生成が高確率で失敗する ▪一時ファイルの上書きが起きていた可能性 Appサーバーが 落ちる
  8. 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台以上必要
  9. 2020/03/14 JAWS DAYS 2020 新システムの構築

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

  11. 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の 画像ライブラリで変換
  12. 2020/03/14 JAWS DAYS 2020 12 新システムのメリット •リソース問題の解決 ◦Golangの画像変換ライブラリを利用 ▪失敗した時のみImageMagickを利用 •サーバ分離によるセキュリティの確保

    ◦Appサーバーからサムネイル生成を分離 ◦Lambda内に処理を隠蔽 •安定、確実な生成処理 ◦1つ1つのサムネイル生成処理が個々のLambdaで処理 ◦ファイルの上書きが起こらない
  13. 2020/03/14 JAWS DAYS 2020 サーバー費用の見積もりとメモリ設定

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

  15. 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万回で計算
  16. 2020/03/14 JAWS DAYS 2020 結果

  17. 2020/03/14 JAWS DAYS 2020 17 巨大画像の処理時間とメモリ使用量 •15917 x 16344 の画像で検証

    •既存システム(EC2 + ImageMagick) ◦処理時間:13秒 ◦メモリ消費:1GB以上 ◦ストレージ消費:数GB ▪/tmp/に作成 ◦Appサーバーへの影響:あり •新システム(Lambda + Go) ◦処理時間:11秒 ◦メモリ消費:1313MB ◦ストレージ消費:なし ◦Appサーバーへの影響:なし ▪※Lambda側に処理が隔離されている
  18. 2020/03/14 JAWS DAYS 2020 18 Lambda起動数、平均処理時間、成功率 •平均処理時間:約220ms •サムネイル生成成功率:99.9%以上 ◦1日に数回だけ失敗(タイムアウト20秒を超過)