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 Meetup Tokyo #13
Search
Kosaku Kimura
July 30, 2019
Programming
0
780
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
700
Node.jsでのAWSサーバレスアプリプログラミングを 簡単にする技術の研究紹介 (An Introduction of a Technology for Simplifying Serverless Application Programming in AWS with Node.js)
kimusaku
0
1.8k
Other Decks in Programming
See All in Programming
スクラムチームと認知負荷 - ニフティのスクラムトーク Vol2. / NIFTY Tech Talk #18
niftycorp
PRO
1
120
オブジェクト指向のリ・オリエンテーション~歴史を振り返り、AI時代に向きなおる~
hanyudaeiiti
10
5.7k
Milestoner
bkuhlmann
1
400
StreamlitとTerraformでデータカタログを作った話
gussan0223
0
310
OpenAPIを中心に考えるAPI開発入門 / Introduction to API Development with a Focus on OpenAPI
seike460
PRO
2
130
PostmanでAPIの動作確認が楽になった話
h455h1
0
140
元気予報
suu_mire0726
0
860
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.3k
Folding Cheat Sheet #2
philipschwarz
PRO
0
110
本格ローグライク制作にEbitengineを選んでみた
nagainaganawa
0
290
FigmaとPHPで作る1ミリたりとも表示崩れしない最強の帳票印刷ソリューション
ttskch
39
18k
SwiftUI Performance 不要なViewの再描画と更新を抑える
bigamitiongit
1
160
Featured
See All Featured
How GitHub (no longer) Works
holman
304
140k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
24
2.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
Making the Leap to Tech Lead
cromwellryan
123
8.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
11
4.6k
Designing with Data
zakiwarfel
95
4.8k
Building an army of robots
kneath
300
41k
Designing for Performance
lara
601
67k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
273
13k
10 Git Anti Patterns You Should be Aware of
lemiorhan
646
58k
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