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

AWS Lambda(+API Gateway)でバイナリを扱う話

okinari
March 06, 2020

AWS Lambda(+API Gateway)でバイナリを扱う話

okinari

March 06, 2020
Tweet

More Decks by okinari

Other Decks in Technology

Transcript

  1. AWS Lambda
    (+API Gateway)
    で、バイナリを扱う話

    View full-size slide

  2. Self-introduction
    Name: okinari (おきなり)
    Job: Freelance Engineer (Marketing Engineer)
    Like: Flutter(Dart) / Golang / React(TypeScript)
    Code Geass /
    Tonkotsu Ramen / Karaage /
    Karaoke / Bouldering
    Twitter:@okinari

    View full-size slide

  3. AWS Lambda
    ・AWSのFaaS(Function as a Service)
    ・サーバ管理が不要(サーバレス)
    ・コストも実行時間分だけお支払い(100ms単位)
    ・関数だけ書けばよいので、お手軽
    参考: https://aws.amazon.com/jp/lambda/

    View full-size slide

  4. API Gateway
    ・APIの入り口
    ・APIの実際の処理はAWSの別サービスと連携
    ・機能次第では、コードを書かずに作成可能
    ・トラフィック管理、セキュリティ、
     モニタリング、APIバージョン管理などが役割
    参考: https://aws.amazon.com/jp/api-gateway/

    View full-size slide

  5. そもそもの要件(私が参加時に決まっていた)
    ・バイナリの送受信などの処理したい
    ・特定の時間に大量アクセスされる予定
    ・スケーラビリティを考慮する
    →上記の理由より、Lambdaを使いたい

    View full-size slide

  6. Lambdaからバイナリを送るには
    ・API Gatewayの設定をいくつか変更する
    ・Lambda側でbase64エンコードして返却

    View full-size slide

  7. Lambdaにバイナリを送るには
    ・「Lambda プロキシ統合」は使用できない
     (統合レスポンスの設定ができない)
     ※Lambda設定画面からトリガー追加すると
      デフォルトで使用する状態になっているので
      チェックを外してやる必要がある

    View full-size slide

  8. Lambdaからバイナリを送るには
    ・Lambda側でbase64エンコードして返却
    ・base64エンコードしたもの単体をreturnする
    ・デフォルトの状態では、json形式で
     statusCode、bodyなどを返却するが、
     バイナリの場合は、単体じゃないとダメ(?)

    View full-size slide

  9. 一件落着…?
    これでOK! …とは行かず。
    ここで思い出してほしい…

    View full-size slide

  10. そもそもの要件(私が参加時に決まっていた)
    ・バイナリの送受信などの処理したい
    ・特定の時間に大量アクセスされる予定
    ・スケーラビリティを考慮する
    →上記の理由より、Lambdaを使いたい

    View full-size slide

  11. そもそもの要件(私が参加時に決まっていた)
    ・バイナリの送受信などの処理したい
    ・特定の時間に大量アクセスされる予定
    ・スケーラビリティを考慮する
    →上記の理由より、Lambdaを使いたい

    View full-size slide

  12. ファイル変換処理
    ・音声ファイルのエンコード&デコード
     (既に使用が非推奨でちょい特殊なコーデック)
    ・シェルでコマンド叩けば変換できるらしい
    ・Node.jsの変換ライブラリとか、なさそう…
    →Lambdaってbashの実行ってできるの…?

    View full-size slide

  13. 果たして…
    ・説明資料の作成が面倒なのd、
     10分では時間不足なので、結論だけ言うと…
     できます

    View full-size slide

  14. Lambdaでbash実行
    ・Lambdaにファイルをアップロードしたとき、
     設置されるディレクトリは /var/task/
    ・共有ライブラリは /var/task/lib を読み込む
    ・実行ファイルはフルパス指定でいいよね?

    View full-size slide

  15. Lambdaでbash実行
    ・/tmp 配下は書き込みOK
     (それ以外は書き込みできない)
    ・ソースファイルはzipで固めて、アップロード
    ・Node.jsのchild_processでコマンド実行

    View full-size slide

  16. Lambda Layerを利用する
    ・Lambda Layerにアップロードすると、
     /opt に設置される
    ・パスが通っているところを確認する
    ・共有ライブラリは /opt/lib から読み込む
    ・実行ファイルは /opt/bin から読み込む
    (実行ファイルはフルパス指定がいいと思うけど)

    View full-size slide

  17. ちょっとだけソース見せます
    そっちのほうが、イメージが湧く…でしょう?

    View full-size slide

  18. 参考ページ
    AWS公式: https://aws.amazon.com/jp/lambda/
    API Gatewayがバイナリデータをサポートしたので試してみまし
    た:
    https://dev.classmethod.jp/cloud/aws/binary-data-supp
    orted-by-api-gateway/
    Stackoverflowのページいくつか見たけど、履歴から探せなかっ
    た…

    View full-size slide

  19. Thanks!
    質問は下記までお願いします。
    ◂ @okinari (Twitter)

    View full-size slide