nginx-rtmp-moduleでお試しLive配信環境を作る

USTREAMYouTube Liveの様に、リアルタイムで動画を配信しながら視聴できる一連の環境づくり&設定についてまとめてみた。
お試し環境なので、同時接続が辛いとか色いろあります)

配信サーバの準備

Real Time Messaging Protocol (RTMP) を扱うために、オープンソースで公開されているnginx-rtmp-moduleを使います。
今回は映像を受信して、配信するサーバは同じサーバとして、EC2(Amazon Linux)上に用意して試します。

sudo su
yum update
yum groupinstall "Development Tools"
yum -y install pcre-devel zlib-devel openssl-devel

cd /usr/local/src/
wget http://nginx.org/download/nginx-1.8.0.tar.gz
sudo wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -zxvf nginx-1.8.0.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
unzip master.zip
build
cd nginx-1.8.0
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
make
make install
nginxの設定ファイルにrtmpの設定を追加

/usr/local/nginx/conf/nginx.confの一番最後に以下を追加

rtmp {
   server {
      listen 1935;
      chunk_size 4096;

      application live {
         live on;
         record off;
      }
   }
}

applicationで指定する名称がURLの一部になります。
上記の設定だとURLは、rtmp:///live

設定ができたら、nginxを起動します。

/usr/local/nginx/sbin/nginx

この状態でブラウザからhttp:///にアクセスして、Nginxの起動してますページが表示されればOK。

配信サーバへ映像を送るクライアントを準備

本格的に配信をする人ならLiveShell Proとか使って配信するかもしれませんが、今回はお試しなのでPC上でキャプチャ出来て、配信サーバにアップロードできるオープンソースのソフトを使います。

Open Broadcaster Software

Mac版をダウンロードして起動します。
起動するとこんな感じの画面が表示されると思います(デフォルトではデスクトップをキャプチャする)

配信サーバの指定

右下のボタンの設定をクリックして設定画面を開きます。
次に設定画面の左側の配信を選択します。

配信種別でカスタムストリーミングサーバを選択して、URLに準備したサーバのURLを指定します。
ストリームキーには何らかの文字列を指定します(適当な文字列でもOK)
ここで指定したストリームキーは後で映像を試聴する際のURLで使われます。

映像キャプチャの設定

OBSの最初の画面でソースとなっているコントロールで「+」をクリックすると、追加するソースが表示されるので、映像キャプチャデバイスを選択します。

開かれたダイアログで、新規作成のままOKをクリックすると、Mac Book Proの場合はFaceTime HD Cameraが選べるので、それを選択すると、カメラからの映像が表示されます。

OKをクリックして設定を終了します。

この状態だとソースが画面のキャプチャと映像デバイスの2箇所となっているので、ソースで不要な方を選んで「ー」をクリックして削除します。

音声キャプチャの設定

同様にソースから音声入力キャプチャを追加し、Built-In Microphoneを追加します。

プレイヤーの準備

配信の準備はできたので、最後にプレイヤーを準備します。
video.js v4.2.0からrtmpに対応(beta)したので、こちらを使います。

jsファイルはCDNにホストされたものを使うので、プレイヤーと言っても以下の様なHTMLファイルを準備するだけです。

<!DOCTYPE html>
<html lang="en" class="">
<head>
  <link href="http://vjs.zencdn.net/4.2.0/video-js.css" rel="stylesheet">
  <script src="http://vjs.zencdn.net/4.2.0/video.js"></script>
</head>
<body>
  <video id="rtmp live test" class="video-js vjs-default-skin" controls
   preload="auto" width="640" height="264" data-setup='{}'>
    <source src="rtmp://<ip address>/live/test" type='rtmp/mp4'>
    <p class="vjs-no-js">
      To view this video please enable JavaScript, and consider upgrading to a web browser
      that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
    </p>
  </video>
</body>
</html>

srcに指定したURLのtestは、先ほどOBSのストリームキーに設定した文字列を指定します。
このファイルをS3など、どこかのサーバに置いて、ブラウザで開きます。

配信

OBSで配信開始ボタンをクリックすると、配信が始まります。
プレイヤー側のブラウザで再生のアイコンをクリックして少し待つと、Live配信されている動画が表示されます。
AU光のネットワークで、配信とプレーヤーのPCを分けてテストしたところ、遅延は3secぐらい)

あとがき

以上で、お試しのリアルタイムの動画配信環境の構築とテストが出来ました。
実際にnginxのサーバがどれくらいの同時視聴に耐えられるかはわかりませんが、ブラウザ3つぐらい開いて試聴するぶんには、負荷の変化もさほどなく遅延も変わらない感じでした。

Grafana + GraphiteでAnnotationsを使ってイベントを可視化する

GrafanaにはAnnotationsという、イベントをグラフ上へ表示する機能があります。
http://grafana.org/docs/features/annotations/

Annotationsのデモ

Annotationsの取得元はいくつか利用可能ですが、データソースとしてGraphiteのEvent
を使う方法について解説します。

Event

GraphiteにはEventと言う情報を保存する仕組みがあります。
しかし探してみても、データを格納する方法については公式ドキュメントで見つからない。

ただ、データの取り出し方については書かれています。
http://graphite.readthedocs.org/en/stable/functions.html?highlight=event#graphite.render.functions.events

こちらのブログで登録方法が書かれているので、そちらを参考に進めます。

Eventの登録

最低限のデータで登録する場合は、以下の様にデータをPostしてあげればいいです。

curl -X POST "http://graphitehost.com/events/" -d '{"what": "fugafuga", "tags": "hoge"}'

Eventの情報が格納されるテーブルはevents_eventで、このテーブルの構造を見ると以下のように定義されてます。

CREATE TABLE "events_event" (
    "id" integer NOT NULL PRIMARY KEY,
    "when" datetime NOT NULL,
    "what" varchar(255) NOT NULL,
    "data" text NOT NULL,
    "tags" varchar(255) NOT NULL
);

テーブル構造から分かるように、さらにwhendataを指定することが可能です。

  • whenは、デフォルトでシステム日付が設定されます
  • dataは、デフォルトでからが設定されます

例えばこんな感じで

curl -X POST "http://graphitehost.com/events/" -d '{"what": "Deploy apps 5", "tags": "deploy", "data": "ここには長い文章が指定できます。"}'

Grafanaの設定

Graphiteに登録されているEventをグラフ上に表示するには、Dashboardの設定から登録します。
Dashboardで設定するように、グラフ単位では指定できないみたいです。

取得するEventの情報を登録します。

  • Name: Annotationの名称
  • Datasource: Graphiteのデータソース
  • Graphite event tags: イベントを登録した時のtag名

登録すると、こんな感じで表示されます。

先ほどのdataに指定した場合は、以下のように表示されます。

Dashboardには複数のAnnotationが登録でき、チェックボックスのON/OFFで表示非表示の切り替えができるので、デプロイ、サーバ追加と言った複数のイベントを登録して表示することで、どのような出来事がきっかけでリソースに変化があったかが一目瞭然となります。

NetflixのVectorを試してみる

Introducing Vector: Netflix's On-Host Performance Monitoring Tool と記事を見かけたので、どんなものか試してみた。

試した環境は、Amazon Linux 2015.03 です

監視対象ホストの準備

メトリックスの収集にPerformance Co-Pilot (PCP)を利用するので、これをインストールします。

コンパイル用のライブラリを一括で入れる
sudo yum -y groupinstall "Development Tools"z
libmicrohttpdを利用するので入れる
sudo yum -y install libmicrohttpd libmicrohttpd-devel
ExtUtils::MakeMakerを利用するので入れる
sudo yum -y install perl-ExtUtils-MakeMaker
pcpをソースからインストール
# 事前にユーザーを作成
sudo groupadd -r pcp
sudo useradd -c "Performance Co-Pilot" -g pcp -d /var/lib/pcp -M -r -s /usr/sbin/nologin pcp

git clone git://git.pcp.io/pcp
cd pcp/
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-webapi
make
sudo make install

何故かエラーになる

 sudo service pmcd start

Rebuilding PMNS ... pmnsmerge: error while loading shared libraries: libpcp.so.3: cannot open shared object file: No such file or directory
Rebuilding the Performance Metrics Name Space (PMNS) in /var/lib/pcp/pmns ...
Rebuild: PCP upgrade processing for "root" PMNS changes ...
Rebuild: merging the following PMNS files:
root root_jbd2 root_linux root_mmv root_pmcd root_proc root_root root_xfs
Rebuild: pmnsmerge failed
         "root" has not been changed.
failed (status=1)
Starting pmcd ... /usr/libexec/pcp/bin/pmcd: error while loading shared libraries: libpcp_pmda.so.3: cannot open shared object file: No such file or directory
pmcd_wait: error while loading shared libraries: libpcp.so.3: cannot open shared object file: No such file or directory
/usr/libexec/pcp/bin/pmpost: error while loading shared libraries: libpcp.so.3: cannot open shared object file: No such file or directory
/etc/init.d/pmcd: pmcd_wait failed: exit status: 127

/usr/libexec/pcp/bin/pmpost: error while loading shared libraries: libpcp.so.3: cannot open shared object file: No such file or directory

http-parser が必要っぽいので入れる

sudo yum -y install http-parser

サービスを起動

sudo service pmcd start
sudo service pmwebd start

vectorのインストール

vectorのインストールにはbowerを使うのだが、bowerにインストールにはnpmが必要となるので、インストールしていきます。

sudo yum -y install npm --enablerepo=epel
sudo npm install -g bower
sudo npm install -g gulp

vector本体をインストール&起動

git clone https://github.com/Netflix/vector.git
cd vector/
git checkout stable
bower install
cd app
sudo python -m SimpleHTTPServer 80

意図的に負荷をかけてみると、即座にその状況が反映される

勝手な思い込みで、複数ホストのメトリックスをいい感じにダッシュボードに表示してくれるものなのかと思ってたら、ちょっと違った。

AWS 認定ソリューションアーキテクト – アソシエイト

先日、AWS 認定ソリューションアーキテクト – アソシエイトの認定試験を受けてきてきました。
結果は無事合格。

総合スコア: 83%
内訳
1.0 高可用性、コスト効率、耐障害性、スケーラブルなシステムの設計: 84%
2.0 実装/デプロイ: 80%
3.0 セキュリティ: 75%
4.0 トラブルシューティング: 100%

日頃運用でつかているからか、トラブルシューティングは100%とれたけど、自分でもわかっているがIAM周りの知識の無さが、セキュリティーの点数に出てしまったかなって気がする。

勉強方法

受験料が16,200円と、軽い気持ちで受けて落ちたとなったら結構ヘコむので、念のため事前に情報収集しました。
実際に試験を受けた人のブログをいくつか見て回った所、だいたい以下の様なことがされてました。

  • ワークショップの受講(有料)
  • 模擬試験を受ける(有料)
  • サンプル問題を解く
  • 各サービスの製品の詳細&よくある質問を読む
  • マイスターシリーズのスライドを見る
  • クラウドデザインパターンを読む
  • 書籍を読む(有料)

自分の場合は、いかに安くをモットーに、有料の物は見送りました。
ということで、やれることは、以下のものになります

  • サンプル問題を解く
  • 各サービスの製品の詳細&よくある質問を読む
  • マイスターシリーズのスライドを見る
  • クラウドデザインパターンを読む

・サンプル問題は、どんな感じの問題なのか雰囲気がつかめるし無料なのでぜひやっておくといいです。
http://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

・普段利用していても、サービスの細かい機能まで使っていないことが多いから、「製品の概要&よくある質問」はひと通り目を通しました。
https://aws.amazon.com/jp/documentation/

・マイスターシリーズとクラウドデザインパターンは、普段から見たりしているので特別なことはしませんでした。
http://aws.clouddesignpattern.org/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
http://www.slideshare.net/AmazonWebServicesJapan

プロフェッショナル

次のレベルはプロフェッショナルですが、サンプル問題を見るとAWSのサービスに関する知識よりも、もっと実践的な知識を必要とされているのがわかります。
http://aws.amazon.com/jp/certification/certified-solutions-architect-professional/

なかなか厳しいですね・・。
プロフェッショナルはまだいつ受けるか決めてませんが、さすがに模擬試験ぐらいは受けてみようと思いました。
自腹で受けて、落ちたら32,400円って金額はなかなかなものだしね。

JAWSDAYS2015に参加してきた

JAWSDAYSは今回で3度目の参加で、ボランティアスタッフとしては2度目となります。

初回は2013年の時で、セッションの案内とか受付をしてました。その当時だと、同時セッション数も4つぐらいでしたが、今回は倍に増えさらに、AWSかるた、AWS麻雀といった、様々なイベントが開催されていました。

今回お手伝いしたのは、Intel Edisonを使ったハンズオン
自分自身も興味を持って触っているEdisonのセッションということで、正直スタッフをキャンセルして普通に参加したいぐらいの盛り沢山なセッションでした。

事前準備としてhackday担当のスタッフと一緒に50台のEdisonのファームアップデートをやったり、当日はサポートで一日中張り付いていたので、他のセッションを見ることもなく、お弁当にもありつけず、なかなか忙しい感じでしたが、jawsdaysは楽しめました。
(来場者に配っていたAWSのアイコンのマグネットをもらい損ねたのが心残りではありますがw)

今回はPubCrawlも開催され、私はグループ2の会場に参加しました。
グループ2は以下の3社がスポンサーとなり、飲食しつつLTを楽しむ形となってました。
トレンドマイクロ株式会社
・レキサス
・アールスリーインスティテュート

それにしても、EdisonとAWSクラウド)の相性は良いですね。
認証にCognitoを使い、データの受取にはkinesis
データの分析にEC2を使い、データのストレージとしてS3を使う。
普通のWebサービスを公開するよりも多くのAWSサービスを駆使することを考えると、ものすごく面白い。

個人ではEdison breakout boardを使ってますが、手軽に楽しむなら確実に今回のhackdayで使ったIntel Edison Board for Aduino + Grove Starter Kit Plus がお勧めですね。

Edisonのファームアップデート

購入後にファームアップデートをしてからだいぶ経ったので、最新はどんなもんかとファームアップデートしてみました。

ちなみに現在のバージョン

root@edison:~# cat /etc/version
edison-weekly_build_68_2014_09_13-49-07

まずは、Supports & DownloadsからYocto complete image をダウンロードします。

EdisonとUSB(J3とJ16)でMacに接続します。
Macにマウントされるので、古いファイルをターミナルからコマンドを叩いて削除します。

rm -rf /Volumes/EDISON/*
rm -rf /Volumes/EDISON/\.*

パーティションを変更

(1パーティションを選ぶ)

ダウンロードして解凍したファイルをコピー

cp -r /Users/hoge/Downloads/edison-image-ww05-15/* /Volumes/EDISON/

Edisonにシリアルポート経由でつなぐ

screen /dev/cu.usbserial-A903C2MH 115200 -L

Edisonの再起動

reboot ota

これで、先ほどコピーしたファイルでファームのアップデートがされます。
再起動が終わってみてバージョンを確認してみると

root@edison:~# cat /etc/version
weekly-120
root@edison:~# uname -a
Linux edison 3.10.17-poky-edison+ #1 SMP PREEMPT Fri Jan 30 14:16:35 CET 2015 i686 GNU/Linux

バージョン表記がずいぶんさっぱりと・・。

初期化してしまったので、パスワードやらWi-Fiの設定が消えてしまっているので、設定をします。
前回は、configure_edisonと実行すると、Q&A形式で設定できたけど、その辺の仕様は変わったらしい。
引数で何を設定するか指定しないとダメなようだ。

root@edison:~# configure_edison
usage: configure_edison [-h] [--server]
                        [[--setup | --name | --password | --wifi]
                        [--showWiFiIP | --version | --latest-version | --upgrade | --disableOneTimeSetup | --enableOneTimeSetup | --flash <version> [<release name> ...]
                        | --flashFile <image-file> | --showNames]

optional arguments:
  -h, --help            show this help message and exit
  --server              Starts the server (testing only)
  --setup               Goes through changing the device name, password, and
                        wifi options
  --name                Changes the device name
  --password            Changes the device password
  --wifi                Changes the wifi options
  --showWiFiIP          IP address associated with the wireless interface
  --version             Gets the current firmware version
  --latest-version      Gets the latest firmware version
  --upgrade             Downloads the latest firmware
  --disableOneTimeSetup
                        Disable one-time setup and WiFi access point
  --enableOneTimeSetup  Enable one-time setup and WiFi access point
  --flash <version> [<release name> ...]
                        Downloads and flashes an image
  --flashFile <image-file>
                        Flashes the given image (.zip).
  --showNames           Show device name and SSID

--setupオプションを指定すると、ウィザード形式で登録出来ました。

root@edison:~# configure_edison --setup

Configure Edison: Device Password

Enter a new password (leave empty to abort)
This will be used to connect to the access point and login to the device.
Password:       *********
Please enter the password again:        *********
The device password has been changed.

First-time root password setup complete. Enabling SSH on WiFi interface.

Configure Edison: Device Name

Give this Edison a unique name.
This will be used for the access point SSID and mDNS address.
Make it at least five characters long (leave empty to skip): hoge_edison
Is hoge_edison correct? [Y or N]: y

Do you want to set up wifi? [Y or N]: y

Configure Edison: WiFi Connection

Scanning: 1 seconds left

0 :     Rescan for networks
1 :     Exit WiFi Setup
2 :     Manually input a hidden SSID
3 :     hoge
4 :     fuga
5 :     hogehoge
6 :     fugafuga
7 :     hogefuga
8 :     fugahoge


Enter 0 to rescan for networks.
Enter 1 to exit.
Enter 2 to input a hidden network SSID.
Enter a number between 3 to 9 to choose one of the listed network SSIDs: 
Is hogehoge correct? [Y or N]: Y
Password must be between 8 and 63 characters.
What is the network password?: 
Initiating connection to hogehoge. Please wait...
Attempting to enable network access, please check 'wpa_cli status' after a minute to confirm.
Done. Please connect your laptop or PC to the same network as this device and go to http://192.168.0.2 or http://hoge_edison.local in your browser.

これで無事ネットに繋がる

root@hoge_edison:~# curl -I http://yahoo.co.jp

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 07 Mar 2015 09:01:13 GMT
Content-Type: text/html
Connection: close
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Location: http://www.yahoo.co.jp/
Cache-Control: private
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN

gitなども消えてしまったので、インストールしていきます。
こちらのサイトでお勧めなパッケージリストが公開されているのでそれをありがたく使います
http://nonnoise.github.io/Edison/

curl http://nonnoise.github.io/Edison/_sources/Edison/base-feeds.conf -o /etc/opkg/base-feeds.conf
curl http://nonnoise.github.io/Edison/_sources/Edison/intel-iotdk.conf -o /etc/opkg/intel-iotdk.conf
curl http://nonnoise.github.io/Edison/_sources/Edison/mraa-upm.conf -o /etc/opkg/mraa-upm.conf

opkg update
opkg upgrade

gitを入れる

opkg install git

root@hoge_edison:~# git --version
git version 1.9.0

vimを入れる(結構時間かかった)

git clone https://github.com/b4winckler/vim.git
cd vim
./configure --with-features=huge
make
make install

bashを入れる

opkg install bash

root@hoge_edison:~# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash

bashをデフォルトにする

chsh -s /bin/bash

よく使うエイリアスを指定

vim .bashrc

alias ls='ls --color=auto'
alias ll='ls -la --color=auto'
alias rm='rm -i'
alias vi='vim'

ログインした時にbashrcが読み込まれるように

vim .bash_profile

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

aws-sdk for node.jsを入れる

npm install aws-sdk

これで、だいたい元に戻った。

CloudWatch Logsでログを気軽にチェックする

CloudWatch Logs使ってますか?
filter + カスタムメトリックスで簡単な監視を設定できるし、色々と便利ですよね。

アプリでエラーが発生した時も、カスタムメトリックスのアラートを使えば、通知もしてくれるので簡単な監視のシステムはこれでなんとかなる感じです。

しかし、アラートを検知してもそのログを一緒に通知してくれれば便利なんですが(Amazonさんお願いします!!)、原因を調べるためにSSHでサーバに入ってログを確認する必要があります。

けど、その都度サーバにログインして調べるのも、開発者にアカウントを発行してと言った設定も出てくるし、間違えて変なコマンドを実行されたら大変な事になります。

そこで、もっと気軽にログを見れる方法がないか考えてみたところ、CloudWatch Logsに送り込んでるログを見れるようにすれば、わざわざサーバにSSHしなくてもできるんじゃないかと思いました。

そんな訳で、スクリプトを書いた。
https://github.com/sparkgene/cloudwatch_logs_tail

使い方

オプション

% ruby tail_cwlog.rb --help

Usage: tail_cwlog [options]
        --use-iamrole                USE IAM ROLE
        --aws-region=[VALUE]         AWS REGION
        --aws-access-key=[VALUE]     AWS ACCESS KEY
        --aws-secret-key=[VALUE]     AWS SECRET KEY
        --discribe-groups            Describe log groups
        --discribe-streams           Describe log streams
        --tailf                      tail -f log stream
        --tail=[VALUE]               tail log stream
        --log-group=[VALUE]          log group name
        --log-stream=[VALUE]         log stream name

CloudWatch Logsに登録されているLog Groupの一覧表示

% ruby tail_cwlog.rb --aws-region=ap-northeast-1 --discribe-groups

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure

Log Groupに含まれているLog Streamの一覧取得

% ruby tail_cwlog.rb --aws-region=ap-northeast-1 --discribe-streams --log-group=/var/log/cron

server-apps-1
server-apps-2
server-apps-3

tail -100 みたいに過去のログを表示したい場合

% ruby tail_cwlog.rb --aws-region=ap-northeast-1 --log-group=/var/log/cron --log-stream=server-apps-3 --tail=100

Feb 21 01:22:01 server-apps-3 CROND[2837]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
Feb 21 01:23:01 server-apps-3 CROND[2863]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
Feb 21 01:24:01 server-apps-3 CROND[2890]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)

tail -fみたいにログを監視したい場合

% ruby tail_cwlog.rb --aws-region=ap-northeast-1 --log-group=/var/log/cron --log-stream=server-apps-3 --tailf

Feb 21 01:22:01 server-apps-3 CROND[2837]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
Feb 21 01:23:01 server-apps-3 CROND[2863]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
Feb 21 01:24:01 server-apps-3 CROND[2890]: (root) CMD (/var/awslogs/bin/awslogs-nanny.sh > /dev/null 2>&1)
    • tailf オプションでは、デフォルトで最後の20行を表示して、ログの監視を行います。

5秒に1回ログを見に行きますので、サーバからCloudWatch Logsにアップロードされ、手元に届くまでタイムラグがあります。
よりリアルタイムで監視したい場合は、

sleep(5)

となっている部分、調整して使ってください。

注意

CloudWatch Logsに格納されているデータをダウンロードする場合は、AWSの転送料及びAPI利用料がかかります。

http://aws.amazon.com/cloudwatch/pricing/

Amazon CloudWatch API Requests
$0.01 per 1,000 GetMetricStatistics, ListMetrics, or PutMetricData requests

Amazon CloudWatch Logs*
$0.50 per GB ingested**
$0.03 per GB archived per month***
Data Transfer OUT from CloudWatch Logs is priced equivalent to the “Data Transfer OUT from Amazon EC2 To” and “Data Transfer OUT from Amazon EC2 to Internet” tables on the EC2 Pricing Page(http://aws.amazon.com/ec2/pricing/).

ご利用は計画的に。