Azure Sphereを3年間見て思うこと

2018年9月にPublic Previewと同時に開発キットを手に入れることができるようになり、誰でも試すことができる**Azure Sphere**。
発表当初から、ずーーーーーーーーーーーーーーーーーーーっと追っていますが、いまひとつ盛り上がっていない（利用されていない）と感じています。盛り上がっているのはわたしだけ？:unamused:
そんなちょっぴり悲しいもったいないAzure Sphereですが、いまの状況と思うところを書いておこうと思います。

# Azure Sphereとは？

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/848c7cae-b5a8-74e8-84fb-c39076f7a3a6.png">


[公式ドキュメント](https://azure.microsoft.com/ja-jp/services/azure-sphere/)では、

> 毎年数十億ものデバイスが新たに接続されているため、お客様側のセキュリティ保護はかつてないほど重要です。Azure Sphere セキュリティ サービスを使用して、データ、プライバシー、物理的な安全性、インフラストラクチャを保護することができます。これは、ハードウェア、ソフトウェア、クラウド サービスにおける Microsoft の何十年にも及ぶ経験を基に構築されており、IoT デバイスのためのターンキー セキュリティ ソリューションが提供されます。

とあります。ちょっと分かりにくいですね。:sweat_smile:

以前、英語の公式ドキュメントには、次のように書かれていました。

> A solution for creating highly secured, connected MCU-powered devices

ようするに、**Azure Sphereとは「ソリューション」です。**ここで「サービス」ではなく「ソリューション」と言っている点が大事です。
どんなソリューションかというと、**「高いセキュリティレベルのIoT機器」を「作るための」ソリューション**です。これは、Azure Sphereというソリューションに乗っかれば、細かいことは考えなくても！？セキュリティ対策したIoT機器を開発、運用できるということを表しています。

Azure Sphereソリューションは、次の3つのサービス・機器で高いセキュリティを維持します。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/1157b97b-df8e-ec21-f2f5-c9b394ad4f8d.png">


1. Certified chips (**Azure Sphere Certified Chips**)  
マイクロソフトのセキュリティテクノロジが組み込まれた専用のMCUチップを使います。
2. Operating system (**Azure Sphere OS**)  
アプリケーション保護やセキュリティ更新などが組み込まれた専用のOSを使います。
3. Cloud security (**Azure Sphere Security Service**)  
OSのセキュリティ更新やアプリケーション配布を提供します。

MCUチップ、OS、クラウドサービスの3つを協調して使うことで、高いセキュリティを実現しています。

> 技術的にもっと詳しく知りたい方は、[The Seven Properties of Highly Secure Devices](https://www.microsoft.com/en-us/research/wp-content/uploads/2017/03/SevenPropertiesofHighlySecureDevices.pdf)をご参照ください。

# Azure Sphere Certified Chips - MT3620

現在、入手可能なAzure Sphere Certified ChipsはMediaTekの[MT3620](https://www.mediatek.jp/products/mt3620)のみです。

ペリフェラルは**GPIO, PWM, UART, SPI, I2C, I2S, ADCを内蔵**しています。GPIO, UART, SPI, I2Cがあれば、大抵のことは事足りるでしょう。
インターネット接続は2.4GHz/5GHzに対応した**Wi-Fiを内蔵**しています。[オプション](https://www.seeedstudio.com/MT3620-Ethernet-Shield-v1-0-p-2917.html)の基板を追加することで有線Ethernetを使うこともできます。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/5abd7c39-8951-7165-de56-0deb751f5894.png">

# Azure Sphereアプリケーション開発

マイクロソフトからWindowsとLinuxの開発手順が提供されています。
Azure Sphere Certified Chips上で動かすアプリケーションは、**C言語**で開発します。C++ではないです。C言語です。他の言語で開発したものをリンクして動かすことはできますが、自己責任になります。アプリケーションはLinux Kernel上で動きます。そのため、OS周辺の操作はLinuxシステムコールを使います。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/5e5c61c7-6914-eab9-66b7-e268663fa173.png">

# ここがすごいぞ！ Azure Sphere！

Azure Sphereのセキュリティ機能ばかりが宣伝されていましたが、3年間使ってみて、ようやく素晴らしさが分かってきました。

### Linux Kernelの採用（★★★）

MCUにWi-Fi付けてTCP/IP通信するのはもはや珍しくもなんともないのですが、実際にWi-Fi付き（やWi-Fi外付け）のMCUやライブラリを使っていると様々なバグに遭遇します。証明書の扱いをミスっていたり、高負荷なLANだとハングしたり、、、マジで辛いし、よく出会います。会いたくないけど。
Azure Sphereは**Linux Kernelを採用**して、Linux向けドライバを使用しています。すでに多くのユーザーや開発者にもまれたコードなので、**かなりの安定感**。また、**デバッグの安定感**もすばらしいです。（Azure Sphere内部にGDB Serverを立てて、TCPで通信しています）

### 継続的なセキュリティ更新（★★★）

マイクロソフトが**ほぼ毎月、セキュリティ更新**をリリースしてくれます。
「OS再起動するなんてけしからん」とか「毎月動作確認するのかよコラ」などの否定的意見もありますが、セキュリティ情報をキャッチアップして開発、リリースすることを考えると、とても自力では運用維持できないと思います。

### アプリケーション配布（★★★）

Azure Sphere Security ServiceからMCUの**アプリケーションを更新**することができます。
この機能も「まぁOTAだよね。」とサラッと流れがちですが、、、Azure Sphere OSとAzure Sphere Security Serviceによって提供された機能なので、自身のアプリケーションに手を加えることなく、アプリケーション配布をすぐに利用することができます。

### 開発ツール（★★☆）

一般的に、組み込みアプリケーション開発は開発環境を整備するのが一苦労です。デバッギングまで出来るようにしようとすると、デバッグアダプタを入手して結線して、必要なツールをダウンロードして、場合によってはツールをソースからコンパイルしないといけないこともあります。（まぁまぁある）
Azure Sphereは、マイクロソフトが複数のツールをワンパックにしたSDKを提供しているので、**あちこち取ってきて組み合わせてセットアップするといった煩わしさがありません**。また、**デバッギング機能も使えるよう**になっているので、組み込み開発に不慣れな人でも取り掛かりやすいです。

### オールインワンチップ（★☆☆）

Microprocessor, Wi-Fi, Flash, RAM, Pluton(Security subsystem)全てがワンチップに入っています。
量産することを考えると、**使用する部品が少ない**のは助かります。

# ここが残念。あじゅーるすふぃあ。

一方で、もう少し改善すればもっと利用してもらえるんじゃないか？と思うところもあります。

### Wi-Fiセットアップ（★★★）

製品として出したときに、エンドユーザーにWi-Fiアクセスポイントをどうやってセットアップしてもらうかという課題があります。
よくあるWi-Fiデバイスでは、一時的にWi-Fiアクセスポイントになって、セットアップ用のWebページを表示しますが、現在のAzure Sphereではこのような振る舞いを実装できません。

### リクレーム（★★☆）

「クレーム」をリセットやAzure Sphere Tenant間移動できない。
客先納品したデバイスで不具合が起きたときに手元のAzure Sphere Tenantに移動して動作確認できない、といったケースがあります。

### モジュールへの書き込み（★☆☆）

試作と量産の間の、モジュール使用に対するケアが弱い気がします。
デバイスが数十台規模となったときに、開発キットでは大げさ&コスト高、チップでは開発コストが高くなってしまいます。そこで、一般的には「モジュール」と呼ばれる、小さいStamper基板にチップを載せた製品を使います。MT3620が載ったモジュールは数社から出ていて、技適OKのものもありますが、残念なことに、このモジュールへ書き込むための書き込み装置（プログラマ）が販売されていません。J-Linkのような汎用アダプタも使うことができないため、自作しなければいけないです。

### ペリフェラルが弱い（番外）

ちょー個人的見解。
他のMCUに比べて、一部ペリフェラルの機能が少なく、希望する機能を実装できないときがありました。たとえば、I2Sマスターとか。
また、ペリフェラルの操作方法がわかるデータシートが公開されていないため、Cortex-M4コアでガンガンにリアルタイム処理するぞーというのも現時点ではやりにくいです。

# まとめ

いま感じていることを書きましたが、だいぶまとまりのない文章になってしまいました。:sweat:
こうやって書いてみると、だいぶ粗削りでチャレンジングなソリューションだなぁと感じます。
賞賛・訂正・異論・反論・質問など、大歓迎です。コメント欄に気楽に書いてもらえると嬉しいです。

# 質問・要望

よく聞く、質問・要望と現在の状況です。

## Q1.何年後まで使えるの？

Azure SphereはAzure Sphere Security Serviceが終了すると動かなくなってしまいます。厳密には、ネットに通信できなくなります。今後何年間使うことができるか気になるところです。
[Azure Sphereの価格](https://azure.microsoft.com/ja-jp/pricing/details/azure-sphere/)ページによると、

* Azure Sphere OSのサポートとセキュリティ更新は、2031年7月まで。
* Azure Sphere Security Serviceは、ずっと。（ずっと？）

のようです。
さすがにAzure Sphere Security Serviceが未来永劫ずっと提供され続けるのは考えにくいので、、、**Azure Sphereソリューションは2031年7月まで**、約10年後までは確実に使えると解釈しておいたほうがいいでしょう。

なお、[MT3620](https://www.mediatek.jp/products/mt3620)がいつまで提供されるのかは、公開されている情報は見つかりませんでした。情報提供求む。

## Q2.お高いの？

### Azure Sphere Certified Chips(MT3620)

[**MT3620**](https://www.mediatek.jp/products/mt3620)**は～1002.4円**です（[Azure Sphereの価格](https://azure.microsoft.com/ja-jp/pricing/details/azure-sphere/)ページ）。「～」と表現されているのは、たくさん買うと安くなるんでしょうね。MT3620の販売は（マイクロソフトではなく）[アヴネット](https://www.avnet.com/wps/portal/japan?locale=ja-JP)です。秋葉原の店頭などでは売っていません。MT3620は1個だけ購入とかは出来ません。
すぐにお試ししたい人向けに、SeeedからMT3620が載った[**開発キット**](https://www.seeedstudio.com/Azure-Sphere-MT3620-Development-Kit-JP-Version-p-3135.html)が販売されています。こちらは国内電子部品販売店で購入することができます。**価格は1万円程度**。

### Azure Sphere OS

**Azure Sphere OSは**、マイクロソフトによって継続的にセキュリティ更新が提供されますが、**無料です**。
サポートに関しては、マイクロソフトのプレミアサポートサービスで行っているようです。こちらはそれ相応な額になります。

### Azure Sphere Security Service

**Azure Sphere Security Serviceは**、デバイス認証やOS配布、アプリケーション配布といったサービスが提供されますが、**無料です**。

### トータルコスト

コストを列挙すると、

* Azure Sphere Certified Chips(MT3620) ... **～1002.4円**（or 開発キット **1万円程度**）
* Azure Sphere OS ... **無料**
* Azure Sphere Security Service ... **無料**

と、MCUチップを購入すれば、10年間、追加費用が発生しないです。
OSセキュリティ更新、OS配布、アプリケーション配布には一切の費用がかかりません！（もちろん、他のAzureサービスを利用した場合は、都度、費用がかかります。）

## Q3.Azureサービスにしか接続できないのでは？

いいえ、マイクロソフト以外のクラウドサービスにも接続できます。
HTTP/HTTPS Webサービスであればlibcurlライブラリを使って接続することができます。それ以外のプロトコルは、wolfSSLライブラリを使うことができるので、（プロトコルをがんばって実装すれば）接続することができます。
ただし、Azureサービスを一切使わない運用はできません。セキュリティを担保するために、Azure Sphere Security Serviceと通信して認証しないとインターネットへ通信することが出来ない仕組みになっています。

## Q4.一度使ったデバイスを他人に譲渡できないよね？

はい、現在もリクレームはできません。
Azure Sphere Certified Chipsを最初に使用する前に、Azure Sphere Security Service（のAzure Sphere Tenant）と紐づけする「クレーム」という操作が必須ですが、このクレーム操作をリセットもしくは他人のAzure Sphere Tenantへ移すことができません。
もちろん、当初から多くのユーザーが「リセットもしくは移せるようにしてほしい。」とリクエストしていますが、技術的になのか、工数的になのか、現在も出来ないです。情報提供求む。

## Q5.Azure Active Directoryを立てるの面倒なんだけど。

現在はAzure Active Directoryの用意は不要になりました。
当初は、Azure Sphere TenantとAzure Active Directoryを紐づけが必要だったので、Azure Sphere Tenant毎にAzure Active Directoryを用意する必要がありました。
現在はこのあたりの仕組みが変更されて、個別にAzure Active Directoryを用意する必要はありません。（面倒だったので、地味にうれしい）

## Q6.アプリケーション開発はWindows限定ですよね？

いいえ、現在はWindowsとLinuxで開発可能です。（[MacOSXでも可能なのか？](https://github.com/MicrosoftDocs/azure-sphere-issues/issues/191)）
当初はAzure Sphere SDKがVisual Studio拡張で提供されていたことから、Windowsでしか開発できませんでした。
現在はCMakeでコンパイルする仕組みに変更されて、WindowsとLinuxで開発できるツールと手順が提供されています。

## Q7.Linuxなんだよね？PythonやShellは動く？

いいえ、動きません。
Linux Kernelを採用していますが、PythonやShellは提供されていません。
C言語で開発、コンパイルした実行ファイルのみ動かすことができます。

## Q8.OSやアプリの更新は無停止？

いいえ、OSが再起動します。
クラウドからOSやアプリの配布ができますが、更新時に次のような影響があります。

1. OSやアプリのイメージダウンロードで、アプリの動作が遅くなる
2. OSやアプリの入れ替えでOSが再起動する

残念ながら、これを無くすことはできません。
更新が発生する前提で、アプリケーションやデバイス全体を設計してください。
なお、不意に再起動してしまうのを防ぐために、[更新を遅延する方法](https://docs.microsoft.com/en-us/azure-sphere/app-development/device-update-deferral)があります。

## Q9.OSやアプリ配布をAzureポータルで操作できないか？

そのようなWebページは用意されていません。
マイクロソフトからは、[Azure Sphere CLI](https://docs.microsoft.com/en-us/azure-sphere/reference/azsphere-cli)によるコマンドライン操作と、REST APIの[Azure Sphere Public API](https://docs.microsoft.com/en-us/azure-sphere/reference/public-api-overview)、Visual Studio Code拡張の[Azure Sphere UI](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-sphere-tools-ui)が提供されています。
非公式でよければ、わたしが作ったWindowsアプリ「[Azure Sphere Explorer](https://github.com/matsujirushi/AzureSphereExplorer)」があります。（推し）

# 参考リンク

## スライド

[2018/8/24 Azure Sphereコミュニティ勉強会](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere)
[2018/10/1 Azure Sphere MCU](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere-mcu)
[2018/11/17 Azure Sphere MCU](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere-mcu-123272582)
[2019/4/6 Azure Sphereの今](https://www.slideshare.net/TakashiMatsuoka2/iot2019-azure-sphere-140030606)
[2020/2/6 Azure Sphereのマルチコア](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere-227128702)
[2020/4/25 Azure Sphereって実際どうなの？](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere-232628405)
[2020/7/2 Azure Sphere開発する前に知っておくこと](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere-236734151)
[2020/7/3 Azure Sphereリアルタイム処理](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere-236734184)
[2020/7/27 これからAzure Sphereで開発する方へ](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere-237286579)

## ビデオ

[2020/6/17-7/17 de:code 2020 X02 セキュリティは万全ですか？ Azure Sphere によるセキュリティ紹介](https://youtu.be/OPHMk3lZr6k)
[2020/7/27 【オンライン】Azure Sphere技術セミナー！最新のIoTセキュリティソリューションとは！](https://youtu.be/HFu1EaFeJk0)

## ハードウェア

### MT3620開発キット（RDB）

#### 本体

* [Azure Sphere MT3620 Development Kit_JP Version](https://www.seeedstudio.com/Azure-Sphere-MT3620-Development-Kit-JP-Version-p-3135.html)
* [Azure Sphere MT3620 Development Kit_US Version](https://www.seeedstudio.com/Azure-Sphere-MT3620-Development-Kit-US-Version-p-3052.html)
* [Azure Sphere MT3620 Development Kit_EU Version](https://www.seeedstudio.com/Azure-Sphere-MT3620-Development-Kit-EU-Version-p-3134.html)

#### オプション

* [MT3620 Grove Shield](https://www.seeedstudio.com/MT3620-Grove-Shield.html)
* [Grove Starter Kit for Azure Sphere MT3620 Development Kit](https://www.seeedstudio.com/Grove-Starter-Kit-for-Azure-Sphere-MT3620-Development-Kit.html)
* [MT3620 G Shield](https://matsujirushi.booth.pm/items/2706025)
* [MT3620 Ethernet Shield v1.0](https://www.seeedstudio.com/MT3620-Ethernet-Shield-v1-0-p-2917.html)

### MT3620開発キット（MDB）

#### 本体

* [MT3620 Mini Dev Board](https://www.seeedstudio.com/MT3620-Mini-Dev-Board-p-2919.html)

#### オプション

* [MT3620 Grove Breakout](https://www.seeedstudio.com/MT3620-Grove-Breakout-p-4043.html)
* [Azure Sphere Grove Starter Kit for MT3620 Mini Dev Board](https://www.seeedstudio.com/Azure-Sphere-Grove-Starter-Kit-for-MT3620-Mini-Dev-Board-p-4613.html)

#### モジュール単体

* [MT3620 Module(AI-Link WF-M620-RSC1)](https://www.seeedstudio.com/MT3620-Module-AI-Link-WF-M620-RSC1-p-2920.html)