「Azure Space」が現時点で何ができるのか気になったので触ってみた

# はじめに
「Azure Space」は2020年10月にMicrosoftから発表された宇宙関連事業です。かの有名なイーロン・マスクさんが設立した「SpaceX」ともパートナーシップを結んでおり、SpaceXが提供する衛星インターネットサービス「Starlink」とMicrosoftのサービスを繋ぐ、みたいなこともできるようです。いよいよ宇宙が身近なものになってきた感じですが、現時点で何ができるのか気になったので、Azureポータルからできることを試してみました。

# Azure Orbitalの概要
とりあえずAureポータルで”Azure Space”と入力してみましたが、何もヒットしませんでした。（というネタです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/e6d7ca10-a300-ce81-bae6-70587b9bd644.png)

現在Azure Spaceとして提供しているのが「Azure Orbital」というサービスです。”Orbital”というのは「軌道」という意味みたいです。うーん、宇宙っぽくてかっこいい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/4b26bbed-c10b-3ead-123d-0f8cffd4b7ea.png)
(https://azure.microsoft.com/ja-jp/blog/introducing-azure-orbital-process-satellite-data-at-cloudscale/)

「Azure Orbital」は、厳密に言えば”衛星からAzureへの低遅延の接続を提供するサービスの総称”で、いわばブランド名のようなものです。その配下に「Azure Orbital Ground Station」や「Azure Orbital Cloud Access」といった個別サービスがあります。「Azure Orbital」の各種サービスを用いて、衛星のデータを地上局を経由してAzureネットワーク内に転送し、そのデータを様々なAzureサービス（Azure Synapse AnalyticsやAzureML等）に取り込むことで、新たな発見やビジネスの創出に繋げていくという訳です。

## Azure Orbital Ground Station
さて、具体的なサービスを見ていきましょう。まずは「Azure Orbital Ground Station」です。こちらがまさに衛星のデータをAzureに取り込むサービスになります。

https://azure.microsoft.com/ja-jp/products/orbital/

このサービスは東日本・西日本を含む世界様々なリージョンが選択可能になっており（もちろん地上局が日本にある訳ではないです）、SLAは99.9%です。
課金体系を見ていきましょう。衛星ごとのコンタクト先×分単位の課金で$10.00/分です。日本円だと1,460円/分（2022年11月時点で）となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/f61ed0c3-649e-de12-490e-f30ea34765ab.png)
課金タイミングについて、価格ページを見ると「__分単位の料金で、衛星との通信を実行するためにかかったアンテナでの時間に対してのみ支払いを行います。__」とありますので、デプロイすると継続的に課金されるのではなく通信している間だけ課金されるようですね。後で出てきますが、衛星との1コンタクトは10分程度ですので、一回繋ぐのに15,000円程掛かる計算です（高い！）。継続的に使う予定があるならRIを購入しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/beb26aed-a6b8-c619-47e3-735f282c33f1.png)

## Azure Orbital Cloud Access
こちらのサービスはまだプライベートプレビューですが、SpaceXの「Starlink」とAzureエッジデバイスを繋ぐことで、地球上のどこからでも低遅延でAzureにアクセスすることができるサービスだそうです。ネットワークインフラが無い環境でミッションクリティカルなシステム（のエッジ側）を動かすのに適しているとか。災害時も効果的です。また、光ファイバー網・携帯電話通信網・衛星通信網の接続の優先順位をつけることができるので、ネットワーク障害時のフェイルオーバー機能としても使えそうです。米国政府もプライベートプレビューに参加しているみたいですね。

https://www.bigtechwire.com/2022/09/14/microsoft-announces-azure-orbital-cloud-access-preview-a-new-azure-space-service/

ちなみに「Starlink」興味使いですねぇ、日本でもサービス開始していて、ネット検索するとハードを購入した方のブログが見つかります。
ハードウェアが7万3000円、月額料金が1万2300円とか。遊びで買える額じゃないなぁ・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/86bda12e-f0ca-5748-b396-4a270e29d6a2.png)

購入は↓こちら↓から！！
https://www.starlink.com/

# Azure Orbital Ground Stationを触ってみる
Azureポータルから「Azure Orbital」が見つかりました。（ここはまだ「Azure Orbital Ground Station」じゃないんだね・・）とりあえず下記のMicrosoft Learnのチュートリアルを見ながら設定を進めていきます。

https://learn.microsoft.com/ja-jp/azure/orbital/downlink-aqua

このチュートリアルではNASAの公共衛生「AQUA」と繋ぎます！アガりますね↑↑

https://isstracker.pl/en/satelity/27424

## １．宇宙船（Spacecraft）を登録する
まず始めに「宇宙船（Spacecraft）」を登録するところからです。Azureポータルのウィザードは見慣れた画面ですが、設定項目が謎すぎです。NORAD IDってなんだ～！

* 名前：（任意）
* リージョン：「West US 2」と「Sweden Central」が選択可能（スウェーデンだと！？）
* NORAD ID：人工衛星にはNorth American Aerospace Defense ID (北米航空宇宙防衛カタログ番号) というものがあるらしく、「AQUA」は"27424"
* TLEタイトル行：2行軌道要素形式→人工衛星の座標的なもの（と理解）
* TLE - 行１：（後述）
* TLE - 行２：（後述）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/6c5cfe08-fa29-dec9-50ee-ff741f62e8b0.png)

TLE（2行軌道要素形式）がそもそもわからないですが、「行１」「行２」の項目にはチュートリアルにある
https://celestrak.com/NORAD/elements/active.txt に飛んで、”AQUA”で引っかかった2行をコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/5c515012-edf2-78cf-c27a-fce14b563d25.png)

次に「リンク」を追加します。設定項目の意味は全然わからないので、おまじないと思ってチュートリアルの値の通り入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/70f4c023-07e4-bc78-3fdc-cb8796d7191e.png)

検証成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/c6a96a90-db34-d66e-e55a-a2786009fd23.png)

おお！なんだかわからないけど、我が宇宙船ができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/f533b5ba-92d7-bf58-f6f9-d4f425304727.png)

## ２．宇宙船の利用申請
「Azure Orbital 宇宙船承認フォーム」なるものを入力してMicrosoftに承認をもらう必要があるようです。返信（承認？）メールは30分程で届きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/b38484c5-3440-68c4-cc60-2cbfa2a086b5.png)

__注意！！__
チュートリアルでは上記の手順のみですが、この手順だけではNGです。「宇宙船リンクの認可の状態」がずっと空白のままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/9f670f48-4736-5eac-8a10-c6affc6bd424.png)

そのまま進めても後半のコンタクトスケジュール作成のところでエラーとなってしまいますので、下記の手順に従い、MicrosotサポートにSRを上げて宇宙船リンクの認可をもらいましょう。

https://learn.microsoft.com/ja-jp/azure/orbital/register-spacecraft?source=recommendations#request-authorization-of-the-new-spacecraft-resource

Microsoftサポートは外国の方でしたので多少英語でのメールのやり取りが必要です。（さすがにまだ日本でのサポート体制はないかな。）
私の場合、1日程度待って無事認可が下りました。そうすると先ほどの画面がこんな状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/ff8364ad-2f37-7475-3216-6eb5b1293ead.png)

後の手順で作るリンク構成から確認すると有効期限は5年のようです。（特にこちらから期限の設定はしていません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/9d04292f-1fea-d210-6ad0-405e62013ec0.png)

## ３．AQUAデータ受信用のVMとVNETの作成
宇宙船からのデータ受信するための環境を構築します。チュートリアルではVMの要件としてメモリ32GB以上のUbuntsu18.04以降という指定があったので、それに準じたVMを作成します。また、Azure Bastionを作成し、OS上でAQUAのデータを受信するためのディレクトリ作成やsocatのインストールを行います。

```
sudo mkdir /media/aqua
sudo mount -t tmpfs -o size=28G tmpfs /media/aqua
sudo apt install socat
```
ここで作成したVNETと「Azure Orbital Ground Station」をVNET統合で繋げる手順になっています。VNETに「orbital-subnet（/24以上）」を作成し、「Microsoft.Orbital/orbitalGateways」というサービスに委任します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/66ae7933-4f18-6c3a-a713-dc6a2720f005.png)

## ４．ダウンリンク ミッションのコンタクト プロファイルを構成する
コンタクトプロファイルを作成する前に衛星データの送信先になるEvent Hubsを作成しておきます。（実際コレ使ってない気もしますが、とりあえず用意しておきます。）

[Event Hubs名前空間]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/6315d09f-4282-312e-8053-1f79fd096f4d.png)

[Event Hubsインスタンス]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/591fa20e-05b8-93e9-1e46-5c08ee7074a0.png)

続いて、Azureポータルの検索バーで”Contact profile”と入力すると、Marketplaceに「Contact profile」が出てくるのでこれを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/21bb73c0-2eb0-7d75-ab89-a6937f2e28f6.png)

入力項目はチュートリアルの通りにします。（相変わらず内容はわかっていません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/52ffc9ea-449e-f27b-c5a9-e4e01affe8c7.png)

続いてリンクの追加。チュートリアルとAzureポータルのUIが少し異なっていて、一部の設定は「チャネルの追加」の方に移っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/d04b0b3e-e5c7-5c62-848f-276a063d0257.png)

コンタクトプロファイルが完成しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/dd63a341-8ad2-001a-c836-e525b4eb3ffa.png)

## ５．AQUAとのコンタクトスケジュールを作成する
初めに作成した「宇宙船」から、AQUAとコンタクト可能なスケジュールを選択します。ここでは8時間後にコンタクトするスケジュールを選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/90f44972-d1d3-3372-09bf-51f670be6da5.png)

これでコンタクトスケジュールの設定が完了です！あとはコンタクトが開始される時間まで待ちましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/77aae1ac-e152-4da5-0169-5ddac26cdb5e.png)

## ６．いよいよAQUAとコンタクト！

いよいよコンタクトが行われる時間が近づいてきました！ここで、衛星データを受信するVMにAzure bastionでログインし、socatのリッスンを開始しておきます。

```
sudo socat -u tcp-listen:56001,fork create:/media/aqua/out.bin
```

__注意！！__
ここで何も考えずチュートリアルのままコマンドを実行すると権限エラーを食らいます。いよいよコンタクト開始！という時に無慈悲にも「Permission denied」が出力され続けます・・・コマンド実行時にはルートユーザになっておくか、sudoを付けるようにしましょう。

コンタクト開始からコンタクト終了までじっとしておきます。コンタクトが終わるとポータルの”Time until contact”が「connect expired」となります。
そして、ディレクトリには”out.bin”というファイルができているはずです！
中身はバイナリファイルなのでよくわかりませんが、ひとまずAQUAからのデータを受信することに成功しました！

（ファイル開いてもこんな感じ・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/34ca0536-47cb-f6de-35b5-032b4d548c4b.png)

そりゃそうですよね。。衛星からjpegファイルが送られてくる訳じゃないですからね・・・しかし紛れもなくAQUAのデータです！（多分）
そして、このなんだかよくわからない”out.bin”をどう料理するかが次のステップになります。こちらもMS Learnにチュートリアルがありますが難易度が一気に上がります。どこかで挫けそうですが、またチャレンジしたいと思います。「Azure Orbital」としてはここまでです。

# おわりに
今回は「Azure Space」と「Azure Orbital」の概要について調査し、「Azure Orbital Ground Station」を実際に触ってみました。「Orbital」の"O"をかじった程度ですが、ちょっとだけ宇宙に近づけた気がしました！ということでまた次回。ありがとうございました。