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
900
0
Share
FaaS上のコードをもっとシンプルに書くためのトランスパイラ / Serverless Meetup Tokyo #13
Serverless Meetup Tokyo #13での資料です
https://serverless.connpass.com/event/138983/
Kosaku Kimura
July 30, 2019
More Decks by Kosaku Kimura
See All by Kosaku Kimura
富士通研究所もGitHubでOSS出してるんですよ! / GitHub Enterprise Roadshow Tokyo
kimusaku
0
970
Node.jsでのAWSサーバレスアプリプログラミングを 簡単にする技術の研究紹介 (An Introduction of a Technology for Simplifying Serverless Application Programming in AWS with Node.js)
kimusaku
0
2.4k
Other Decks in Programming
See All in Programming
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
410
さぁV100、メモリをお食べ・・・
nilpe
0
110
OCRを使ってゲームのアイテムをデータ化する
kishikawakatsumi
0
120
iOS26時代の新規アプリ開発
yuukiw00w
0
220
New "Type" system on PicoRuby
pocke
1
370
Inspired By RubyKaigi (EN)
atzzcokek
0
430
密結合なバックエンドから TypeScript のコードを生成する
kemuridama
1
390
LLM Plugin for Node-REDの利用方法と開発について
404background
0
140
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
300
JavaDoc 再入門
nagise
0
210
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
11
3k
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
670
Featured
See All Featured
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
150
The browser strikes back
jonoalderson
0
1.1k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
240
Agile that works and the tools we love
rasmusluckow
331
21k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
70
39k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
22k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
44k
Ethics towards AI in product and experience design
skipperchong
2
290
Mobile First: as difficult as doing things right
swwweet
225
10k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
340
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