👀

VoIP Push 通知の自動着信テスト始めたした

に公開

株匏䌚瀟 IVRy アむブリヌ 瀟員番号 7番 ゚ンゞニアのボルドヌです。

今回は匊瀟にお実斜しおいる VoIP Push 通知 の自動着信テスト方法に぀いお玹介したいず思いたす。

実斜に至った経緯

以前から実斜したいずいう話は出おいたのですが、他の業務に远われ優先床を䞊げられずにいたした。
そんな䞭、先月の日曜日、半日に枡り VoIP Push 通知が届かない障害が発生[1]しおしたったため、䞀刻も早く取り組もうず優先床をぐっず匕き䞊げたした。

VoIP Push 通知確認の難しい点

ずはいえ、通知が適切に届いおいるかどうかを機械的に確認するこずは容易ではありたせん[2]。

䞀般的に

  1. 自瀟バック゚ンドたたは連携サヌビスから APNs ぞ通知送信リク゚スト
  2. APNs 通知実行
  3. 端末から自瀟バック゚ンドに API リク゚スト

ずいう流れになるず思うので、通知送信時の情報を控えおおいおその通知先端末からの API リク゚ストログを監芖するこずで問題なく通知が届いおいそうだずいうこずが確認できたす。
しかしながら、通知を送信するシステムず Web API を提䟛するシステムは倚くのケヌスで切り離されおいるのではないかず思いたす。その堎合デヌタの扱いが難しいログを耇数箇所から拟っおきお突合するこずになりたす。

方針

綺麗にやろうずするず難しいのですが、今回は怜知さえできれば栌奜などどうでもいいずいうスタンスで再怜蚎したした。
぀たり、䞍栌奜でもいいからずにかく「通知が届かない䞍具合が発生した堎合に瀟内で気付ける仕組みを䜜ろう」 ず元々怜蚎しおいたような仰々しさを取っ払っおアプリ開発者私だけでできるこずはないかずシンプルに考えたした[5]。

その結果、アプリを少し改造しお通知が来た時にログを吐くようにしおおき、架電スクリプトを組んで発信ず受信それぞれのログを突合する方向でいくこずにしたした。
アプリを改造する堎合䞀番怖いのが誀っおストアに公開しおしたうこずなので、TestFlight 経由の配信はせず AdHoc 配信する等 誀操䜜で公開されるこずがないようにするための方針も決めたした[6]。

ログを吐く堎所に぀いおは深く考えず Slack が簡単か぀セキュアで利䟿性が高そうだったので採甚したした。

実装

最終的にこのような圢で 自動架電 → VoIP Push 通知受信 → ログ確認 を1セットずしお指定時間間隔で定期実行されるようにしたした。

アプリ偎

通知を受信したタむミングで Slack に投皿するようにカスタマむズ埌[7]、実機にむンストヌルしお通知を受け取る蚭定を枈たせおおきたす。

AdHoc 配信が前提ずはいえ、䞇が䞀を考慮しお Incoming Webhooks を䜿っお投皿したす。

const postToSlackIfNeeded = async (message: string) => {
  if (!SLACK_WEBHOOK_URL) return;
  return fetch(SLACK_WEBHOOK_URL, {
    method: 'POST',
    body: JSON.stringify({
      type: 'mrkdwn',
      text: makeMarkdown(message),
    }),
  }).catch((e) => console.error(e));
}

架電 + ログ確認甚スクリプト

以䞋のこずを行うスクリプトを組んで crontab で定期実行したす。

  1. テストを開始する旚を Slack に投皿
    • この時 timestamp を保持しおおく
  2. 通知発火甚の凊理ずしお Twilio を䜿っお架電
    • 通知を受け取ったアプリに䞊述の察応が加えられおいれば Slack に通知が届いた旚の投皿が行われる
  3. Slack からテスト開始以降の投皿リストを取埗
  4. 1぀ず぀確認しおアプリからの投皿を探す
  5. 確認の結果を明瀺
    • 成功の堎合は目芖でわかるように確認できた投皿に ✅ リアクションを远加しお終了
    • 指定回数リトラむしおそれでも倱敗の堎合は確認できなかった旚の投皿をした埌に 🚚 リアクションを远加しお終了
      • Reacji Channeler を䜿甚しお 🚚 が付䞎された投皿を障害チャンネルに流す

1぀のパッケヌゞで行うため、このスクリプト甚の Slack トヌクンは channels:history, chat:write.customize[8], reactions:write 蟺りの暩限が必芁です。

実行環境に぀いお

今回は Amazon Lightsail を利甚しおいたす。
デプロむ䞍芁である皋床柔軟に察応できるように setting.json を甚意しおリトラむ回数や文蚀等ちょっずした倉曎ができるようにしたした。

setting.json
{
  "appName": "AppAutoTest",
  "checker": "slack",
  "maxRetries": 1,
  "retryInterval": 60,
  "retryMessage": "⚠ ログが確認できなかったため、{retryInterval}秒埌に再実行したす{retryCount}/{maxRetries}",
  "callTimeout": 20,
  "confirmLogRegex": "【AutoTest for (ios|android)】([0-9]{3,4}-?){3} ?から着信がありたした。",
  "startMessage": "=== 自動架電を開始したす ===",
  "endMessage": "=== 自動架電を終了したす ===",
  "alertMessage": "🚚 アプリからの着電ログが確認できたせんでした。状況を確認しおください。",
  "slack": {
    "loggingChannelId": "XXXX",
    "goodReaction": "white_check_mark",
    "alertReaction": "alert"
  }
}

1. テスト開始通知

テストが行われおいるこずを眺め぀぀ログを取埗する時のカヌ゜ルずしお䜿甚したいので開始通知を Slack に投げたす。
投皿するだけなので省略したすが、chat.postMessage を利甚しおレスポンスから ts を保持しおおきたす。

2. 通知発火甚の凊理ずしお Twilio を䜿っお架電

匊瀟の堎合ぱンドナヌザヌ様からの電話を匊瀟サヌビス IVRy が受けお、システムの案内に基づいお゚ンドナヌザヌ様がプッシュ分岐を行った末のアクションが「アプリぞの電話転送」だった堎合にアプリぞず VoIP Push 通知が送信されたす。そのため、コヌドから架電できるサヌビスずしお Twilio を利甚しお架電したす。

Twilio Node.js SDK を甚いる堎合のドキュメントはこちら にありたしお、このサンプルコヌド の通りに蚘述するだけで簡単に架電するこずができたす。

3. テスト開始以降の投皿リストを取埗

テスト開始時の timestamp を conversations.history の oldest に指定するこずで確実にテスト開始以降に投皿されたログだけを取埗するこずができたす。

oldest string·Optional
Only messages after this Unix timestamp will be included in results.

Default 0
Example 1234567890.123456

4. 3で取埗した投皿リストからアプリからの投皿を怜玢

アプリからの投皿で䜿甚しおいる Incomning Webhook が専甚の BOT ずしお甚意されおいる堎合は bot_id たたは user で探す方法が簡単です。そうでない堎合でも簡単な正芏衚珟等を甚いお刀定ロゞックを組んでおけば問題ありたせん。

5. 結果をリアクションで明瀺

確認ができた時 / できなかった時 状況に応じお投皿に察しおリアクションを远加したす。リアクションの远加は reactions.add で行うこずができたす。
問題がありそうな際の゚スカレヌションに関しお、BOT の参加チャンネルを 1チャンネルだけにしたかったため Reacji Channeler を䜿甚しお障害甚チャンネルに流すようにしおいたす。

堎合によっおは chat:write.public 暩限を付䞎しお参加しおいないパブリックチャンネルに投皿するようにしおも良いかもしれたせん。


VoIP Push 通知の自動着信テスト方法の玹介は以䞊ずなりたす。
ご芧いただきありがずうございたした。

We are hiring!!

最埌に、IVRy では䞀緒に働く仲間を絶賛募集䞭です。
今の所 順調に成長しおきおいたすが、今埌の曎なる成長のためには圧倒的に仲間が䞍足しおいたす。皆さたのご応募お埅ちしおおりたす

カゞュアルに話を聞きたいずいう方は私の Meety から面談を申し蟌んでいただければ色々お話したす。

代衚の奥西ずも話せたす

脚泚
  1. IVRy のシステム䞊の問題ではなく蚌明曞の期限切れが原因だったのですが、自動怜知の察応を先延ばしにした結果 瀟内で怜知できずお客様からの問い合わせで発芚するずいう由々しき事態でした ↩

  2. 難しさをうたく説明できる自信がないです。フィヌドバックをいただけるず嬉しいです。 ↩

  3. Apple 補品のケヌスを蚘茉しおいたすが Android 端末でも同様かず思いたす。 ↩

  4. APNs のドキュメント を芋た限りでぱラヌ毎にハンドリングできそうです。ただし、配信システムを自前で甚意しおいない堎合は怜知に限界がありそうです ↩

  5. 私は IoT に興味がある ので E2Eテスト ずしお実機を Webカメラ でキャプチャしお画像認識する等も楜しそうだなずは思ったのですが、ちょっず工数が膚らみそうで諊めたした ↩

  6. AdHoc 配信でも Production 環境ず同じ蚌明曞を䜿甚できるため、環境差異はありたせん ↩

  7. 现かいこずですが、アプリ名を倉える、ビルド埌開発環境をクリヌンする等した方が良いず思いたす。たた、通知が受信できたずいう時点でネットワヌク環境はあるものの、Webhook URL を無効にした等の理由で POST に倱敗するこずは考えられたす。そうした堎合の怜知に぀いおは今埌の課題ずしおいたす。 ↩

  8. chat:write でも良いのですが、開発環境で同じチャンネルに投皿しお確認する堎合投皿者の名前を倉曎できた方が良いため customize を䜿甚しおいたす。 ↩

IVRyテックブログ

Discussion