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

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

C0eb1445cda9489ebf8c31c367fec3fb?s=128

TATSUNO Yasuhiro

October 02, 2017
Tweet

Transcript

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

    名古屋
  2. 本日お話すること • 初めてのサーバーレス開発で感じた利点、 問題点、解決策 • いわゆる AltJS(JavaScriptの代替言語)を AWS Lambda 開発に使う利点や方法

    機械学習研究者さま向けSaaS (クラウド型ソフト)を AWSでサーバーレスアーキで開発した事例から
  3. [PR] 弊社製品:教師データ作成SaaS ご興味ある方はお声掛け、ご連絡ください 画像や動画へ教師データ付け 短時間・高品質を実現するUI 作業品質や生産性見える化 豊富なAPIでシステム連携 https://goo.gl/VfHNgT

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

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

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

    機械学習の 予測モデル アルゴリズム 「こんなツール作って」というお客様の声も 増えてきたので、ツールをサービス化したい
  7. 開発の目標 • エンジニアが機能開発に専念しやすいように、 インフラ管理はAWSの豊富なサービスを活用 • 特に, 負荷に応じて楽々スケール&コスト節約 するようにAWS Lambdaでサーバーレス開発 •

    長期育成するため保守しやすい言語で書きたい (JSやPythonは避けたい) この両立が本日のメインテーマ
  8. AWS Lambdaの実行環境と開発言語 Java版 JVM JavaScript版 C#版 Python版 Node.js .NET Python

    SDK 実行環境 • Lambdaの実行環境は大きく4種提供されている • 各環境用のAWS SDKを使って開発する Java JavaScript C# Python 言語
  9. • 社内知見豊富で非常に強力、保守性が高い • Java版AWS SDKを使用でき、JVMで動作するので、 Lambda開発に使える • Lambdaとブラウザでコード共有(後述)して、 開発スピードUP 弊社の第一候補:

    Scala言語 Scala SDK 実行環境 言語 Java版 JVM Domain Model Domain Service Utility Presentation WebGL AJAX … Database Service … Java 共有部分
  10. • メモリをケチるとコールドスタートに数秒 かかる。Web APIとして使うには遅い • メモリ増やしたりインスタンスを暖めてお けば速くなるが、無料枠が削られてしまう • 使いたいJARファイルを色々乗せたら、 Lambdaのデプロイ上限50MBスレスレ

    Scala Lambda検証で困った課題 このままではScala使用できない…
  11. Scala SDK 実行環境 言語 Java版 JVM • Scala.js: Scalaで開発し、JSに変換する仕組み •

    Node.jsで走らせることでコールドスタートが一瞬 • 色々ライブラリ使っても2MB程度で収まった 解決策:ScalaをNode.jsで走らせる 実行環境の問題がクリア→Scala採用 JavaScript版 Node.js JavaScript 変換 呼出
  12. NodejsならScalaも省メモリで高速起動 128MB 256MB 512MB 1024MB 1536MB 10秒 8秒 6秒 4秒

    2秒 0秒 Java (JVM) Scala (JVM) Scala (Node.js) コールドスタート0.1秒以内
  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
  14. Scala.js Lambdaをデプロイする 1. (Serverless Framework)の設定 ファイルに、Lambdaの名前や認証方法などを記述。 2. Scalaのビルドツール で JSに変換し、

    アップロード用のZIPにかためる(sbtタスクとし て自動化する) 3. コマンドでデプロイ $> sls deploy Lambdaと対応するAPI Gatewayの作成を よろしくやってくれます
  15. 実践してみて

  16. AWS Lambdaでよかったこと ①楽々スケールアウトで大幅コストダウン • Lambda + API Gateway+DynamoDBは、めちゃ くちゃ簡単にスケールアウトしてくれる •

    調達も一瞬、オンプレだとこうはいかない ②実行時間の上限(5分)に収まるように小さな Lambdaに分割するので、組合せて複雑な機能を実 現しやすくなった
  17. AWS Lambdaでよかったこと ③イベントハンドラという分かりやすいモデル • 様々な処理を同一のモデルで書ける:API、定時 バッチ、ファイル検知バッチ、メッセージ処理… • 1イベントから複数回実行されてもいいように設 計する(べき等)ので、エラー時も安心して再実 行できる

    スケールさせるためにLambdaを使うと、 設計が矯正されて、開発も運用もラクに!
  18. AWS Lambdaで困ったこと ① Lambdaと相性の良い DynamoDB が貧弱 • 全スキャンになってしまうからリッチなクエリ使えない • クエリ用のGlobal

    Secondary Indexを用意した • それでも足りないところは AWS Elasticsearch Service • 複数DB更新時に欲しいトランザクションがない • 楽観的ロックでほぼカバー、複雑な所はキュー(SQS) • ジョインがない→使わないように回避 AWSさん、Azure C◦sm◦sみたいなDBください
  19. AWS Lambdaで困ったこと ②ログ(CloudWatch Logs)が見づらい Lambda別ロググループ>関数インスタンス別ログスト リーム、などとバラけてしまい、一覧や検索できない 無料なのはありがたいですが…。 はてなのmackerel他、監視・BIツールを検討中

  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 }
  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 = … ) … )
  22. Scala/Scala.jsで良かったこと ③コード量が減る • for式: コレクション、並行処理(Future)、エラー (Try) などを同じように簡潔に書ける • 標準で強力なライブラリ:不変/可変コレクション、 遅延リスト、正規表現

    • ブラウザとAWS Lambdaでコード共有 ④IDEでの静的検査やリファクタリングで、 品質・作業性UP JSでありがちな作り込みや型エラーが減って IDEでサクサク書けて、開発効率UP
  23. Scala/Scala.jsで困ったこと • TypeScriptの型定義をScala.js用に変換するツール で、サポートされてない構文が多かった →パーサーを改良した • AWS SDKはあくまでNode.js用なので、型をつける だけではScalaらしく書きにくい →便利メソッドを持つimplicitクラスなどを用意

    今後のProjectでも使えるので投資と割切。 興味がある方がいればOSSで公開します
  24. まとめ • AWS Lambdaでサーバーレス開発したら、本当 にインフラでなく開発に専念できて良かった • 生産性の高い言語をLambdaで使う手段として のAltJS(弊社ではScala.js)、アリでは • AltJSで開発したLambdaをnodejsで実行すれば、

    コールドスタートやZIPサイズ制限も心配なし IoT向けLambda(AWS Greenglass)でもScalaがイケるかも
  25. [PR] スタッフ募集中 • バックエンド開発(AWS, Java/Scala, …) • フロントエンド開発(UX, iOS/Android, …)

    • 認識技術(機械学習, アルゴリズム, 高速化, 省メモリ, 省メモリ, Java/C++, …) アルバイト、転職検希望者、パートナー企業… 一緒に開発してみたい方、お力をお貸しください
  26. [補足] サービスご利用のイメージ 研究者 開発者 データ作成者 ①画像、動画、センサデータ などをアップロード ②教師データに欲しい属性や 入力値、その制約などを設定 ⑤完成した教師データを

    ダウンロードして利用 ③教師データを作成 ④見落しや誤入力を点検 研究者 開発者 教師データエディタ 作業管理 ダッシュボード、他 ご興味ある方はお声掛け、ご連絡ください https://goo.gl/VfHNgT
  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/画像 の送受信 ビジネス ロジック 認証 サービス 利用 監視・計測 永続化・検索・通知など