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
840
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
820
Node.jsでのAWSサーバレスアプリプログラミングを 簡単にする技術の研究紹介 (An Introduction of a Technology for Simplifying Serverless Application Programming in AWS with Node.js)
kimusaku
0
2k
Other Decks in Programming
See All in Programming
CSC305 Lecture 25
javiergs
PRO
0
130
命名をリントする
chiroruxx
1
390
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
3
1.1k
MCP with Cloudflare Workers
yusukebe
2
220
CSC305 Lecture 26
javiergs
PRO
0
140
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
1
370
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
330
Security_for_introducing_eBPF
kentatada
0
110
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
130
SymfonyCon Vienna 2025: Twig, still relevant in 2025?
fabpot
3
1.2k
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
Featured
See All Featured
Six Lessons from altMBA
skipperchong
27
3.5k
Optimising Largest Contentful Paint
csswizardry
33
3k
GitHub's CSS Performance
jonrohan
1030
460k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
We Have a Design System, Now What?
morganepeng
51
7.3k
A Philosophy of Restraint
colly
203
16k
Making the Leap to Tech Lead
cromwellryan
133
9k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Navigating Team Friction
lara
183
15k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
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