Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

実践してみて

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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 }

Slide 21

Slide 21 text

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 = … ) … )

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

[補足] アーキテクチャ概略 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/画像 の送受信 ビジネス ロジック 認証 サービス 利用 監視・計測 永続化・検索・通知など