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

Scala.jsでAWS Lambda開発 / Using scala.js in AWS Lambda Development

Scala.jsでAWS Lambda開発 / Using scala.js in AWS Lambda Development

TATSUNO Yasuhiro

October 02, 2017
Tweet

More Decks by TATSUNO Yasuhiro

Other Decks in Technology

Transcript

  1. Scala.jsでAWS Lambda開発:
    開発生産性UPと計算資源節約の両立
    立野靖博, 2017-09-27
    JAWS-UG AWS Cloud Roadshow 2017 名古屋

    View Slide

  2. 本日お話すること
    • 初めてのサーバーレス開発で感じた利点、
    問題点、解決策
    • いわゆる AltJS(JavaScriptの代替言語)を
    AWS Lambda 開発に使う利点や方法
    機械学習研究者さま向けSaaS (クラウド型ソフト)を
    AWSでサーバーレスアーキで開発した事例から

    View Slide

  3. [PR] 弊社製品:教師データ作成SaaS
    ご興味ある方はお声掛け、ご連絡ください
    画像や動画へ教師データ付け
    短時間・高品質を実現するUI
    作業品質や生産性見える化
    豊富なAPIでシステム連携
    https://goo.gl/VfHNgT

    View Slide

  4. 話者
    名前: 立野靖博
    所属: 来栖川電算 SaaS開発リーダー
    経歴: 製造業子会社SE6年→現職2年、AWS半年
    好きなAWS: Lambda, CloudFront, X-Ray

    View Slide

  5. 所属紹介
    (有)来栖川電算
    ビジネスに役立つAIを届ける名古屋の会社
    • AI技術のライセンス販売、研究、SI
    • お客様:各種製造業、通信、保険
    コミュニティ活動:
    機械学習名古屋、Scala読書会、JAWS-UG他

    View Slide

  6. 「教師データ作成SaaS」の開発背景
    • 機械学習で良い予測モデルを得るには、アルゴリ
    ズムだけでなく、教師データの質と量も重要
    • 弊社でも、教師データを作る・管理するツールの
    開発と運用に時間をとられてきた
    教師データ
    作成ツール
    教師データ
    機械学習の
    予測モデル
    アルゴリズム
    「こんなツール作って」というお客様の声も
    増えてきたので、ツールをサービス化したい

    View Slide

  7. 開発の目標
    • エンジニアが機能開発に専念しやすいように、
    インフラ管理はAWSの豊富なサービスを活用
    • 特に, 負荷に応じて楽々スケール&コスト節約
    するようにAWS Lambdaでサーバーレス開発
    • 長期育成するため保守しやすい言語で書きたい
    (JSやPythonは避けたい)
    この両立が本日のメインテーマ

    View Slide

  8. AWS Lambdaの実行環境と開発言語
    Java版
    JVM
    JavaScript版
    C#版 Python版
    Node.js
    .NET Python
    SDK
    実行環境
    • Lambdaの実行環境は大きく4種提供されている
    • 各環境用のAWS SDKを使って開発する
    Java JavaScript
    C# Python
    言語

    View Slide

  9. • 社内知見豊富で非常に強力、保守性が高い
    • Java版AWS SDKを使用でき、JVMで動作するので、
    Lambda開発に使える
    • Lambdaとブラウザでコード共有(後述)して、
    開発スピードUP
    弊社の第一候補: Scala言語
    Scala
    SDK
    実行環境
    言語
    Java版
    JVM
    Domain Model
    Domain Service
    Utility
    Presentation
    WebGL
    AJAX

    Database
    Service

    Java
    共有部分

    View Slide

  10. • メモリをケチるとコールドスタートに数秒
    かかる。Web APIとして使うには遅い
    • メモリ増やしたりインスタンスを暖めてお
    けば速くなるが、無料枠が削られてしまう
    • 使いたいJARファイルを色々乗せたら、
    Lambdaのデプロイ上限50MBスレスレ
    Scala Lambda検証で困った課題
    このままではScala使用できない…

    View Slide

  11. Scala
    SDK
    実行環境
    言語
    Java版
    JVM
    • Scala.js: Scalaで開発し、JSに変換する仕組み
    • Node.jsで走らせることでコールドスタートが一瞬
    • 色々ライブラリ使っても2MB程度で収まった
    解決策:ScalaをNode.jsで走らせる
    実行環境の問題がクリア→Scala採用
    JavaScript版
    Node.js
    JavaScript
    変換
    呼出

    View Slide

  12. NodejsならScalaも省メモリで高速起動
    128MB 256MB 512MB 1024MB 1536MB
    10秒
    8秒
    6秒
    4秒
    2秒
    0秒
    Java (JVM)
    Scala (JVM)
    Scala (Node.js)
    コールドスタート0.1秒以内

    View Slide

  13. Scala.jsでLambda開発する準備
    1. AWS SDKの準備
    • Nodejs版が実行環境に導入済み→ZIPの容量削減に貢献
    • AWS SDKのScala.js用型定義は以下を使用
    https://github.com/balshor/aws-sdk-scalajs-facade
    2. その他の npm モジュールはTypeScript 用から変換
    (なければ自作)https://github.com/sjrd/scala-js-ts-importer
    3. あとは Scala を書くだけ
    実装したLambdaがnodejsから見つけられるように、
    @JSExportアノテーションで名前を固定すればOK

    View Slide

  14. Scala.js Lambdaをデプロイする
    1. (Serverless Framework)の設定
    ファイルに、Lambdaの名前や認証方法などを記述。
    2. Scalaのビルドツール で JSに変換し、
    アップロード用のZIPにかためる(sbtタスクとし
    て自動化する)
    3. コマンドでデプロイ
    $> sls deploy
    Lambdaと対応するAPI Gatewayの作成を
    よろしくやってくれます

    View Slide

  15. 実践してみて

    View Slide

  16. AWS Lambdaでよかったこと
    ①楽々スケールアウトで大幅コストダウン
    • Lambda + API Gateway+DynamoDBは、めちゃ
    くちゃ簡単にスケールアウトしてくれる
    • 調達も一瞬、オンプレだとこうはいかない
    ②実行時間の上限(5分)に収まるように小さな
    Lambdaに分割するので、組合せて複雑な機能を実
    現しやすくなった

    View Slide

  17. AWS Lambdaでよかったこと
    ③イベントハンドラという分かりやすいモデル
    • 様々な処理を同一のモデルで書ける:API、定時
    バッチ、ファイル検知バッチ、メッセージ処理…
    • 1イベントから複数回実行されてもいいように設
    計する(べき等)ので、エラー時も安心して再実
    行できる
    スケールさせるためにLambdaを使うと、
    設計が矯正されて、開発も運用もラクに!

    View Slide

  18. AWS Lambdaで困ったこと
    ① Lambdaと相性の良い DynamoDB が貧弱
    • 全スキャンになってしまうからリッチなクエリ使えない
    • クエリ用のGlobal Secondary Indexを用意した
    • それでも足りないところは AWS Elasticsearch Service
    • 複数DB更新時に欲しいトランザクションがない
    • 楽観的ロックでほぼカバー、複雑な所はキュー(SQS)
    • ジョインがない→使わないように回避
    AWSさん、Azure C○sm○sみたいなDBください

    View Slide

  19. AWS Lambdaで困ったこと
    ②ログ(CloudWatch Logs)が見づらい
    Lambda別ロググループ>関数インスタンス別ログスト
    リーム、などとバラけてしまい、一覧や検索できない
    無料なのはありがたいですが…。
    はてなのmackerel他、監視・BIツールを検討中

    View Slide

  20. Scala/Scala.jsで良かったこと
    ①代数的データ構造、構造的部分型などの強力な型
    type Host = String | js.Array[String]
    sealed trait Color
    case class RGB(r:Int,g:Int,b:Int) extends Color
    case class RGBA(r:Int,g:Int,b:Int,a:Double) extends Color
    case class HSV(h:Double,s:Double,v:Double) extends Color
    type HasName = { def name(): String }

    View Slide

  21. Scala/Scala.jsで良かったこと
    ②JavaScriptと相互運用するための様々な機能
    プロトタイピング中 or 型つけるまでもないときは
    Dynamic型でしのげる
    Scalaの予約語をJSの識別子に使える
    trait Config extends js.Object {
    val `type`: String = js.native
    }
    trait Config extends js.Object {
    @JSName(“type”)
    val typeName: String = js.native
    }
    cognitoUser.authenticateUser(
    callbacks = js.Dynamic.literal(
    onSuccess = …
    onFailure = …
    ) …
    )

    View Slide

  22. Scala/Scala.jsで良かったこと
    ③コード量が減る
    • for式: コレクション、並行処理(Future)、エラー
    (Try) などを同じように簡潔に書ける
    • 標準で強力なライブラリ:不変/可変コレクション、
    遅延リスト、正規表現
    • ブラウザとAWS Lambdaでコード共有
    ④IDEでの静的検査やリファクタリングで、
    品質・作業性UP
    JSでありがちな作り込みや型エラーが減って
    IDEでサクサク書けて、開発効率UP

    View Slide

  23. Scala/Scala.jsで困ったこと
    • TypeScriptの型定義をScala.js用に変換するツール
    で、サポートされてない構文が多かった
    →パーサーを改良した
    • AWS SDKはあくまでNode.js用なので、型をつける
    だけではScalaらしく書きにくい
    →便利メソッドを持つimplicitクラスなどを用意
    今後のProjectでも使えるので投資と割切。
    興味がある方がいればOSSで公開します

    View Slide

  24. まとめ
    • AWS Lambdaでサーバーレス開発したら、本当
    にインフラでなく開発に専念できて良かった
    • 生産性の高い言語をLambdaで使う手段として
    のAltJS(弊社ではScala.js)、アリでは
    • AltJSで開発したLambdaをnodejsで実行すれば、
    コールドスタートやZIPサイズ制限も心配なし
    IoT向けLambda(AWS Greenglass)でもScalaがイケるかも

    View Slide

  25. [PR] スタッフ募集中
    • バックエンド開発(AWS, Java/Scala, …)
    • フロントエンド開発(UX, iOS/Android, …)
    • 認識技術(機械学習, アルゴリズム, 高速化,
    省メモリ, 省メモリ, Java/C++, …)
    アルバイト、転職検希望者、パートナー企業…
    一緒に開発してみたい方、お力をお貸しください

    View Slide

  26. [補足] サービスご利用のイメージ
    研究者
    開発者
    データ作成者
    ①画像、動画、センサデータ
    などをアップロード
    ②教師データに欲しい属性や
    入力値、その制約などを設定
    ⑤完成した教師データを
    ダウンロードして利用
    ③教師データを作成
    ④見落しや誤入力を点検
    研究者
    開発者
    教師データエディタ
    作業管理
    ダッシュボード、他
    ご興味ある方はお声掛け、ご連絡ください https://goo.gl/VfHNgT

    View Slide

  27. [補足] アーキテクチャ概略
    AWS Lambda
    Amazon
    S3
    Amazon
    DynamoDB
    Amazon
    CloudFront
    AWS X-Ray
    Amazon
    CloudWatch
    Amazon ES
    Amazon
    Cognito
    Amazon
    API Gateway
    Amazon
    SES
    Amazon
    SQS
    Amazon
    SNS
    研究者
    開発者
    データ
    作成・点検者
    Amazon
    S3
    HTML/CSS
    JS配信
    JSON/画像
    の送受信
    ビジネス
    ロジック
    認証
    サービス
    利用
    監視・計測
    永続化・検索・通知など

    View Slide