麦星 - arcturus technologies- 

テクノロジー関連情報と日常的な何かを発信しています

Aliyun Linux でLive 配信してみる。

ども、うし@tangniuwanです。
 

昨今の新コロ事情で、需要あるのかなー?と思い、「LIVE配信サーバ」でググった所、
cloudpack.mediaさんのエンジニアブログに「簡単にできる!Live配信サーバ構築」という記事を見つけたので
Aliyun Linux でLive 配信サーバを構築してみました。

 
 

はじめに

 
基本的に、記事「簡単にできる!Live配信サーバ構築」の記載の通りに進めると約15分程度で実際の配信まで完了します。本当に簡単にできます。
そして、分かりやすく記載されているので、ほとんど迷う箇所はないと思います。
通常のライブ配信サーバ構築は、上記で完結するのですが、更にスマホのカメラで撮影した絵を配信して見たかったので、試しに実装してみました。

事前準備

  1. ECSインスタンスSSHキーを準備

  2. VPCやセキュリティグループは既存の設定を使用します

 
 

環境

項目
PC OS Windows10 64bit
PC ブラウザ Google Chrome(最新版)
スマホOS Android (ver.10)
スマホブラウザ Google Chrome(最新版)

やったこと

  1. ライブ配信用「Aliyun Linux」のインスタンス準備

  2. SSHCLI操作(NginxのDL + インストール + 設定)

  3. 動画Playerの準備

  4. ライブ配信ツール「OBS」の操作 (OBSのDL + インストール + 設定)

  5. スマホへアプリ「IP Webcom」をインストール
     
     

1.ライブ配信用サーバ「Aliyun Linux」のインスタンス準備

● 以下のスペックで、ECSインスタンスを作成しました。

設定項目 設定値 備考
リージョン Japan (Tokyo)
インスタンスの仕様 ecs.t5-lc1m1.small 標準タイプ
CPU 1コア
メモリ 1GB
OS Aliyun Linux 2.1903 64-bit
I/O 最適化 True
帯域幅 5 Mbps
システムディスク Ultra クラウドディスク 20 GiB

 
 
● セキュリティグループのイントラネット入力で、以下のポートを許可しました。

設定項目 設定値
SSH 22
HTTP 80
RTMP 1935

 
 

2.SSHCLI操作(Nginxの設定)

記事「簡単にできる!Live配信サーバ構築」に記載がある通りに コマンドを進めると
簡単に構築出来ます。

※今回はHLSの配信のみ。としたかったので、本家の記事とNginxの設定などが若干異なりまる。

 
以下、転載になります。

// 関連パッケージ(Nginx+nginx-rtmp-module)のインストール  
# yum -y install git gcc pcre-devel openssl-devel
  
// 作業ディレクトリの作成
# mkdir works  
  
// [Nginxダウンロード](https://nginx.org/en/download.html) & Nginx展開  
# cd ~/works/
# wget https://nginx.org/download/nginx-1.14.0.tar.gz
# tar zxvf nginx-1.14.0.tar.gz

// nginx-rtmp-moduleのインストール  
# cd nginx-1.14.0/  
# git clone https://github.com/arut/nginx-rtmp-module.git  
# ./configure --add-module=nginx-rtmp-module/  
# make  
# make install  
  
// NginxのConfig設定
# vi /usr/local/nginx/conf/nginx.conf  

nginx.conf

worker_processes auto;
error_log  logs/error.log error;
 
events {
        worker_connections  1024;
}
 
rtmp_auto_push on;
 
rtmp {
    server {
        listen 1935;
        access_log logs/rtmp_access.log;
        chunk_size 4096;
        timeout 10s;
 
        application live {
            live on;
 
            # HLSの記述欄
            hls on;
            hls_path /var/www/html/hls;
            hls_fragment 10s;
         }
    }
}
 
http {
    server {
        listen  80;
        include mime.types;
        default_type    application/octet-stream;
        server_name localhost;
        add_header  Access-Control-Allow-Origin *;
 
        location /hls {
            types {
                 application/vnd.apple.mpegurl m3u8;
            }
            root /var/www/html/;
        }
    }
}

Configの確認

# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

サービス起動のスクリプトを作成

# vi /usr/lib/systemd/system/live_nginx.service
 
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

サービス起動 & 自動起動

// 起動
# systemctl start live_nginx.service

// 自動起動
# systemctl enable live_nginx.service
 
Created symlink from /etc/systemd/system/multi-user.target.wants/live_nginx.service to /usr/lib/systemd/system/live_nginx.service.

 

Nginxが起動しているとブラウザで、以下の様な画面が表示されます。
 

f:id:tangniu:20200326230301p:plain

3.動画Playerの準備

HLSのPlayerとなるHTML生成  

※「obs_hls.m3u8」の部分は、この後のOBSの設定にも使用します。  

// ファイル作成
# vi /usr/local/nginx/html/hls.html

// ファイル内容
<!DOCTYPE html>
<html> 
<head>
  <meta charset="utf-8">
  <title>MediaElement</title>
  <!-- MediaElement style -->
  <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/mediaelement/4.2.9/mediaelementplayer.css" />
</head> 
<body>
  <!-- MediaElement -->
  <script src="//cdnjs.cloudflare.com/ajax/libs/mediaelement/4.2.9/mediaelement-and-player.js"></script> 
  <video id="player" width="640" height="360">
</body>
<script type="text/javascript">
      var player = new MediaElementPlayer('player', {
        success: function(mediaElement, originalNode) {
          console.log("Player initialised");
        }
      });
      player.setSrc("hls/obs_hls.m3u8");
</script>
</html>

4.ライブ配信ツール「OBS」の操作

配信は、「OBS Studio」(Open Broadcaster Software)を使うので以下からDLし、インストールします。

obsproject.com

次に、OBSの配信設定をするので、[ ファイル ]→[ 設定 ]を開き、設定画面の[ 配信 ]を選択します。

f:id:tangniu:20200326233002p:plain

表示された画面で、以下を設定します。

項目 備考
サービス カスタム
サーバ rtmp://{hostname}:{port}/live/ 構築した環境に合わせて下さい
ストリームキー obs_hls 先程の「obs_hls.m3u8」のファイル名を使用します

f:id:tangniu:20200326233028p:plain

次に、以下の様に配信するソースを選択し、「配信開始」ボタン押下により、配信します。

f:id:tangniu:20200326233829p:plain

選択項目 ざっくり出来ること
映像キャプチャデバイス PCなどのWEBカメラの映像をLIVE配信できます
メディアソース MP4ファイルなどを配信できます
ブラウザ 設定画面にURLを指定しブラウザで表示している内容を配信できます

 

5.Androidへアプリ「IP Webcom」をインストール

Google Play から「IP Webcom」をDLし、インストールします。

・次にPCへ、IP Webcomアダプターをインストールします。

※以下ページの、画面下部にある、「開発元」のウェブサイトにアクセスリンクからも
 アダプターのDLページへ遷移できます。

play.google.com

以下は、「IP Webcom」の設定画面です。
設定画面のURLは、Androidアプリで動画撮影を開始すると画面に表示されます。
f:id:tangniu:20200327002116p:plain

最後に「IP Webcom」で撮影した絵を、OBS経由で配信設定すれば完了!
 

で、実際にライブ配信してみると、30~50sのディレイがある。。(うーん。スペック上げるかな。)  

AliEaters(AlibabaCloud Developers Meetup)in 仙台#3

ども、深夜のうし@tangniuwanです。

AliEaters in 仙台#3で発表させて頂きましたので、そのレポートです。

※AliEaters = AlibabaCloud Developers Meetup
(Alibaba Cloudの魅力や活用法をみんなで共有するための勉強会コミュニティです。)

www.alieaters.com

f:id:tangniu:20191116145740j:plain

目次

登壇したイベント

alieaters-sendai.connpass.com

登壇内容

昨今の自動化2.0と言うワードから、
アリババクラウドにも構成管理ツール(IaCツール)が有るよ。という事で
初心者さん向けに、Resource Orchestration Service(ROS)について発表させて頂きました。

スライドは下記です。

www.slideshare.net

全体的にどうだった?

んー表現が難しいですが、Interactive Round Table的な感じで
その場で質問し、その場で回答。セッションとセッション合間や、
休憩時間に質疑応答。と、シンプルな座学ではなく、一部、対話形式で進行しました。

ビアバッシュ的に、皆さんアルコールが入っていた。ってのも
理由かも知れませんが、皆さん気軽に会話しながらLTしてた感じです。

個人的には、こういう、緩い感じの好きです。

刺激を受けたものは?

  • コードを見ながらの発表
    • 内容はTerraformの設定やコンテナの操作について
    • 実際のデモ
  • 物凄く新鮮だった
  • コードなので超具体的だった。
    • 一番質問が多かった
  • ブログがスライド。ってのはよく見るが、コードがスライドなのは初めてで新鮮だった

学んだことは?

会場説明の際に

  • 避難経路を説明すること
  • 写真撮影について説明をすること
  • ハッシュタグの説明をすること

懇親会は?

技術的なお話が面白かった

  • AIの分野で、気付かないうちに中国がアメリカを追い越していた
  • 日本はIT後進国とは以前から聞いていたが、突きつけられた感じだった。
  • 個人的には東北を盛り上げたい。

最後に

  • オーガナイザー会とかないかな?
  • 特に地方のオーガナイザーの方と悩みを共有したい。

Resource Orchestration Service(ROS)について

ども、うし@tangniuwanです。

AliEaters(AlibabaCloud Developers Meetup)in 仙台#3のイベントで
初心者さん向けに、AlibabaCloud のIaCツール(構成管理ツール)である
Resource Orchestration Service(ROS)について
発表させて頂いたので、内容を記事にしました。

開催イベントの内容などは以下のページをご参照下さい。

alieaters-sendai.connpass.com

目次

さて、ROSについてですが、その前に
まず、「Infrastructure as Code」(以下、IaC)ってご存知でしょうか?

1. Infrastructure as Code(IaC)って何ぞ?

10~数年前に注目された業界のワードで、
手動で都度インフラを構築していたものを、コード化して可視化するってヤツです。
端的に言うと「インフラ」をコードで記述する事によって
ソフトウェア開発で既知のプラクティスをインフラにも適応して、
その恩恵を享受する。というものです。
 
つまり、プログラムの様にコードを記述して、
それをツールを使ってデプロイすることでコードからインフラを構築します。  
 

何で今、ROSなのか?

最近、自動化2.0とともに、IaCが見直されており
アリババクラウドにも、構成管理ツールがあるよ。ってことを
お伝えしたかったから
 
個人的な勝手な憶測だと、背景には

上記が関連して、見直されてるのかな?なんて考えいます。

 
 

マルチプラットフォームの構成管理ツール

Ansible ChefHashiCorp社のTerraform など、クラウドベンダー以外でも
昔から色々なマルチプラットフォームの構成管理ツールがあり、
今現在のデファクトは、「Ansible 」な感じがあります。  
 

クラウドベンダーのインフラオートメーション系プロダクト
ベンダー プロダクト 記述方式
AWS Cloud Formation 調査中
Azure Resource Manager 調査中
GCP Cloud Deployment Manager 調査中
Alibaba Cloud Resource Orchestration Service JSON

※2019/11/16時点の情報です。

IaCのメリット/デメリット

じゃあ、ソフトウェア開発で既知のプラクティスってどんなものがあるかって言うと

 
もちょっと緩い表現で、インフラをコード化、可視化するメリットを書くと
下記な感じです。

  • テキストで定義するだけでインフラが自動構成
  • Git などのバージョン管理ツールで管理可能
  • もちろんチーム間で共有可能(インフラ設定者が不在でもOK、非属人的)
  • デプロイが繰り返し可能
  • 手作業のリスクとエラーの除去(ヒューマンエラーが激減)
  • 構築スピードと信頼性の向上
  • コードなので詳細のトレースが容易
  • インフラのモデリングが可能
  • 可逆性がある(プロダクトによる)

逆に、デメリットってどんなものがあるのかな?と考えると…

  • チームで運用ルールを決める必要がある
  • それなりに学習コストが発生する
  • 手動対応した際に、実際のインフラ構成をコードに落とし込む必要がある。
  • 開発当初から、インフラ要件が決定していない。

学習、ルール決めと言うコスト、実際のインフラ構成とコードの同期など、
ソフトウェア開発のプラクティスを持ち込んでいるが故に
ソフトウェア開発の問題点も引き継いでいるようにも感じます。

 
 

さて、なんとなく、IaCを理解した気になったので
Resource Orchestration Service(ROS)の機能を確認してみましょ。

 

2. Resource Orchestration Service(ROS)ってどんなプロダクト?

まず、ROSのプロダクトページを見る。と以下の記載があります。

概要

クラウド環境の構成をテンプレートに定義し、テンプレートに応じて
プロビジョニングすることができるオーケストレーションサービスです。

  • ROSは、Alibaba Cloud リソースの作成や管理を効率化するサービスです。
  • ROS を利用することで開発者やシステム管理者の作業工数を大幅に削減することが可能です。
  • ROS では、リソース、リソース間の依存関係、及び設定の詳細を
    JSON形式のテキストファイルで定義できます。

  〇 ROSプロダクトページから抜粋
  via. https://wwwalibabacloud.com/product/ros

ここで1つ言葉の定義というか、
「テンプレート」について、ちょっとご説明

テンプレート = 設定ファイル(IaCのコードに該当)= JSON形式のテキストファイル
(リソーススタックテンプレートとも呼ばれます。)

※スタックについては後述します。

ROSのドキュメントを読み込む

ドキュメントセンターにある、リソースオーケストレーションの概要を見ると
以下の記載がありました。
色々、記載があるのですが、個人的に重要だと思う箇所を赤文字にしています。
また、(リソース)スタック=リソースのグループのこと。と記載があります。

  • ROSは、Alibaba Cloud ユーザーがクラウドコンピューティングのリソース管理を簡素化し、
    O&Mを自動化するのに役立つサービスです。
  • リソーススタックテンプレートを最初にコンパイルします。
  • テンプレートでは、必要なクラウドリソース、リソース間の依存関係、および
    リソース構成を定義します。
  • オーケストレーションエンジンを使用すると、ROS は、テンプレートに応じて、
    自動展開、運用、保守のためのすべてのリソースを自動的に作成および構成できます。
  • オーケストレーションテンプレートは、JSON 形式のテキストファイルです。
  • このファイルは、いつでも読んだり編集したりすることができます。
  • JSON で直接テンプレートをコンパイルすることも、ROS コンソールでビジュアルエディタを使用して
    より視覚的にテンプレートをコンパイルすることもできます。
  • SVN や Git などのツールを使ってテンプレートのバージョンを制御することができます。
  • APISDK、およびその他の方法を使用して IaC(Infrastructure as Code)を有効にして、
    ROSのオーケストレーション機能を独自のアプリケーションに統合することもできます。
  • リソースオーケストレーションテンプレートは、
    リソースとアプリケーションの標準的な配信方法も提供します。
  • テンプレートを使用して、クラウドリソースとアプリケーションを含む統合されたシステムと
    ソリューションを提供できます。
  • 独立系ソフトウェアベンダ(ISV)は、このような配信方法を使用して、
    Alibaba Cloud リソースを独自のソフトウェアシステムと簡単に統合して一貫した配信を実現できます。
  • ROSはクラウドリソースをグループ単位で管理します。
  • リソースのグループはリソーススタックです。
  • したがって、グループ内でクラウドリソースを作成、削除、変更、クローン作成することができます。
  • DevOps のプラクティスでは、開発、テスト、および実行環境を簡単に複製でき、
    アプリケーションの全体的な移行とスケーリングを簡素化できます。

  〇 ドキュメントセンターから抜粋
  via. https://wwwalibabacloud.com/product/ros

ROSの特徴

こちらも同様に、個人的に重要だと思う箇所を赤文字にしています。

  • テンプレート
    • 豊富な Orchestration テンプレートを提供してます。
    • さまざまな構成に対応可能です。
    • オンラインのエディターではテンプレートをチェックし、
      その中でエラーがあれば、その詳細が表示されます。
  • リソースの作成
    • ECSほぼ全てのプロダクトおよびサービスのリソースを作成および購入できます。
    • 世界中のリージョンでリソースを作成できます。
    • Cloud Init で ECS リソースのカスタマイズが可能です。
    • リソースの作成時に削除ポリシーを指定できます
    • インスタンスをより簡単に作成できます。
  • リソースの更新
    • テンプレートとパラメーターをオンラインで編集できます。
    • テンプレートまたはパラメーターを変更して、リソースの設定を一括で変更できます
    • テンプレートまたはパラメーターを変更して、リソースのスケーリングを行うことができます。
  • リソースの削除
    • 他の Alibaba Cloud サービスを利用してスタックからリソースを削除することも可能です。
    • スタックを削除することで、スタック中のリソースも完全に削除できます。
    • スタックのみを削除し、スタック中のリソースを保持することも可能です。
    • ユーザー自身で削除ポリシーを設定し、自動で実行することができます
  • リソースの参照
    • スタック、リソース、イベント単位で、ステータスやエラーの詳細を確認できます。
    • スタックのテンプレートを表示できます。
    • スタック内のリソースのステータスを確認できます。

※Cloud Init について、分かりやすいドキュメントがありましたので、掲載させて頂きます。

qiita.com

※「リソースの作成時に削除ポリシーを指定できます。」について
  ちょっとだけ追記
 
WEBとRDBの構成などをスタックで管理している場合の想定で、
スタックを削除すると、当然、WEBもRDBも削除されます。
この際、一緒にWEBや、RDB内のデータも消えてしまいますが、
データだけは残したい。そんな時に使うのが、この「削除ポリシー」です。

具体的には、スタックの削除操作が行われてもRDBは削除しないでね。という ポリシーの設定が可能です。

ROSで操作可能な主なリソース(プロダクト)
区分 プロダクト
仮想サーバーサービス Elastic Compute Service (ECS)
仮想サーバーサービス Auto Scaling
仮想サーバーサービス Container Service
仮想サーバーサービス Function Compute (FC)
ネットワークサービス Virtual Private Cloud (VPC
ネットワークサービス Server Load Balancer (SLB
データベース ApsaraDB for RDS
データベース ApsaraDB for MongoDB
データベース ApsaraDB for Redis
データベース ApsaraDB for Memcache
アプリケーションサービス Message Notification Service(MNS
アプリケーションサービス Log Service
アプリケーションサービス API Gateway
ストレージと CDN Object Storage Service(OSS
マネジメント Resource Access Management(RAM)

ちなみに、
日本サイトと国際サイトでテンプレートの量や、操作可能なリソースが異なります。
恐らく中国サイトはもっと量が多い感じがします。

恐らくこんな感じ
中国サイト > 国際サイト > 日本サイト

ROSの制限と制約

ROSには以下の制限があります。

  • 各リソーススタックに最大 200 のリソースを作成できます。
  • 各ユーザーは最大 50 のリソーススタックを作成できます。
  • 各テンプレートファイルは 512 KB を超えることはできません。

  〇 ドキュメントセンターから抜粋
  via. https://jp.alibabacloud.com/help/doc-detail/28854.htm

図にすると以下の様な感じ。 f:id:tangniu:20191117161125p:plain

ROSの料金

現状は、無料です。

3. Try to use ( Alibaba Cloud ECS Clone )

ROSの有効化

取りあえず、有効化しないと使用できなので、ROSを有効化します。

有効化の方法は以下URL参照
ROS(Resource Orchestration Service )の有効化 - 麦星 - arcturus technologies-

いじってみる

まず、テンプレートが豊富にあるとのことなので、サンプルテンプレートを確認します。
確かに沢山あります。
その中で、「entire_ecs_clone」という、ECSのクローンを生成するスタックが有ったので
使ってみます。
「entire_ecs_clone」のスタックを作成リンクを押下します。

f:id:tangniu:20191117161354p:plain

スタックの作成画面に切り替わります。
JSON形式のテキストファイルで定義さえれていることが分かります。
何も変更せず次へボタンを押下するとヴァリデーションされ、問題があればエラー表示されます。
 
もし、ROSでエラーが発生する場合は、JSONを確認し、
リソースのタイプ検索画面(日本サイトのROSにメニューだと「リソースのタイプ」)から
該当するリソースのプロパティを検索してみましょう。
 

〇 スタックの作成画面 f:id:tangniu:20191117161952g:plain  

エラーが無ければスタックの有効化画面に切り替わります。
スタックの有効化画面で、各種情報を入力して次へボタンを押下すると
ROSにリクエストが送信されます。

〇 スタックの有効化画面 f:id:tangniu:20191117162413p:plain

正常にROSにリクエスト送信が完了すると、以下の様な画面が表示されます。

〇 リクエストの送信画面 f:id:tangniu:20191117163841p:plain

いじってみた結果
  • わずか3ステップで、クローンが出来た。
  • SSH認証方式(キーペア)、タグ、ディスクリプションなど、丸々コピーされていた。
  • サブスクリプションで購入したインスタンスをクローンしても従量課金タイプで複製される。
    (当然と言えば当然なのだが、もう一度ドキュメントを確認する)
  • サブスクリプションの有効期限が切れたインスタンスでもクローンできた。
    つまり、ハードディスクさえ残っていれば、クローンできるっぽい。

4. まとめ

  • やっぱ、IaCは、DevOpsの一環な感じがした。
  • モノ凄く簡単にデプロイできる。
  • 細かい点でハマるポイントが有った。
  • ドキュメント大事。