Unity+MagicOnionのサンプルプログラムをコンテナ化してAzureContainerInstancesで簡単に動かす方法

## まえがき
[MagicOnion](https://github.com/cysharp/MagicOnion) は C# による .NET Core/Unity 用のリアルタイム通信フレームワークです。

この記事では[公式のサンプルプログラム](https://github.com/Cysharp/MagicOnion/tree/master/samples)のサーバーサイド部分をコンテナ化して、MicrosoftAzure上で簡単に動かす方法を紹介します。

MagicOnion や Docker や Azure に不慣れな方でも手順通りにぽちぽちすれば 30 分程度で一通り試すことができると思います。

Docker 関連の作業は DockerHub 上で行いますので、Local 環境で Docker 関連の事前準備は不要です。

## 事前準備
この記事では GitHub 上に作業用リポジトリを用意して、そちらを DockerHub の AutomatedBuilds の対象に指定することで Docker イメージを生成しています。

そのため事前に以下のアカウントを用意してください。

- GitHubアカウント
- DockerHubアカウント
- MicrosoftAzureアカウント

##1. 作業用 GitHub リポジトリの作成、サンプルコードの修正、Dockerfileの追加
1. GitHub に新規リポジトリを作成し、[MagicOnion のリポジトリ](https://github.com/cysharp/MagicOnion)から MagicOnion\samples\ChatApp 配下の3つのフォルダをリポジトリのルートにコピーします。
  - ChatApp.Server
  - ChatApp.Unity
  - GeneratorTools

2. ChatApp.Server\Program.cs の ServerPort の IP アドレスを localhost から 0.0.0.0 に変更します。
※localhost のままでは Azure 上で正常に動作しません。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/e9cd1384-4780-edf3-63b9-66ad29e83ddd.png)

3. リポジトリのルートへ Dockerfile を追加します。
Dockfile の中身は[こちら](https://github.com/Yuki0928/MagicOnionAzureContainerInstancesSampleApp/blob/master/Dockerfile)をコピペしてください。

4. 作業内容を Commit して GitHub へ Push します。
ここまでの作業が終わったリポジトリは[こちら](https://github.com/Yuki0928/MagicOnionAzureContainerInstancesSampleApp
)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/c04cc138-6e1a-70c0-8008-827e306720c1.png)
フォルダ構成などが一致していることを確認してください。

## 2. DockerHub で Docker イメージを生成 
DockerHub にログインしてリポジトリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/1ba3d28f-8c6e-d58d-58dc-d8ca2815d35a.png)
設定項目がいくつかありますが直感的に設定できるので割愛します。
最後は Create&Build を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/80737b45-b417-d450-3f49-a3375fbe7305.png)

Build は15分ほどかかるのでのんびり待ちます。
Build が終わったらいよいよ Azure で動かしてみます。

## 3. AzureContainerInstances でコンテナを実行
AzurePortal にログインして ContainerInstances を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/794b5525-c4d8-ab51-9015-ea192e1598f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/988b03d6-1d50-34b2-fd8f-b3808643c566.png)
ContainerName は任意の名前を設定します。
ImageName は DockerHub の ID と RepositoryName を / で繋いで入力します。
e.g. minami/magiconion-chat-app-server

他の項目も入力したら Next:Networking を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/d7d07bb6-a4d9-42de-7ae9-1dd07fc11efd.png)
MagicOnion が使用する TCP の 12345 Port を開放します。
DNSNameLabel は必須ではありませんが、設定しておくと便利なときもあります。
それぞれ設定したら Review + create を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/8548107c-111b-f460-a8fb-5d45a5e50abb.png)
Create を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/ebc64202-72d4-82ce-0b7e-28500ede9fdd.png)
30 秒程で ContainerInstances が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/1ce3171c-8cce-7a48-e679-b564626d9411.png)
IP アドレスか FQDN をメモしておきます。
※ContainerInstances を Stop すると IP アドレスが変わるので注意してください。Restart なら変化しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/bf8ef341-9dfb-a0a4-61f9-cf57cf18d1c2.png)
Azure の作業はここまでです。

## 4. Unity で動作確認
1. ChatApp.Unity\Assets\Scripts\ChatComponent.cs で定義されている接続先を localhost から ContainerInstances の IP アドレスか FQDN に書き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/350cbff2-582f-faad-193c-c83b645238a9.png)

2. ChatScene を開いて動作確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/12c67e5b-ad6c-a8ad-2298-8ab16c20edd3.png)

以上です、お疲れ様でした。

## 感想
最近は簡単で便利なものがたくさんあってすごいなと思いました（こなみ）
自分の備忘として記事にしてみましたがどなたかの参考になることがあれば幸いです。