RustのRTMPサーバーをGCPにデプロイしたときの記録

# はじめに
RustのRTMPサーバーを、GCPにデプロイしてOBSで動作確認できたので備忘録的に残しておきます。
あまりプログラムの部分は書いていないので、動作を確認するのがメインになるかと思います。

## サンプルのプログラム
> https://github.com/KallDrexx/rust-media-libs/tree/master/examples/threaded_rtmp_server

今回はこのリポジトリの、`threaded_rtmp_server`の、ライブラリのバージョンを

```toml:Cargo.toml
[package]
name = "everlong"
version = "0.1.0"
authors = ["Papillon6814 <41826375+Papillon6814@users.noreply.github.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
slab = "0.4.2"
bytes = "0.5.4"
rml_rtmp = "0.3.2"
```

このように調整して、実行しました。
## Google Compute Engineの仮想インスタンスの作成

次は、[GCP](https://cloud.google.com/?hl=ja)にアクセスして、`VMインスタンス`を作成します。

<img width="533" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/85f73933-abaa-abdd-6bb0-4e522d3eee0c.png">

`VMインスタンス`は、仮想でつくられたサーバーのようなものです。
`インスタンスを作成`というところを選択すると、VMインスタンスの作成ページへと遷移します。

そこにはこのように入力しました。

- 名前： instance-2
- マシンの構成
    - シリーズ：　N1
    - マシンタイプ：　n1-standard-2
- ディスクイメージ： Ubuntu 18.04.1 LTS x86_64
- HTTPトラフィックを許可する
- HTTPSトラフィックを許可する

これでVMインスタンスを作成します。

## GCPで、RTMP通信用のポート1935を開ける

`VPCネットワーク`から、`ファイアウォールルール`を選択します。


<img width="490" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/01a0e049-70f6-7a73-575a-1fb81ce1a846.png">

そして、`ファイアウォールルールを作成`というボタンから、RTMP通信用のポート1935でのTCP通信を許可します。

<img width="342" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/89869667-4158-76ac-123e-dfd9c41ab8b3.png">

このような内容で新しいルールを作成しました。

## VMインスタンスにファイアウォールルールを適用する

ルールを作成しただけでは、VMインスタンスに適用されないので手動でルールを設定してあげます。
VMインスタンスの編集画面に行き、

<img width="459" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/1ed0e1ee-611e-1db0-7940-321e18f5ea68.png">

`ネットワーク タグ`という項目に先程作成した`allow1935-server`を追加します。

## Cloud SDKの導入

terminalからssh接続がしたかったので、`Google Cloud SDK`を導入します。
以下のリンクを参考に導入ができると思います。

> https://cloud.google.com/sdk/docs/quickstart-macos?hl=ja

## 自分のVMインスタンスにssh接続

`Cloud SDK`が導入できたら、自分のVMインスタンスにssh接続します。

GCPの`VMインスタンス`のページから、ssh接続するための`gcloudコマンドを表示`という項目を選び、コマンドを自分のターミナルで実行します。

<img width="454" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/d5f02bb6-3b98-8faf-d020-324ddef5de4b.png">

すると、自分のVMインスタンスにssh接続できるかと思います。

## VMインスタンスでのRustの導入

VMインスタンス上でもRustを実行できるようにしないといけないので、ssh接続をしたターミナルでRustのインストール用のコマンドを実行します。

```
~$ curl https://sh.rustup.rs -sSf | sh
```

このコマンドでRustの実行環境が導入できます。

## RustのRTMPサーバーの導入
ssh接続しているVMインスタンス上で、

```
mkdir ~/Documents
cd ~/Documents
mkdir ./Github
cd ./Github
git clone https://github.com/Papillon-inc/Everlong.git (ここは自分のクローンしたいリポジトリ)
```
を実行します。
これで、RTMPサーバーが導入できました。

## サーバーの実行
`Cargo.toml`のある階層で、

```
cargo build
./target/debug/[プロジェクト名]
```

でプログラムを実行します。

```
$ ./target/debug/everlong
Listening for connections on 0.0.0.0:1935
```

このように、1935番ポートでRTMPの受付が始まりました。

## OBSで、サーバーが反応していることを確認

[OBS](https://obsproject.com/ja/download)を開き、
`設定`の`配信`を開きます。

<img width="748" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/9f83678c-0340-8825-6cee-c22e95a2b448.png">

この`サーバー`の欄に、VMインスタンスのグローバルIPと1935からなるURLを入力します。
`rtmp://???.???.???.???:1935`
こういう感じです！
ストリームキーはとりあえず今回はなんでもいいです。

そして、キャプチャするものをOBSで選択し、`配信開始`ボタンを押すと、

<img width="678" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/fbb04a99-6295-3e1c-ab08-e754a1ba2110.png">

このように、RTMPの通信に反応していることを確認できます！

# おわり
iosの`HaishinKit`を使ってのRTMPサーバーへの接続もうまくいったので、機会があったらまとめてみようかと思っています。
今回のサーバーはとりあえず動いてくれて嬉しかったです。

## 参考リンク
> https://ticktakclock.hatenablog.com/entry/2018/09/12/203900
> https://qiita.com/yoshiyasu1111/items/0c3d08658560d4b91431