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
130
terraform-provider-aws にプルリクして マージされるまで
exoego
2
370
ライブラリをパブリッシュせずにすばやく試す
exoego
2
250
esbuild 最適化芸人
exoego
3
1.8k
いい感じに AWS を組み合わせたビルディングブロックでアプリ開発を支援する / TdTechTalk 2022 11
exoego
0
650
Empowering App Dev by Nicely-Crafted High-Level AWS Components
exoego
0
51
月間数十億リクエストのマイクロサービスを支える JVM+AWS フルサーバーレス開発事例 / Now and Future of Fully Serverless development at Chatwork
exoego
1
710
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
マルチモーダル理解と生成の統合 DeepSeek Janus, etc... / Multimodal Understanding and Generation Integration
hiroga
0
360
Ask! NIKKEIの運用基盤と改善に向けた取り組み / NIKKEI TECH TALK #30
kaitomajima
1
450
「海外登壇」という 選択肢を与えるために 〜Gophers EX
logica0419
0
500
個人開発から公式機能へ: PlaywrightとRailsをつなげた3年の軌跡
yusukeiwaki
10
2.7k
10分で紹介するAmazon Bedrock利用時のセキュリティ対策 / 10-minutes introduction to security measures when using Amazon Bedrock
hideakiaoyagi
0
170
自動テストの世界に、この5年間で起きたこと
autifyhq
10
7.1k
PL900試験から学ぶ Power Platform 基礎知識講座
kumikeyy
0
110
スクラムのイテレーションを導入してチームの雰囲気がより良くなった話
eccyun
0
110
テストアーキテクチャ設計で実現する高品質で高スピードな開発の実践 / Test Architecture Design in Practice
ropqa
3
710
ビジネスと現場活動をつなぐソフトウェアエンジニアリング~とあるスタートアッププロダクトの成長記録より~
mizunori
0
210
Ask! NIKKEI RAG検索技術の深層
hotchpotch
13
2.8k
[2025-02-07]生成AIで変える問い合わせの未来 〜チームグローバル化の香りを添えて〜
tosite
1
290
Featured
See All Featured
Producing Creativity
orderedlist
PRO
343
39k
How GitHub (no longer) Works
holman
313
140k
Visualization
eitanlees
146
15k
4 Signs Your Business is Dying
shpigford
182
22k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
How STYLIGHT went responsive
nonsquared
98
5.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Code Review Best Practice
trishagee
66
17k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
8
270
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Scaling GitHub
holman
459
140k
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/画像 の送受信 ビジネス ロジック 認証 サービス 利用 監視・計測 永続化・検索・通知など