Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Scala.jsでAWS Lambda開発 / Using scala.js in AWS L...
Search
TATSUNO Yasuhiro
October 02, 2017
Technology
1
2.2k
Scala.jsでAWS Lambda開発 / Using scala.js in AWS Lambda Development
TATSUNO Yasuhiro
October 02, 2017
Tweet
Share
More Decks by TATSUNO Yasuhiro
See All by TATSUNO Yasuhiro
Scala 3 で GLSL のための c-like-for を実装してみた
exoego
1
610
Bun に LCOV 出力を実装した
exoego
2
240
terraform-provider-aws にプルリクして マージされるまで
exoego
2
440
ライブラリをパブリッシュせずにすばやく試す
exoego
2
290
esbuild 最適化芸人
exoego
3
2.1k
いい感じに AWS を組み合わせたビルディングブロックでアプリ開発を支援する / TdTechTalk 2022 11
exoego
0
760
Empowering App Dev by Nicely-Crafted High-Level AWS Components
exoego
0
80
月間数十億リクエストのマイクロサービスを支える JVM+AWS フルサーバーレス開発事例 / Now and Future of Fully Serverless development at Chatwork
exoego
1
760
Scala と AWS でフルサーバーレス開発事例 / How Chatworks uses Scala and Serverless
exoego
3
1.5k
Other Decks in Technology
See All in Technology
Contributing to Rails? Start with the Gems You Already Use
yahonda
2
110
開発生産性を測る前にやるべきこと - 組織改善の実践 / Before Measuring Dev Productivity
kaonavi
14
6.3k
自律的なスケーリング手法FASTにおけるVPoEとしてのアカウンタビリティ / dev-productivity-con-2025
yoshikiiida
2
17k
いつの間にか入れ替わってる!?新しいAWS Security Hubとは?
cmusudakeisuke
0
140
OSSのSNSツール「Misskey」をさわってみよう(右下ワイプで私のOSCの20年を振り返ります) / 20250705-osc2025-do
akkiesoft
0
170
FOSS4G 2025 KANSAI QGISで点群データをいろいろしてみた
kou_kita
0
410
LangChain Interrupt & LangChain Ambassadors meetingレポート
os1ma
2
330
United airlines®️ USA Contact Numbers: Complete 2025 Support Guide
unitedflyhelp
0
330
AWS CDK 入門ガイド これだけは知っておきたいヒント集
anank
1
160
[SRE NEXT] ARR150億円_エンジニア140名_27チーム_17プロダクトから始めるSLO.pdf
satos
0
130
サイバーエージェントグループのSRE10年の歩みとAI時代の生存戦略
shotatsuge
3
300
赤煉瓦倉庫勉強会「Databricksを選んだ理由と、絶賛真っ只中のデータ基盤移行体験記」
ivry_presentationmaterials
2
380
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
140
7k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Building an army of robots
kneath
306
45k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Bash Introduction
62gerente
613
210k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
970
How STYLIGHT went responsive
nonsquared
100
5.6k
Transcript
Scala.jsでAWS Lambda開発: 開発生産性UPと計算資源節約の両立 立野靖博, 2017-09-27 JAWS-UG AWS Cloud Roadshow 2017
名古屋
本日お話すること • 初めてのサーバーレス開発で感じた利点、 問題点、解決策 • いわゆる AltJS(JavaScriptの代替言語)を AWS Lambda 開発に使う利点や方法
機械学習研究者さま向けSaaS (クラウド型ソフト)を AWSでサーバーレスアーキで開発した事例から
[PR] 弊社製品:教師データ作成SaaS ご興味ある方はお声掛け、ご連絡ください 画像や動画へ教師データ付け 短時間・高品質を実現するUI 作業品質や生産性見える化 豊富なAPIでシステム連携 https://goo.gl/VfHNgT
話者 名前: 立野靖博 所属: 来栖川電算 SaaS開発リーダー 経歴: 製造業子会社SE6年→現職2年、AWS半年 好きなAWS: Lambda,
CloudFront, X-Ray
所属紹介 (有)来栖川電算 ビジネスに役立つAIを届ける名古屋の会社 • AI技術のライセンス販売、研究、SI • お客様:各種製造業、通信、保険 コミュニティ活動: 機械学習名古屋、Scala読書会、JAWS-UG他
「教師データ作成SaaS」の開発背景 • 機械学習で良い予測モデルを得るには、アルゴリ ズムだけでなく、教師データの質と量も重要 • 弊社でも、教師データを作る・管理するツールの 開発と運用に時間をとられてきた 教師データ 作成ツール 教師データ
機械学習の 予測モデル アルゴリズム 「こんなツール作って」というお客様の声も 増えてきたので、ツールをサービス化したい
開発の目標 • エンジニアが機能開発に専念しやすいように、 インフラ管理はAWSの豊富なサービスを活用 • 特に, 負荷に応じて楽々スケール&コスト節約 するようにAWS Lambdaでサーバーレス開発 •
長期育成するため保守しやすい言語で書きたい (JSやPythonは避けたい) この両立が本日のメインテーマ
AWS Lambdaの実行環境と開発言語 Java版 JVM JavaScript版 C#版 Python版 Node.js .NET Python
SDK 実行環境 • Lambdaの実行環境は大きく4種提供されている • 各環境用のAWS SDKを使って開発する Java JavaScript C# Python 言語
• 社内知見豊富で非常に強力、保守性が高い • Java版AWS SDKを使用でき、JVMで動作するので、 Lambda開発に使える • Lambdaとブラウザでコード共有(後述)して、 開発スピードUP 弊社の第一候補:
Scala言語 Scala SDK 実行環境 言語 Java版 JVM Domain Model Domain Service Utility Presentation WebGL AJAX … Database Service … Java 共有部分
• メモリをケチるとコールドスタートに数秒 かかる。Web APIとして使うには遅い • メモリ増やしたりインスタンスを暖めてお けば速くなるが、無料枠が削られてしまう • 使いたいJARファイルを色々乗せたら、 Lambdaのデプロイ上限50MBスレスレ
Scala Lambda検証で困った課題 このままではScala使用できない…
Scala SDK 実行環境 言語 Java版 JVM • Scala.js: Scalaで開発し、JSに変換する仕組み •
Node.jsで走らせることでコールドスタートが一瞬 • 色々ライブラリ使っても2MB程度で収まった 解決策:ScalaをNode.jsで走らせる 実行環境の問題がクリア→Scala採用 JavaScript版 Node.js JavaScript 変換 呼出
NodejsならScalaも省メモリで高速起動 128MB 256MB 512MB 1024MB 1536MB 10秒 8秒 6秒 4秒
2秒 0秒 Java (JVM) Scala (JVM) Scala (Node.js) コールドスタート0.1秒以内
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
Scala.js Lambdaをデプロイする 1. (Serverless Framework)の設定 ファイルに、Lambdaの名前や認証方法などを記述。 2. Scalaのビルドツール で JSに変換し、
アップロード用のZIPにかためる(sbtタスクとし て自動化する) 3. コマンドでデプロイ $> sls deploy Lambdaと対応するAPI Gatewayの作成を よろしくやってくれます
実践してみて
AWS Lambdaでよかったこと ①楽々スケールアウトで大幅コストダウン • Lambda + API Gateway+DynamoDBは、めちゃ くちゃ簡単にスケールアウトしてくれる •
調達も一瞬、オンプレだとこうはいかない ②実行時間の上限(5分)に収まるように小さな Lambdaに分割するので、組合せて複雑な機能を実 現しやすくなった
AWS Lambdaでよかったこと ③イベントハンドラという分かりやすいモデル • 様々な処理を同一のモデルで書ける:API、定時 バッチ、ファイル検知バッチ、メッセージ処理… • 1イベントから複数回実行されてもいいように設 計する(べき等)ので、エラー時も安心して再実 行できる
スケールさせるためにLambdaを使うと、 設計が矯正されて、開発も運用もラクに!
AWS Lambdaで困ったこと ① Lambdaと相性の良い DynamoDB が貧弱 • 全スキャンになってしまうからリッチなクエリ使えない • クエリ用のGlobal
Secondary Indexを用意した • それでも足りないところは AWS Elasticsearch Service • 複数DB更新時に欲しいトランザクションがない • 楽観的ロックでほぼカバー、複雑な所はキュー(SQS) • ジョインがない→使わないように回避 AWSさん、Azure C◦sm◦sみたいなDBください
AWS Lambdaで困ったこと ②ログ(CloudWatch Logs)が見づらい Lambda別ロググループ>関数インスタンス別ログスト リーム、などとバラけてしまい、一覧や検索できない 無料なのはありがたいですが…。 はてなのmackerel他、監視・BIツールを検討中
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 }
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 = … ) … )
Scala/Scala.jsで良かったこと ③コード量が減る • for式: コレクション、並行処理(Future)、エラー (Try) などを同じように簡潔に書ける • 標準で強力なライブラリ:不変/可変コレクション、 遅延リスト、正規表現
• ブラウザとAWS Lambdaでコード共有 ④IDEでの静的検査やリファクタリングで、 品質・作業性UP JSでありがちな作り込みや型エラーが減って IDEでサクサク書けて、開発効率UP
Scala/Scala.jsで困ったこと • TypeScriptの型定義をScala.js用に変換するツール で、サポートされてない構文が多かった →パーサーを改良した • AWS SDKはあくまでNode.js用なので、型をつける だけではScalaらしく書きにくい →便利メソッドを持つimplicitクラスなどを用意
今後のProjectでも使えるので投資と割切。 興味がある方がいればOSSで公開します
まとめ • AWS Lambdaでサーバーレス開発したら、本当 にインフラでなく開発に専念できて良かった • 生産性の高い言語をLambdaで使う手段として のAltJS(弊社ではScala.js)、アリでは • AltJSで開発したLambdaをnodejsで実行すれば、
コールドスタートやZIPサイズ制限も心配なし IoT向けLambda(AWS Greenglass)でもScalaがイケるかも
[PR] スタッフ募集中 • バックエンド開発(AWS, Java/Scala, …) • フロントエンド開発(UX, iOS/Android, …)
• 認識技術(機械学習, アルゴリズム, 高速化, 省メモリ, 省メモリ, Java/C++, …) アルバイト、転職検希望者、パートナー企業… 一緒に開発してみたい方、お力をお貸しください
[補足] サービスご利用のイメージ 研究者 開発者 データ作成者 ①画像、動画、センサデータ などをアップロード ②教師データに欲しい属性や 入力値、その制約などを設定 ⑤完成した教師データを
ダウンロードして利用 ③教師データを作成 ④見落しや誤入力を点検 研究者 開発者 教師データエディタ 作業管理 ダッシュボード、他 ご興味ある方はお声掛け、ご連絡ください https://goo.gl/VfHNgT
[補足] アーキテクチャ概略 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/画像 の送受信 ビジネス ロジック 認証 サービス 利用 監視・計測 永続化・検索・通知など