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.1k
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
Bun に LCOV 出力を実装した
exoego
2
96
terraform-provider-aws にプルリクして マージされるまで
exoego
2
350
ライブラリをパブリッシュせずにすばやく試す
exoego
2
220
esbuild 最適化芸人
exoego
3
1.7k
いい感じに AWS を組み合わせたビルディングブロックでアプリ開発を支援する / TdTechTalk 2022 11
exoego
0
610
Empowering App Dev by Nicely-Crafted High-Level AWS Components
exoego
0
39
月間数十億リクエストのマイクロサービスを支える JVM+AWS フルサーバーレス開発事例 / Now and Future of Fully Serverless development at Chatwork
exoego
1
680
Scala と AWS でフルサーバーレス開発事例 / How Chatworks uses Scala and Serverless
exoego
3
1.4k
忙しい Scala 開発者の超時間節約術 / Big Timesavers for Busy Scala Developers
exoego
1
1.1k
Other Decks in Technology
See All in Technology
JVM(JavaVM)の性能分析者観点で探るInstanaの可能性
instanautsjp
0
120
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
290
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
320
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
280
OCI技術資料 : ファイル・ストレージ 概要
ocise
3
11k
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
.NET 9 のパフォーマンス改善
nenonaninu
0
1.3k
怖くない!ゼロから始めるPHPソースコードコンパイル入門
colopl
0
160
AWS re:Invent 2024 ふりかえり勉強会
yhana
0
450
5分でわかるDuckDB
chanyou0311
10
3.3k
ハイテク休憩
sat
PRO
2
180
多領域インシデントマネジメントへの挑戦:ハードウェアとソフトウェアの融合が生む課題/Challenge to multidisciplinary incident management: Issues created by the fusion of hardware and software
bitkey
PRO
2
120
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Testing 201, or: Great Expectations
jmmastey
41
7.1k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.1k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
810
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Thoughts on Productivity
jonyablonski
68
4.4k
Git: the NoSQL Database
bkeepers
PRO
427
64k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
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/画像 の送受信 ビジネス ロジック 認証 サービス 利用 監視・計測 永続化・検索・通知など