Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Kanazawa Yuki

March 13, 2020
Tweet

More Decks by Kanazawa Yuki

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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台以上必要

    View Slide

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

    View Slide

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

    View Slide

  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の
    画像ライブラリで変換

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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万回で計算

    View Slide

  16. 2020/03/14 JAWS DAYS 2020
    結果

    View Slide

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

    View Slide

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

    View Slide