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
サーバーレス環境でスピーディーに構築するLINE Platform アプリ
Search
sumihiro3
November 14, 2020
Programming
0
640
サーバーレス環境で スピーディーに構築するLINE Platform アプリ
LPF REVUP 2020 大阪トラック登壇資料
https://revup.jp/
sumihiro3
November 14, 2020
Tweet
Share
More Decks by sumihiro3
See All by sumihiro3
LIFF Mock 使ってますか?
sumihiro3
1
440
20240120_SeikaEXPHack2024_テクニカルインプット.pdf
sumihiro3
0
56
LINE API を使って自治会を活性化する地域ポイントPFを開発した話
sumihiro3
0
190
TechSeeker Hackathon LINE API テクニカルインプット
sumihiro3
0
120
TechSeeker Hackathon 本番で使えるLINEのAPI紹介&過去作の紹介
sumihiro3
0
140
安否確認を LINE Bot で
sumihiro3
0
340
飲食業イベント向けLIFFアプリを開発した話
sumihiro3
0
1.1k
LINE ミニアプリ開発の現場から
sumihiro3
2
690
LINE API 総復習シリーズ LINE ミニアプリ 編
sumihiro3
1
270
Other Decks in Programming
See All in Programming
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
暇に任せてProxmoxコンソール 作ってみました
karugamo
1
720
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
330
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
120
モバイルアプリにおける自動テストの導入戦略
ostk0069
0
110
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
5
900
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.6k
快速入門可觀測性
blueswen
0
340
バグを見つけた?それAppleに直してもらおう!
uetyo
0
180
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
Featured
See All Featured
Six Lessons from altMBA
skipperchong
27
3.5k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Fireside Chat
paigeccino
34
3.1k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Scaling GitHub
holman
458
140k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Typedesign – Prime Four
hannesfritz
40
2.4k
Automating Front-end Workflow
addyosmani
1366
200k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Navigating Team Friction
lara
183
15k
Transcript
αʔόʔϨεڥͰ εϐʔσΟʔʹߏங͢Δ -*/&1MBUGPSNΞϓϦ LPF REVUP 2020 େࡕτϥοΫ 2020.11.14 Sumihiro Kagawa
⾃⼰紹介
加川 澄廣(かがわ すみひろ) n Keywords l LINE API Expert l
python , TypeScript, Nuxt.js, AWS, GCP l “LINE Pay API SDK for python“ Contributor sumihiro3 sumihiro.kagawa 3
本⽇のテーマ
LINE Platform Application Serverless Architecture 5
サーバーレスとは︖
サーバーが無い︖ ではなく 7
サーバーの存在を 意識しない 8
サーバーレス nサーバーの存在を意識しない サーバー管理 スケーリング調整 ⾼可⽤性確保 リソース・コスト調整 9
サーバーレス nサーバーの存在を意識しない サーバー管理 スケーリング調整 ⾼可⽤性確保 リソース・コスト調整 サービス開発に注⼒できる 10
サーバーレス nいいこと尽くめでもない ⾃由度が低い 監視対象数は増加しがち 開発前に決めておくことは多い 開発費⽤は⾼くなるかも 11
サーバーレス n導⼊が向いているケース スタートアップ 新規事業 機能要件の更新頻度が⾼い事業 規模等の⾒積もりが難しい事業 12
サーバーレス・アーキテクチャの詳細 は、専⾨記事などをご参照ください https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/ 13
LINE Platform アプリと サーバーレス との親和性
LINE pf アプリ と サーバーレス との親和性 nLINE の特徴 Ø ユーザーが⽇常使うサービス
Ø ユーザーとの距離が近すぎる(良い意味で) Ø ミニアプリ普及でもっと⽣活に密接なる 15
LINE pf アプリ と サーバーレス との親和性 nそのため、LINE 上で動くサービスは更新頻度が⾼い Ø ユーザーを飽きさせない
Ø 状況に応じて新しいことをどんどん取り込む - 利⽤状況の変化 - ニューノーマルなど世情の変化 Ø 実験的なサービスをやりやすい など 16
LINE pf アプリ と サーバーレス との親和性 nLINE Platform 上で動かすアプリでの特徴 認証は
LINE 側で実施 ステートレスを求められがち ⾮同期処理がしやすい API 構成 UI は LINE アプリに依存しがち 17
LINE pf アプリ と サーバーレス との親和性 nLINE Platform 上で動かすアプリでの特徴 認証は
LINE 側で実施 ステートレスを求められがち ⾮同期処理がしやすい API 構成 αʔόʔϨεͱͷ ੑ͕ߴ͍ UI は LINE アプリに依存しがち 18
LINE Platform アプリ での サーバーレスアーキテクチャ の使い所
Webhook イベントの 受け付けとリプライ (Messaging API / LINE Bot) 20
LINE Bot (Messaging API) nWebhook イベントの受け付けとリプライ Message, Follow, Post back,
Beacon etc. Webhook event Reply API 21
Webhook イベントの受け付けとリプライ nWebhook イベントの受け付けとリプライ処理の流れ Webhook event リクエストの レスポンスでなくてOK︕ Webhook event
Reply API 22
Webhook イベントの受け付けとリプライ nWebhook イベントの受け付けとリプライ処理の流れ Webhook event リクエストの レスポンスでなくてOK︕ Webhook event
Reply API ඇಉظͰ0,ʂ 23
Webhook イベントの受け付けとリプライ nWebhook イベントのリクエスト受け付けと、リ プライは同⼀リクエスト内ではなくてよい Webhook event Response レスポンス =
リプライ ではない 24
Webhook イベントの受け付けとリプライ n Webhook イベント受け付けと、リプライは分けて実⾏ l Webhook リクエストへのレスポンスは即返す l イベント処理はQueue
を挟んで⾮同期での処理後に返す Webhook event Response Reply API Webhook処理 ビジネスロジック Reply API 実行 25
Webhook処理 ビジネスロジック Reply API 実行 Webhook イベントの受け付けとリプライ n Webhook イベント受け付けと、リプライは分けて実⾏
l Webhook リクエストへのレスポンスは即返す l イベント処理はQueue を挟んで⾮同期での処理後に返す Webhook event Response Reply API Webhook event の 振り分けのみ実施 実際のロジックは ⾮同期の後続で実施 Reply には時間的な 余裕あり(数⼗秒程度) 26
Webhook処理 ビジネスロジック Reply API 実行 Webhook イベントの受け付けとリプライ n 受け付けと処理・リプライを分ける⽬的 l
ユーザーへのレスポンスを優先 l 責任分界点の明確化 Ø ビジネスロジックはLINE API への依存を薄くして他 Platform へも展開可とする Ø 単体テストをしやすく Webhook event Response Reply API LINE の「Webhookイベント オブジェクト」への依存は ここで留める ビジネスロジックは LINE API への依存を 薄くする 頻繁に利⽤する API 実⾏処理は分離・共通化 27
Messaging API 実⾏エラー時の リトライ処理 28
Messaging API 実⾏エラー時のリトライ処理 nAPI 再実⾏時に “リトライキー” を設定していないと https://developers.line.biz/ja/docs/messaging-api/retrying-api-request/ スクリーンショット 2020-11-10
13.44.02 "1* ϦΫΤετ͕ ೋॏͰ࣮ߦ͞ΕΔ߹ 29
Messaging API 実⾏エラー時のリトライ処理 nAPI 実⾏エラーに備え “リトライキー” の設定が推奨 https://developers.line.biz/ja/docs/messaging-api/retrying-api-request/ スクリーンショット 2020-11-10
13.44.02 -*/&QGଆͰೋॏ࣮ߦΛ ੍ޚͯ͘͠ΕΔ 30
Messaging API 実⾏エラー時のリトライ処理 nとはいえ、リトライ判別処理を各所に実装︖ スクリーンショット 2020-11-10 13.44.02 https://developers.line.biz/ja/docs/messaging-api/retrying-api-request/ 31
Messaging API 実⾏エラー時のリトライ処理 n ビジネスロジックからAPI 実⾏処理を分離 l 責任分界点の明確化 Ø ビジネスロジックに
LINE API 独⾃の仕様を 混⼊しない "1* ࣮ߦ 3FUSZLFZ 3FUSZLFZ 3FUSZLFZ 3FUSZLFZ ビジネスロジックから API 実⾏処理を分離する ビジネスロジック LINE API 実行 32
Messaging API 実⾏エラー時のリトライ処理 n ビジネスロジックからAPI 実⾏処理を分離 l API 実⾏側でもインフラに任せられる部分(リトライ)は任せる Ø
インフラ側で担保されているのであれば、 むやみに⾃前で実装しない "1* ࣮ߦ API 実⾏エラーが発⽣しても Queue のリトライ機能で安全に 再実⾏できる Push API などの実⾏処理を共通化し、 リクエスト拒否(Conflict) 時は 再実⾏しないようにしておく 3FUSZLFZ 3FUSZLFZ 3FUSZLFZ 3FUSZLFZ ビジネスロジック LINE API 実行 33
ユーザー⾏動履歴の記録・分析 34
ユーザー⾏動履歴の記録・分析 n ユーザーへの即応を優先 l ⾏動履歴の記録や分析など、即応が求められないものは極⼒⾮同期で処理する Ø その他 - エラー通知、課⾦に必要なサービス利⽤履歴の記録など ユーザーへのレスポンスは
最優先で返す 形式が求められない場合は 既存の可視化ツールを活⽤ (kintone, QuickSight など) データ分析⽤の処理はDB トリガーや 定期実⾏などで後から処理する 35
LIFF アプリ on SPA 36
LIFF アプリ on SPA nLINE アプリ(Native app)上のアプリだからこそ ページ切り替えを素早く⾏う l ユーザーからすれば
Native app/Web app の違いなど気に しない Ø 逆に⾔うと Native app 相当のものが求められる 現状、SPA (Single Page App) を選択 37
LIFF アプリ on SPA nSPA + クラウドストレージ + CDN l
LIFF アプリやミニアプリには、従来のWeb アプリと⽐べ、 画⾯切り替え時間が短い SPA を選択 SPA 部分のアプリリソースをS3 に 配置し、CloudFront でCDN 配信する BFF (Backend For Frontend) となる API は API Gateway + Lambda で展開する 38
SSG x LIFF で 静的サイトを LIFF アプリ化 39
SSG x LIFF で静的サイトを LIFF アプリ化 nLIFF を静的サイトに組み込んでユーザー⾏動を分析 l オウンドメディアやブログを
LIFF アプリ化 Ø サイト上で実⾏される LIFF SDK (JS) でLINE ログインす ることでユーザー識別も可能 - LINE アプリ上で表⽰すれば、ログイン操作不要でユーザー識別可 - LIFF SDK は LINE アプリ内ブラウザ以外にも対応しているため、既存サイ トにも簡単に適⽤できる 40
SSG x LIFF で静的サイトを LIFF アプリ化 n Headless CMS +
SSG(Static Site Generator) + LIFF SDK l CMS でのコンテンツ更新時に、コンテンツを静的サイトとして⽣成 Ø アクセスの度にDB 等へアクセスしないので⾼速 - いわゆる JAMStack 構成 メディア担当者などが CMS で 記事を更新時にビルド(SSG)実⾏ SPA と同様にサイトリソースをS3 に 配置し、CloudFront でCDN 配信する LIFF SDK で LINE ログインや、 ShareTargetPicker などを利⽤できる 41
開発事例
LPF REVUP 2020 Landing Page n静的サイト + LIFF を JAMStack
構成で構築 l LIFF + Headless CMS + SSG の例 Ø 登壇情報の配信 + 予約状況の表⽰ - セッション情報などのコンテンツは microCMS へ事務局担当者が投稿 • 投稿をトリガーにして、SSG がメディアサイトをビルド - CDN であるNetlify へ配信 - 予約状況は connpass API を実⾏してセッションページなどに表⽰ - ShareTargetPicker などの LIFF 機能を利⽤ 43
44
頻繁に利⽤する API 実⾏処理は分離・共通化 予約状況のみ外部API で 都度取得 45
46
LPF REVUP 2020 Landing Page n システム構成 l Headless CMS
Ø microCMS l SSG Ø Nuxt.js (Full static generation) l CDN Ø Netlify Hosting l BFF Ø Netlify functions l CD Ø Netlify 47
LPF REVUP 2020 LP (https://revup.jp) Netlify Functions REVUP 事務局 microCMS
Netlify NuxtJS Vue.js LIFF 開発者 GitHub connpass Speaker Deck 更新通知 コンテンツ取得 ビルド&デプロイ git push 更新通知 ソースコード取得 システム構成図 セッション、スピーカー などのイベント情報編集 参加者 サイト閲覧・申込み 48
C向けオンライン予約システム nBot + LIFF でサービス提供 l 予約フォーム Ø 予約データを⼊⼒すると BFF
経由で記録、予約担当者へ通知 l 診断フォーム Ø LIFF アプリ上でいくつかの質問に回答してデータ収集、BFF 経由でユーザー情報としてデータ登録 - データ記録と並⾏して、分析データをS3 へ保管し データ分析(Firehose + Athena + Lambda + QuickSight)へ 49
C向けオンライン予約システム n システム構成 l フロント Ø SPA (Nuxt.js) + S3
+ CloudFront l BFF Ø API Gateway + Lambda + DynamoDB + SQS + SNS (Email + kintone) l データ分析 Ø Firehose + Athena + Lambda + QuickSight l CD Ø GitHubActions + Zappa 50
システム構成図 ユーザー SPA (LIFF) 管理者 予約・診断 予約・診断 予約・診断 予約・診断 予約通知
診断データ分析 診断データ確認 ユーザー 予約・診断 データ確認 予約・診断 51 BFF データ分析
LINE Pay Drink Bar nLIFF + LINE Pay API で構築
l 書籍「 LINE API 実践ガイド」に掲載した実装例 Ø ドリンクの注⽂・決済・くじ引き - LIFF アプリ • 商品⼀覧での選択 • ドリンク抽出画⾯でのプログレス表⽰ • くじびき抽選など - サーバーサイド • LINE Pay API、obniz Cloud と連携 52
Ұཡ ܾࡁ࣮ߦ ܾࡁྃ υϦϯΫநग़ நબ։࢝ நબྃ 画⾯遷移 53
LINE Pay Drink Bar n システム構成 l フロント Ø SSR(Nuxt.js)
+ Google App Engine l サーバーサイド Ø Nuxt.js + Firestore l CD Ø GitHubActions + firebase CLI l ハードウェア Ø obniz + エアーポンプ + シリコンチューブ 54
55
56
LINE Pay Drink Bar (ソフトウェア) LINE Pay Drink Bar (ハードウェア)
obniz Board ユーザー LINE LINE Front-end Framework (LIFF) エアーポンプ Google App Engine Cloud Firestore NuxtJS Vue.js 決済実⾏ 注⽂・決済 ドリンク注⽂・決済 システム構成図 ドリンク抽出 57
まとめ
まとめ nまずやってみる場合サーバーレスを最初の選択肢に l 必ず適する訳ではないが、⽴上げ期には良い選択肢 nLINE Platform アプリとの親和性は⾼い l API 実⾏箇所だけ使うのでも良いかも
n組み合わせは要件次第でいくつものパターン有り 59
宣伝
書籍「LINE API実践ガイド」発売中︕ nLINE API はコレを⾒れば分かる l Expert 達が思い思いに綴った480P Ø なんと
8.3円/ページとお買得︕ Ø 最終章(7.2)のHW 連携を担当 l 本イベントで Twitter キャンペーン 実施中︕ https://book.mynavi.jp/ec/products/detail/id=117310 (税込: 3,993円) 61
SNS アカウントなど @sumihiro3 Sumihiro.Kagawa LINE API Expert 62
ご清聴 ありがとうございました︕
E.O.C.