Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Cloud Pub/SubのSubscriberとしてCloud Functionsを使ってみた
Search
at-ishikawa
June 15, 2018
Programming
850
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cloud Pub/SubのSubscriberとしてCloud Functionsを使ってみた
at-ishikawa
June 15, 2018
Other Decks in Programming
See All in Programming
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
contenteditable と日本語入力に向き合う
colorful12
0
200
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
160
R8 の設定見直しでアプリサイズ削減
andpad
0
220
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
270
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
3.7k
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
New Earth Scene 8
popppiees
4
2.7k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
Why Our Code Smells
bkeepers
PRO
340
58k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
A better future with KSS
kneath
240
18k
Become a Pro
speakerdeck
PRO
31
6.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
870
Fireside Chat
paigeccino
43
4.1k
Transcript
Cloud Pub/SubのSubscriberとして Cloud Functionsを使ってみた 2018/06/14 Mercari, Inc 石川敦啓 1
石川敦啓 (@at_ishikawa) • 株式会社メルカリ 東京本社勤務 • US Productチーム所属 • Backend
Engineer (PHP, Go) Who am I?
• サービスの概要 • Cloud Pub/Sub • Cloud Functions • Cloud
Functionsの独特だと思ったところ • 主にServerlessとしての点 3 今回の話
1. Cloud Functionsを利用した機能 2. Pub/Subについて 3. Cloud Functionsについて 4. Cloud
Functionsで気づいたこと a. アプリケーション b. インフラストラクチャ 5. 今後のCloud Functionsの利用 6. まとめ Agenda 4
• Facebook Ads更新機能 • シンプルな機能 5 Cloud Functionsを利用した機能
1. Cloud Functionsを利用した機能 2. Pub/Subについて 3. Cloud Functionsについて 4. Cloud
Functionsで気づいたこと a. アプリケーション b. インフラストラクチャ 5. 今後のCloud Functionsの利用 6. まとめ Agenda 6
• GCPのメッセージングサービス • Publisherはtopicにメッセージを送信 • Subscriberはtopicに対応したsubscriptionからメッセージを受信 7 Pub/Subについて
• メッセージ送信フロー • Subscriberがackを送信するとメッセージが再送されなくなる 8 Pub/Subについて
• Pub/Subの特性 a. Pub/SubはAt Least Onceなメッセージ配信 • つまり、Subscriberは同じメッセージを1回以上受信する • Subscriberは冪等であるべき
b. Publishされた順番にはメッセージはSubscribeされない • 順番を考慮する必要がないようにSubscriberを開発する 9 Pub/Subについて
1. Cloud Functionsを利用した機能 2. Pub/Subについて 3. Cloud Functionsについて 4. Cloud
Functionsで気づいたこと a. アプリケーション b. インフラストラクチャ 5. 今後のCloud Functionsの利用 6. まとめ Agenda 10
• Cloud Functions (Beta版) • Serverless ApplicationのためのFaaS • Runtime •
Node.js v6.14.0 • Cloud Functions for Firebase • Firebase側と連携して機能追加したいとき • Cloud Functionsとは多少違う • デプロイ方法 • エントリポイント • Emulator 11 Cloud Functionsについて
• Cloud Functionsのイベントトリガー a. Background functions i. Pub/Subのmessage ii. Google
Cloud Storage bucketの変更 b. Http function i. HTTPリクエスト 12 Cloud Functionsについて
• Background Functionsの例 • Pub/Sub用のfunction • helloWorldがfunction名(デプロイ時に変更可能) 13 Cloud Functionsについて
$ cat function.js exports.helloWorld = (event, callback) => { const pubsubMessage = event.data; const data = pubsubMessage.data ? Buffer.from(pubsubMessage.data, 'base64').toString() : 'No data'; console.log(`${data}`); callback(); };
• Background Functionsの例 • Pub/Subからデータevent.dataを受け取りログにdataを出力 • Pub/Subの読み込み, ackなど、Pub/Subの制御に関する処理 が不要 14
Cloud Functionsについて $ cat function.js exports.helloWorld = (event, callback) => { const pubsubMessage = event.data; const data = pubsubMessage.data ? Buffer.from(pubsubMessage.data, 'base64').toString() : 'No data'; console.log(`${data}`); callback(); };
• Background Functionsの例 • functionの完了処理 i. エントリポイントの引数callbackをcall ii. Promiseをreturn 15
Cloud Functionsについて $ cat function.js exports.helloWorld = (event, callback) => { const pubsubMessage = event.data; const data = pubsubMessage.data ? Buffer.from(pubsubMessage.data, 'base64').toString() : 'No data'; console.log(`${data}`); callback(); };
• Background Functions • Pub/Subの制約を考慮するべき • メッセージの順番、冪等性 • Pub/SubのメッセージにはIDのみある •
Subscriber側で常に最新のデータをIDから取得して、上書きする 16 Cloud Functionsについて
• Facebook Ads更新機能 17 再)Cloud Functionsを利用した機能
1. Cloud Functionsを利用した機能 2. Pub/Subについて 3. Cloud Functionsについて 4. Cloud
Functionsで気づいたこと a. アプリケーション b. インフラストラクチャ 5. 今後のCloud Functionsの利用 6. まとめ Agenda 18
• アプリケーション a. Background functionのRetry b. 環境変数 • インフラストラクチャ a.
ログの仕様 b. デプロイ 19 Cloud Functionsで気づいたこと
• Background functionのRetry • Background functionの場合、retryというオプションがある • 有効化すると、エラーになった場合、functionを再実行 • callbackの第1引数がnot
null • Promiseがrejectされる • エラーが出続けている場合、数日間リトライを繰り返す 20 アプリケーション
• Background functionのRetry • Retryできるケースとできないケースを考える • 一時的なエラーの場合は復旧できる可能性があるのでリトラ イさせる • rejectしたPromiseを返す
• 復旧不能なエラーの場合、リトライさせない • rejectしていないPromiseを返す • エラーをログに出力 • 数日間リトライを繰り返させない • 一定期間リトライしたら処理しない 21 アプリケーション
• Background functionのRetry • Retryできるケースとできないケースを考える 22 アプリケーション Retry可能なエラー Retry不要なエラー •
DBレプリケーション遅延に よるデータ取得エラー • 外部APIのリミット制限 • Pub/Subメッセージの Validationエラー • id重複登録エラー
• 環境変数 • Credential情報はGitHubのリポジトリに管理しない i. Firebase config • Cloud Functions
for Firebaseの場合、利用できる ii. GCSなど外部から動的取得 iii. デプロイ時にproduction用の環境変数用ファイル作成 • 今回はこっちを利用した • Credential以外はdotenvやnode-env-runなどで良い i. 今回は試せていない 23 アプリケーション
• 環境変数 i. Firebase config • Cloud Functions for Firebaseの場合、利用できる
• Configをプロジェクト内のすべてのfunctionで共有している • テスト時には何も取得できない • 変数名はLowercaseのみ 24 アプリケーション $ firebase --project mercari-us-double-dev functions:config:get { "echo_function": { "api": { "access_token": "echo token" }, "event_name": "echo event" } }
• アプリケーション a. Background functionのRetry b. 環境変数 • インフラストラクチャ a.
ロギング・モニタリング b. デプロイ 25 Cloud Functionsで気づいたこと
• ロギング・モニタリング • Stackdriverと連携している • console.log, console.errorでStackdriverにログ出力 • textPayloadにstringでエラーの情報がすべて出力されてしま う
26 インフラストラクチャ
• ロギング・モニタリング • エラーの場合、Stackdriver Error Reportingに出力 27 インフラストラクチャ
• ログの仕様 • Stack Driverとの連携 • alertの設定もできる • ログ •
function実行数 • OK (Health check) • Error (Error alert) • メトリクスも見れる • 実行時間 • メモリ使用量 • ネットワーク量 28 インフラストラクチャ
• デプロイ方法 a. Google Cloud Source Repositoriesを利用する方法 • GitHubのリポジトリのミラーとして利用できる •
デプロイするブランチ名やタグ名を指定できる • 更新で自動deployされる • プライベートパッケージに依存している場合は.npmrcファイル も管理 b. gcloudコマンドからデプロイする • 今回はCI上でこれを実行 • .npmrcの動的生成 • credential情報の動的生成 29 インフラストラクチャ
• デプロイ方法 • プライベートパッケージの利用 • .npmrcファイルがルートディレクトリに必要 • プライベートレジストリへのアクセス • jfrog
30 インフラストラクチャ @mercari:registry=https://mercari.jfrog.io/path/to //mercari.jfrog.io/path/to/:_password=<Base64 encoded password> //mercari.jfrog.io/path/to/:username=at-ishikawa //mercari.jfrog.io/path/to/:
[email protected]
//mercari.jfrog.io/path/to/:always-auth=true
その他 1. ローカル開発環境 • Emulatorがある 2. 外部APIのスキーマが分かりづらい • FlowかTypeScript入れるべきだった •
Sourcemapがどうなるかは要調査 3. イベントをトリガーしたあとの処理のみ書く • HttpフレームワークのMiddlewareのような処理を追加しづらい 4. テストが書きやすい • 普通の関数にテストデータを生成して実行するだけ 5. マルチプロジェクト対応 • 別GCPプロジェクトに存在する Pub/SubのTopicをTriggerにはできない 6. serviceaccountsはGCPのデフォルトが使われている • GCPサービスの連携が容易。認証情報を考える必要がアプリケーションないでは必要ない 7. Cloud Functions for Firebase • デプロイ方法がgcloudからfirebaseに。firebaseはOAuthしてトークン生成が必要 • エントリポイントの書き方が変わる。 topic名がコードに入ってしまうので、環境ごとに変えるためにはコードを書かないといけない • Firebaseコマンドでemulatorを使用する 8. Serverless frameworkを使わなかった理由は? • パッと見て使いたいmotivationにはならなかった。でも将来的に良い機能があると判断したら導入するかも 31 Cloud Functionsで気づいたこと
• 開発環境での複数function • 目的は開発環境でのQAの容易化 • GitHubのPRと連携 • Pub/Subを可変にする • monorepoで管理
• デプロイ容易化 • functionをすぐに開発できるように 32 今後のCloud Functionsの利用
• Cloud Functionsを使ってみて • 簡単にPub/Sub Subscriberが作れる • Retryの仕組みは便利だが、エラーを意識する • インフラの仕組みも基本的に整っている
• モニタリングの仕組みはStack Driverと連携できる • デプロイは多少考えないといけない場合がある 33 まとめ