スマホ向けアプリの死活監視・アラートメッセージ送信

皆さん、こんにちは！　好きな動物は牛と馬、Skyfoxです！
今回は、AWS環境を構築したことがある方（中級者）向けに書いています。
同じような悩みを持っている方のヒントになれたら嬉しいです！

:::note warn
**注意**
本記事は、構想段階の内容を記載しています。
今後、以下の内容を実装次第、新たな記事を投稿します。
:::

# この記事について
**対象者**
- スマホ向けアプリがクラッシュした際に、検知する方法がなく困っている方
- AWSを使用したアプリの死活監視方法を知りたい方
- 小規模以上のAWS環境を構築したことがある方

**本記事のゴール**
- スマホ向けアプリのクラッシュ時に管理者へメッセージを送信する機能の構成がわかる

# 背景
かつて、私はビジネス向けアプリの保守・運用をしていました。
後日そのアプリを通して、アプリがクラッシュした場合、管理者が気付けず困る事象が起きるのではないかと思いました。
これを解決する方法はないかと考え始めたことが、今回この記事につながっています。

# 機能の目的・ゴール
改めて、今回作成する機能の目的・ゴールは、以下の通りです。

<font color="OrangeRed">
管理者が、アプリがクラッシュしたことに気付けるようにするため、<br>
スマホ向けアプリがクラッシュした際に管理者へメッセージを送信する機能
</font>

# 色々な案を考えてみた
今回、以下3種類の案を考えました。
<br>
**■アプリの死活監視案**
案1. CloudWatch Logs ・ Cloud Watch Alarmを使用した方法
案2. IoT Core ・ CloudWatch Alarmを使用した方法
案3. IoT Core ・ IoT Eventsを使用した方法
<br>
それでは、それぞれ詳細を説明します。
※今回API Gatewayなども必要になりますが、機能のメインとなるサービスのみ構成図に書いています。
　（構成図は、手書きで失礼します。）

### 案1. CloudWatch Logs ・ CloudWatch Alarmを使用した方法
![死活監視_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752776/6ac5c915-dc2b-cca5-53ca-366378eb95ea.jpeg)

案1は、まずアプリからCloudWatch Logsに一定頻度でログを送信し続けます。
そして、前のログから一定時間が経過しても、次のログ送信がない場合、CloudWatch AlarmがSNSを呼び出し、メールを管理者に送信する流れです。

### 案2. IoT Core ・ Cloud Watch Alarmを使用した方法
![死活監視_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752776/2f513cef-2545-be69-4f45-e4962481fa3a.jpeg)

案2は、MQTTプロトコルを使用し、アプリからIoT Coreへ一定頻度でログを送信し続けます。
そして、案1と同様一定時間が経過しても、次のログ送信がない場合、CloudWatch AlarmがSNSを呼び出し、メールを管理者に送信する流れです。
加えて、初回はIoT Coreへデバイスを登録し、証明書・ポリシーを作成する必要があるため、Lambdaで登録作業をします。

### 案3. IoT Core ・ IoT Eventsを使用した方法
![死活監視_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752776/55c754a4-8c21-43f6-e696-de00f1a2945a.jpeg)

案3は、案2と同様に、初回はIoT Coreへデバイスを登録し、監視時はMQTTプロトコルを使用し、アプリからIoT Coreへ一定頻度でログを送信し続けます。
そして、一定時間が経過しても、次のログ送信がない場合、IoT EventsがSNSを呼び出し、メールを管理者に送信する流れです。

# 最終的に選んだ案
以上より、今回私が最も良い方法として、選んだ案は...
<INS>**案３**</INS>です！

選んだ基準は以下の通りです。
- スマホ向けアプリが監視対象となり、クラッシュしたデバイスを識別するために、デバイスとクラウド間で通信する必要がある
    <font color="OrangeRed">**→**</font> <INS>**IoT Core**</INS> を使用
- 個々のデバイスを識別し、ログの送信間隔をトリガーに、他AWSサービスを呼び出す必要がある
    <font color="OrangeRed">**→**</font> <INS>**IoT Events**</INS> を使用

### 構成
改めて、手書きからその他必要サービスを加えて清書した構成は、以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752776/774a5955-0725-a198-cca8-9b14ad2085f8.png)

### 実現のためにweb検索した結果
IoT Core ・ IoT Eventsを使用したスマホ向けの死活監視を実現するために、web検索をしていたのですが、なんと意外にも検索結果にこの仕組みの記事は出てきませんでした。
同じような悩みを抱えている方がもっといるのではと思い、それなら、この機能を私自身で開発し、その知見を記事にし、発信しようと思い立ちました。
この記事は、構想段階のものを先出ししていますが、次の記事で開発方法やその結果を投稿します。

# さいごに
以下の2点がポイントでスマホ向けアプリの死活監視とアラートメッセージを実現することができます。
- スマホ向けアプリとクラウド間の通信を実現し、個々のデバイスを識別するために、 <INS>**IoT Core**</INS> を使用
- 前回のログ送信よりある一定時間内に次のログ送信がない、というイベントをトリガーに、メッセージを管理者に送信するために、<INS>**IoT Events**</INS> を使用

以上の構成で、スマホ向けアプリがクラッシュした際に、管理者へメッセージを送信する機能が実現できるイメージはつきましたでしょうか？

今回、同様の悩みで困っている方がいましたら、次の記事で開発方法について投稿するので、参考にしていただけると嬉しいです。

---

# （ おまけ ） 個々のリソースについて
### IoT Core
一言で言うと...
**AWS環境外のデバイスとクラウドを接続するためのサービス**です。

アプリとクラウドを接続する場合は、API Gatewayを通してLambda関数で何かのアクションを制御しますが、
IoT Coreは名前の通りIoTサービスのため、IoTデバイスとクラウド間で通信する場合はこのサービスひとつで、次のアクション開始の制御をします。

公式の説明では、以下のように書かれています。
>AWS IoT Core を利用することで、インフラストラクチャを管理することなく、何十億もの IoT デバイスを接続し、何兆ものメッセージを AWS サービスにルーティングできます。
※引用先「[AWS IoT Core | AWS](https://aws.amazon.com/jp/iot-core/)」

### IoT Events
一言で言うと...
**デバイスの変化をモニタリングし、イベントが発生した時にアクションをトリガーするサービス**です。

こちらもIoT Coreと同様、IoTデバイスとクラウド間で通信し、設定したイベントをトリガーに他AWSサービスを呼び出します。

公式の説明では、以下のように書かれています。
>AWS IoT Events は、機器またはデバイスフリートの障害や動作の変更をモニタリングし、必要なアクションを開始します。
※引用先「[AWS IoT Events | AWS](https://aws.amazon.com/jp/iot-events/)」

### Lambda
一言で言うと...
**クラウド上に定義したプログラムで、インターネットを通じて実行できるサーバーレスなサービス**です。

公式の説明では、以下のように書かれています。
>AWS Lambda は、サーバーレスでイベント駆動型のコンピューティングサービスであり、サーバーのプロビジョニングや管理をすることなく、事実上あらゆるタイプのアプリケーションやバックエンドサービスのコードを実行することができます。
※引用先「[AWS Lambda | AWS](https://aws.amazon.com/jp/lambda/)」

### SNS
一言で言うと...
**メール送信やPush通知ができるメッセージ配信サービス**です。

>Amazon Simple Notification Service (Amazon SNS) は、配信者から受信者 (または生産者から消費者) へのメッセージ配信を提供するマネージドサービスです。発行者は、論理アクセスポイントおよび通信チャネルであるトピックにメッセージを送信することで、受信者と非同期的に通信します。クライアントは、Amazon Data Firehose、Amazon SQS、AWS Lambda、HTTP、E メール、モバイルプッシュ通知、モバイルテキストメッセージ (SMS) など、サポートされているエンドポイントタイプを使用して SNS トピックをサブスクライブし、発行されたメッセージを受信できます。
※引用先「[Amazon SNS | AWS](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html)」