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
FaaS上のコードをもっとシンプルに書くためのトランスパイラ / Serverless Mee...
Search
Kosaku Kimura
July 30, 2019
Programming
0
870
FaaS上のコードをもっとシンプルに書くためのトランスパイラ / Serverless Meetup Tokyo #13
Serverless Meetup Tokyo #13での資料です
https://serverless.connpass.com/event/138983/
Kosaku Kimura
July 30, 2019
Tweet
Share
More Decks by Kosaku Kimura
See All by Kosaku Kimura
富士通研究所もGitHubでOSS出してるんですよ! / GitHub Enterprise Roadshow Tokyo
kimusaku
0
900
Node.jsでのAWSサーバレスアプリプログラミングを 簡単にする技術の研究紹介 (An Introduction of a Technology for Simplifying Serverless Application Programming in AWS with Node.js)
kimusaku
0
2.2k
Other Decks in Programming
See All in Programming
XSLTで作るBrainfuck処理系
makki_d
0
210
社内での開発コミュニティ活動とモジュラーモノリス標準化事例のご紹介/xPalette and Introduction of Modular monolith standardization
m4maruyama
1
120
エンジニア向け採用ピッチ資料
inusan
0
120
Passkeys for Java Developers
ynojima
3
860
Gleamという選択肢
comamoca
6
740
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
360
Go1.25からのGOMAXPROCS
kuro_kurorrr
1
760
コード書くの好きな人向けAIコーディング活用tips #orestudy
77web
3
320
無関心の谷
kanayannet
0
180
WindowInsetsだってテストしたい
ryunen344
1
180
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
240
Javaのルールをねじ曲げろ!禁断の操作とその代償から学ぶメタプログラミング入門 / A Guide to Metaprogramming: Lessons from Forbidden Techniques and Their Price
nrslib
3
2k
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
Into the Great Unknown - MozCon
thekraken
39
1.8k
Adopting Sorbet at Scale
ufuk
77
9.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
233
140k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Git: the NoSQL Database
bkeepers
PRO
430
65k
The Language of Interfaces
destraynor
158
25k
Bash Introduction
62gerente
614
210k
Site-Speed That Sticks
csswizardry
10
640
Transcript
FaaS上のコードをもっとシンプルに 書くためのトランスパイラ Kosaku Kimura, FUJITSU LABORATORIES LTD.
[email protected]
Copyright 2019
FUJITSU LABORATORIES LTD. 0 Serverless Meetup Tokyo #13 2019年07月30日 @ 株式会社Speee
自己紹介 Kosaku Kimura(木村 功作) 株式会社 富士通研究所で ソフトウェア開発効率化・自動化の研究開発を行っています https://www.researchgate.net/profile/Kosaku_Kimura Copyright 2019
FUJITSU LABORATORIES LTD. kimusaku https://jawsdays2019.jaws-ug.jp/ http://www.apsec2018.org/ 1
Copyright 2019 FUJITSU LABORATORIES LTD. トランスパイラって何? 2
トランスパイラ ソース(JavaScript)からソース(JavaScript)に変換するコンパイラ TypeScript: 型あり → 型なし Prettier: ぐちゃぐちゃ
→ きれい webpack: 大きい(読める) → 小さい(読めない) Babel: 新しい(まだない) → 古い(もうある) 現代のJavaScript開発環境を支えている大事な技術 Copyright 2019 FUJITSU LABORATORIES LTD. 3
新しい → 古い はこんな感じ Copyright 2019 FUJITSU LABORATORIES LTD. 4
async function foo() { await bar(); } var _asyncToGenerator = function (fn) { ... }; var foo = _asyncToGenerator(function* () { yield bar(); }); https://babeljs.io/docs/en/babel-plugin-transform-async-to-generator
シンプルなもの → ちゃんと動くもの が欲しい サーバレスだとできるだけコードを書きたくない けど全く書かないわけにはいかない ビジネスロジックは書かないといけない.あとAPI非同期呼び出しとか
JavaScriptの非同期処理難しい コールバック, Promise, generator/yield, async/await・・・ デプロイするものを軽くしたいから新しい依存関係を増やしたくない いい感じのシンプルさで書けて、実際の複雑な非同期処理に書き換えてくれ るようなトランスパイラって無いかなー Copyright 2019 FUJITSU LABORATORIES LTD. 5
あります(作りました) Escapin the TranspilerTM https://github.com/FujitsuLaboratories/escapin yarn global add escapin ||
npm install –g escapin 特長 Serverless Frameworkと連携 DynamoDB Table, S3 Bucketが連想配列になる Swagger/OASで書かれたREST API呼び出しがJSONオブジェクト操作になる 非同期処理のことを忘れられる Copyright 2019 FUJITSU LABORATORIES LTD. 6
Type Information Escapinのトランスパイル手順 const items = {}; ... items[id] =
obj; ... ... await new Promise( (resolve, reject) => { Storage.put({ name: "items", key: id, value: obj }, (err, res) =>{ if (err) reject(err); else resolve(res); }); ... AST Walker / テンプレート (Babel traverse/templateを使用) platform: a-cloud 元のコード serverless.yml 設定ファイル function function type Storage#put error-first-callback FaaSにデプロイする コード コールバック分解 詳細化 非同期化 Copyright 2019 FUJITSU LABORATORIES LTD. 関数型判別 (TypeScript Compiler APIを使用) (c) 2019 Serverless, Inc. 7
コールバック分解 中途半端な非同期をいったん同期側に全部倒す Copyright 2019 FUJITSU LABORATORIES LTD. func(arg, (err,
data) => { if (err) { handleError(err); return; } doSomething(data); }); try { const data = func(arg); doSomething(data); } catch (err) { handleError(err); } 8
詳細化 – API Method Path GET POST PUT DELETE /items
api.items api.items(body) api.items = body delete api.items /items/:id api.items[id] api.items[id](body) api.items[id] = body delete api.items[id] /items/:id with params api.items [id][params] api.items [id][params](body) api.items [id][params] = body delete api.items [id][params] Copyright 2019 FUJITSU LABORATORIES LTD. import api from 'https://path/to/swagger.yaml'; const item = api.items[id]; const item = request({ 'uri': `https://api.com/v1/items/${id}`, 'method': 'get', 'contentType': 'application/json', 'headers': { 'authorization': 'Basic ... ' } }); Swagger/OASを読み込んで型決め 9
Function Lambda export function foo(bar) {…} createFunction 詳細化 – AWS
Object DynamoDB S3 export const obj: dynamodb|s3 = {} createTable createBucket obj[id] getItem getObject obj[id] = … putItem putObject delete obj[id] deleteItem deleteObject Copyright 2019 FUJITSU LABORATORIES LTD. 10
関数型判別 以下の4種類に緩く判別(TypeScript Compiler API使ってます) 1. Asynchronous: Promiseを返すもの Axios.get等 2.
Error-first-callback: 第一引数がerrorオブジェクトなコールバックを引 数に持つもの(Promisifyできるもの) Request, AWS SDK関連 3. General-calback: Error-firstでないコールバックを引数に持つもの Arrayのmap, forEach等 4. General: それ以外 Copyright 2019 FUJITSU LABORATORIES LTD. 11
非同期化 Function Type DynamoDB#getItem error-first-callback Array#map general-callback … … 元のコード
非同期化されたコード 関数型 Copyright 2019 FUJITSU LABORATORIES LTD. const data = new DynamoDB().getItem({ TableName: 'csv', }); const keys = data.Items.map( item => item.key.S); const _data = await new Promise((resolve, reject) => { new DynamoDB().getItem({ TableName: 'csv', … }, (err, data) => { if (err) reject(err); else resolve(data); }); }); const keys = _data.Items.map( item => item.key.S); 12
最後に https://github.com/FujitsuLaboratories/escapin 面白そうと思った方はぜひ使ってみてください しばらくunstableが続きそうなのはご容赦 欲しい機能、改善案、感想等、聞かせてください Copyright 2019
FUJITSU LABORATORIES LTD. 13
None