2.OSインストール後の設定

2.1. raspi-config による基本環境の設定

先ず、raspi-config で基本環境の設定を行います。
青色の入力、選択の手順に従って進めてください。
$ 行の先頭にあるのはコマンド実行を意味しますので、$ を除いてコマンドを実行してください。

$ sudo raspi-config
PI-15

1 Expand Filesystem

2 Change User password

You will now be asked to enter a new password for the pi user
Enter new UNIX password: passwd
Retype new UNIX password: passwd

4 Internationalisation Option

I1 Change Locale
Configuring locales
en_US.UTF-8
ja_JP.UTF-8 UTF-8
Default locale for the system environment:
en_US.UTF-8

I2 Change TImezone
Configuring tzdata
Asia
Time zone:
Tokyo

I3 Change Keyboard Layout
※ssh接続では以下表示されない場合あり。
Keyboard model:
Generic 101-key PC
Keyboard layout:
Other
Country of origin for the keyboard:
Japanese
Keyboard layout:
Japanese
Key to function as AltGr:
The default for the keyboard layout
Compose key:
No Compose Key
Use Control+Alt+Backspace to terminate the X server?
No

5 Enable Camera
Enable support for Raspberry Pi camera?
Disable

8 Advanced Options

A2 Hostname
任意な名前

A3 Memory Split
32
※私はX-Window(Windowsのようなグラフィカル画面)を使わないので、最少にとどめています。
※32~128の間で設定するのが良いでしょう。

A7 I2C
I2C kernel module will now be loaded by default
Yes
The ARM I2 C interface is enabled
Ok
Would you like the I2C kernel module to be loaded by default?
Yes
I2C kernel module will now be loaded by default
Ok

A8 Serial
Would you like a login shell to be accessible over serial?
Yes
Serial is now enabled
Ok

A0 Update
更新が始まりますので、終わるまで待ちます。

以上が終わったら、Finish します。

Linux の Windows Update にあたるソフトの更新を行います。

$ sudo apt-get update
$ sudo apt-get upgrade
双方とも終わるまで、しばらく時間を要します。
途中の質問にはすべて Y で答えます。

スワップ領域(メモリが不足する場合などに利用する)を設定します。

$ free
total used free shared buffers cached
Mem: 218420 56860 161560 0 10456 24908
-/+ buffers/cache: 21496 196924
Swap: 102396 0 102396

$ sudo /etc/init.d/dphys-swapfile stop

$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=1024

Raspberry Pi 2 B+ 以外は 512 に設定します。

$ sudo /etc/init.d/dphys-swapfile start

$ free
total used free shared buffers cached
Mem: 981920 79264 902656 0 11188 32920
-/+ buffers/cache: 35156 946764
Swap: 1048572 0 1048572

ネットワークは、以下の赤字のように固定IPに設定しておくと便利です。

 

$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
#allow-hotplug eth0
#iface eth0 inet manual
iface eth0 inet static
address 固定IPアドレス
netmask サブネットマスク
gateway デフォルトGWのIPアドレス

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

nano は、コマンドラインで簡単に使えるテキストエディタです。
以下を参考に操作を行ってください。

“nano”を終了する
http://www.obenri.com/_nano/close_nano.html

端末で使うテキストエディタ nano
https://sites.google.com/site/linuxnomemo/mint-use/nano

DNS は Goole提供のものを利用します。
インターネットのどのプロバイダーからでも利用でき、トラブルが少なく便利です。

$ sudo nano /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

$ sudo chattr +i /etc/resolv.conf

ここまで設定したら、一旦再起動します。

$ sudo reboot

2.2.時計の設定

センサなどを活用する場合、正確な時刻設定は重要です。
Raspberry Pi には内臓電池がなく、再起動などで時刻がずれ易く、インターネット先のntpサーバで、1時間に1回時計合わせを行うよう設定します。

$ sudo nano /etc/ntp.conf
(中略)
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst
pool ntp.nict.jp iburst
(中略)

$ sudo /etc/init.d/ntp restart

$ sudo ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntp-b3.nict.go. .NICT. 1 u 1 64 1 30.011 -12.760 2.490
ntp-a3.nict.go. .NICT. 1 u – 64 1 22.472 -12.338 0.282
ntp-b2.nict.go. .NICT. 1 u 1 64 1 34.106 -13.638 0.580
ntp-a2.nict.go. .NICT. 1 u – 64 1 19.484 -10.860 0.430

$ crontab -e
0 * * * * sudo ntpq -p

$ sudo nano /etc/rc.local
( exit 0 の直前に以下を追加)
ntpq -p

続きは 3.センサなどを使うための詳細設定 へ

 

 

広告

1.Raspberry Pi 初期設定

1.1.OSのインストール設定

OS には Raspberry Pi で一番メジャーな Rasbian Linux を選択します。

事前に8GB以上のSDカード(Model B と A の場合)か、microSDカード(Model B+, A+, 2 B+ の場合)を用意します。
データの転送速度が早いClass10のものを選択します。

NOOBS をダウンロードして Windowsのようにインストール方法もありますが時間がかかります。
OSのインストールされたイメージをSDカードに書き込むのが早道です。

以下のサイトよりZipファイルに圧縮されたOSイメージファイルをダウンロードします。
https://www.raspberrypi.org/downloads/
PI-00
あああ2015/06/17現在では、2015-05-05 更新分が最新でした。

ダウンロードしたZipファイルを解答し、SDカードに書き込みます。
但し、Windwsの場合は別途ソフトが必要です。
以下のリンク先から、簡単に使える DD for Windows を入手すると良いでしょう。
http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows
PI-09

SDカードをPCに差し込み後、上記ソフト起動する際は右クリックして、管理権限で実行します。
管理者権限がない場合は、対象ディスクのSDカードを認識しません。
PI-02

PI-03

ファイルの選択で、先ほどダウンロードして解答したイメージを選択します。
PI-04

「<< 書込 <<」 をクリックすると以下の3つの確認が表示されますが、全て「はい(Y)」で答えます。
PI-05

PI-06
PI-07
PI-08

以上で、OSイメージのSDカードへの書き込みが始まります。
PI-09

SDカードが準備できたら、いよいよ Raspberry Pi を起動します。
Raspberry_Pi_2_Model_B_v1.1_front_angle_new

配線他は以下のブロッグなどを参考にさせてもらうと良いでしょう。

Raspberry Pi に入門してみた。(tomk79さん)
http://qiita.com/tomk79/items/cdc1b88358afba2c6337

1.2.Raspberry Pi に接続する

Raspberry Pi HDMIかビデオ端子につなぎ、USBキーボードを接続すると、ログイン画面が表示されます。
私の場合その作業が面倒なので、LANケーブルをつないで、Windows では TeraTerm、Macのターミナルでssh接続して作業を行います。
Raspberry Pi のLANの初期設定はDHCPなので、割り当てIPを調べる必要があります。
画面をモニタで表示すると、そちらでも確認できますが、私は以下のソフトを利用してDHCPで割り当てられたIPアドレスを確認しています。

LanScan(Mac)
https://itunes.apple.com/jp/app/lanscan/id472226235?mt=12

Advanced IP Scanner(Windows)
http://www.forest.impress.co.jp/library/software/advipscanner/

NetEnum(Windows)
http://www.forest.impress.co.jp/library/software/netenum/

Windows の TeraTerm については以下を参照ください。

Tera Termのインストール
http://webkaru.net/linux/tera-term-install/

パスワード認証によるSSH接続
http://webkaru.net/linux/tera-term-ssh-login/

以下、Tera Termの接続例です。
初期ユーザは pi パスワードは raspberry です。
PI-12

最初の1回目だけ、この画面が出ます。
PI-11

Raspberry Pi にssh接続ができました。
PI-13

最初に、 sudo raspi-config コマンドを実行して、パスワード変更などOSの設定を行います。
PI-14

グラフィックでないですが、矢印キーで簡単に操作できます。
PI-15

Macの場合はターミナルで以下のコマンドを実行し、パスワードを入力すると接続できます。

ssh pi@IPアドレス

続きは 2.OSインストール後の設定 へ

AWSとRaspberry Pi でIoT入門 (第9回JAWS-UG佐賀)

- Raspberry Pi で農業(施設園芸)用センサ、クラウド環境分析システム構築入門 -

JAWS-UG佐賀で上記内容で話をさせて頂きました。
理論中心の座学だけでなく、実践を見て頂きたくも仕事の本番環境は全て公開できません。
そこで、新しいセンサを評価がてら、実際の機器、作業で、センサによる値の計測から、クラウドAWSでのデータ保管、グラフによるデータ解析を行う一連のデモシステムを作成しました。

折角のご縁で、時間を頂いて話を聞きに来られた訳ですので、少しでもお役に立ちたく思います。
そこで、興味のある方に是非「ダイブ」(実際に試)して頂くための、デモシステムを構築した記録を以下にまとめました。
是非、ご参照ください。

以下で紹介するプログラムのソースコードは以下に公開しています。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo

1.Raspberry Pi 初期設定
https://yukataoka.wordpress.com/2015/06/20/raspi01/

2.OSインストール後の設定
https://yukataoka.wordpress.com/2015/06/20/raspi02/

3.センサなどを使うための詳細設定
https://yukataoka.wordpress.com/2015/06/20/raspi03/

4.センサの設定とプログラミング
https://yukataoka.wordpress.com/2015/06/20/raspi04/

5.センサ値をクラウドに保管・表示
https://yukataoka.wordpress.com/2015/06/20/raspi05/

6.S3静的htmlのJavaScriptでグラフ表示
https://yukataoka.wordpress.com/2015/06/20/raspi06/

当日のスライド。
(後日公開予定)

実際のWebコンテンツ
http://s.ykata.net/

AWS麻雀のCDP:Stack Deploymentパターン

JAWS-DAYS 2015 AWS麻雀体験企画
– AWS麻雀のCDP役を理解する –

7.Stack Deploymentパターンを実践理解する

AWS麻雀CDP役(AWS OpsWorks Or Elastic Beanstalk Or AWS CloudFormation Or AWS CodeDeploy{発 扱い}+ コンピュート、データベース、ネットワークのいずれか2牌)
00

今回のStack Deploymentパターンは、AWSの利用環境を、予め設定した内容で自動構築し、簡単にコンテンツ更新を行えるパターンです。

システム開発や運用保守の段階では、試験環境を準備して、結果が問題ないと確認したうえで本番環境に適用します。
しかしながら、試験環境の設定、コンテンツを本番に適用する作業を手で行うと、ヒューマンエラーなどのトラブルが懸念されます。

そこで、あらかじめ試験環境構築を設定ファイル(テンプレート)で定義し、その通り実施する事で、本番環境構築を安全かつ容易に行えるようにします。
また、コンテンツを簡単にデプロィ(本番環境に展開)可能なうえ、バージョン管理を実施できる手法を試してみます。

具体的には Elastic Beanstalk を利用して、簡単にWebサービス用PHP開発環境を構築します。
続いて、自動で作成された構成である、EC2(Webサーバ)や、ロードバランサー、AutoScallingの設定を確認してみます。
そして、このような Elastic Beanstalk で指定した自動構成を実施する定義情報がある AWS CloudFormation の中身を少し紹介します。

参考情報は以下です。

AWS Elastic Beanstalkで環境構築自動化(supertaihei02 さん)
http://qiita.com/supertaihei02/items/b2373890b7e739ded318

Elastic Beanstalk 開発、テスト、デプロイ
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_PHP_eb.sdlc.html

AWS Elastic BeanstalkへGitでデプロイする方法(YoshikiNakamura さん)
http://qiita.com/YoshikiNakamura/items/55525fa0b17e74c25ceb

ZipファイルでElastic Beanstalkにデプロイ(サーバワークス CSチーム かわむら さん)
http://blog.serverworks.co.jp/tech/2012/09/28/elastic-beanstalk_deploy_zip/

 1. Elastic Beanstalk でWebサービス用PHP開発環境を構築

先ずは Elastic Beanstalk でWeb サービス用PHP開発環境を構築します。

管理コンソールで Elastic Beanstalk の画面を開きます。
02

実は最初の画面で、PHPを選択して 「Lunch Now」だけでも基本的な環境は作れてしまいます!
急いでいる方は、 「Lunch Now」が終わるのを待って、 2.コンテンツのデプロイ から参照ください。
さすがにこちらでは少し解説しないと内容を知る事にはなりませんので、 「create a new application」 で内容を確認しながら進めます。
03
残念ながら Elastic Beanstalk の画面は日本語化が間に合っていませんね。

Application name と Discription を入力し、次に進みます。
04

Web Server Environment を選びます。
05

今回は Permissions (権限)はそのまま次へ。
06
詳細が気になる方は、以下を参照ください。
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.iam.roles.aeb.tiers.web.html

platform は PHP、Environment(環境) Type は折角なので、Single instance(単独サーバ環境)より、Load Balancing, Auto Scaling で、インスタンス(サーバ)がダウンしても自動で復旧し、過負荷時にサーバ自動で追加起動する設定にしてみます。
07

最初の application version はサンプルを利用します。
Deployment Limits はどれだけのサーバ数を確保するというような設定と考えると良いでしょう。
今回は試験なので、Fixed でとりあえずインスタンス(サーバ)1台以上をキープの設定に変更してみます。
08
詳細が気になる方は、以下を参照ください。
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html

Environment(環境)名と、URLを入力します。

すでにある名前は使えないので、Check availability で確認しましょう!
09

MySQLなどのRDMSを利用する場合は、RDSの設定をチェックします。
VPC( Virtual Private Cloud)の環境を使う場合は、VPCの設定をチェックします。
今回は使う予定がないので、そのまま次に進みます。
10

詳細の設定で、Instance type は無償試用対応インスタンスでパフォーマンスの良い t2.micro を選択し、EC2 key pair は既存のものがあれば選択します。
その他は初期値のままで良いでしょう。(後から変更も可能です。)
10-1
11

Environment(環境) Tag も設定できますが、今回は試すだけなのでパスします。
12

最後に設定の確認画面が表示されますので、Launch (構築)します。
13

14

構築中は半円の矢印がくるくる回っています。
しばらくコーヒーを味わえるぐらいの時間がかかります。
15

無事環境が構築されたら、緑丸の表示がでます。
Recent event でも確認できます。
さらに Show All で詳細を確認できます。
16

詳細を確認したら、URLのリンクをクリックしてみます。
17

初期コンテンツとして用意されているのはこのページです。
18

以上で、環境構築は完了です。

2.新しいコンテンツをデプロイ(展開)してみる

環境を構築しましたが、まだ実際のコンテンツが表示されている訳ではありません。
とりあえず、以下のサイトの無料テンプレートでコンテンツのデプロイ(展開)を試してみます。

Cafi Net カフィネット 無料テンプレート 73/5ページ/スライドショー
http://japanism.info/free-template.html

先ずは以下のような構成でコンテンツを圧縮したZipファイルを作成します。
20-1

Upload and Deploy で作業を開始します。
19

先ほどのZipファイルを選択し、デプロイします。
20

以下のように、再度作業中の画面が表示されます。
21

Running Version が変わり、Recent Events に Deploying new version の記述が追加されます。
22

再表示すると、入れ替わったコンテンツが確認できます。
23

ただ、これではPHPが動くかどうか確認できません。
そこで、livedoor天気予報のAPIを利用したコンテンツと、定番の phpinfo() を確認するファイルを追加して、デプロイしてみます。

livedoor天気予報 Weather Hacks
http://weather.livedoor.com/weather_hacks/

test.php

<?php
    $point = "390010";
    $url   = "http://weather.livedoor.com/forecast/webservice/json/v1?city=".$point;
    $json  = file_get_contents($url, true);
    $json  = json_decode($json, true);
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Stack Deploymentパターン</title>
</head>

<body>
<h2>Stack Deploymentパターン</h2>
<p>Elastic Beanstalk に デプロイするコンテンツ試験!</p>
<p>今回は livedoor天気情報 Wether Hacks <a href="http://weather.livedoor.com/weather_hacks/" target="_blank">http://weather.livedoor.com/weather_hacks/</a> のAPIをPHPで使った例にしてみました。</p>

<table border="1">

<tr><th colspan="2">
<a href="<?php echo $json['description']['text']; ?>" target="_blank"><?php echo $json['title']; ?></a>
</th></tr>
<tr><td colspan="2">
<?php echo $json['description']['text']; ?><br />
<a href="<?php echo $json['description']['text']; ?>" target="_blank"></a>
</td></tr>

<?php
foreach($json['forecasts'] as $value){
    echo "<tr>";
    echo "<td>".$value['dateLabel']."(".$value['date'].")</td>";
    echo "<td>";
    echo "<image src=\"".$value['image']['url']."\" />".$value['image']['title']."<br />";
    if($value['temperature']['min'] != "NULL") echo "最低気温".$value['temperature']['min']['celsius']."度 ";
    if($value['temperature']['max'] != "NULL") echo "最低気温".$value['temperature']['max']['celsius']."度 ";
    echo "</td>";
    echo "</tr>\n";
}
?>

<tr>
<td>高知その他のポイント</td>
<td>
<?php
foreach($json['pinpointLocations'] as $value){
    echo "<a href=\"".$value['link']."\" target=\"_blank\">".$value['name']."</a><br />";
}
?>
</td>
</tr>

<tr>
<td>提供時点</td>
<td><?php echo str_replace("T"," ",$json['publicTime']); ?></td>
</tr>

<tr>
<td>API提供先</td>
<td><a href="<?php echo $json['copyright']['link']; ?>" target="_blank"><?php echo $json['copyright']['image']['title']; ?></a></td>
</tr>

</table>

</body>
</html>
?>

info.php

<?php
phpinfo();
?>

先のZipファイルに、このPHPプログラムの2ファイルを追加します。
24

Zipファイルを選択し、デプロイします。
25

デプロイが完了したら、表示してみます。

URL/info.php
26

URL/test.php
27
PHPのプログラムがしっかり動いてます!

 3.自動で設定された環境を確認する

自動で設定された環境を確認してみます。

先ずは、EC2関連の設定を確認します。
30

インスタンス(サーバ)が稼働しているのが確認できます。
31

セキュリティグループの設定が追加されています。
32

ロードバランサー(アクセスを複数サーバに振り分ける装置)も設定されています。
33

ロードバランサー(アクセスを複数サーバに振り分ける装置)も設定されています。
34

Auto Scalling 関連の設定もされています。
35
36

ボリューム(サーバのハードディスク)は以下です。
37

続いて、状況を監視する CloudWatch の設定を確認します。
40

アラームが設定されています。
この設定をもとにAuto Scalling などが実施されます。
41

続いて、ログ(記録)などが保管される、S3(ストレージ)を確認します。
45

バケット(保管容器)が追加されています。
46

バケットの中身を確認すると、デプロイしたZipファイルの各バージョンのファイルが保管されているのが確認できます。
47

最後に、AWSのリソース(利用環境)を構成する設定がある、CloudFormationを確認します。
50

Stackと呼ばれる定義が作成されています。
51

Resourcesで構成した内容を確認します。
52

Templateで実際作成された定義を確認してみます。
53
これだけ長い定義記述を自動で作成している事が確認できます。
解読するためインデントを整理するのも大変な量です。

 4.構築した環境の動作を確認する

本当に構成された環境がうまく動いているのか、確認してみます。

インスタンス(サーバ)を削除してみます。
61

62

しばらく待つと、自動で新しいインスタンス(サーバ)が構築されています。
63

Elastic Beanstalk の画面でも確認します。
64

Recent Events でも確認できます。
65

66

5.設定変更の注意

過去 Elastic Beanstalk で設定した内容の変更、削除は必ずElastic Beanstalkの画面で行いましょう。
無視すると、思わぬトラブルに見舞われます。(過去の経験談)

Applicationを選択します。
64

Configuration を選びます。
71

変更をしたい部分の歯車マークをクリックします。
今回、Instances をクリックしてみます。
72

 

以下の変更画面が表示されます。
73
以下のサイトなどを参考にして、変更します。
さすがに、設定変更は専門の知識がないと厳しいでしょう。

インスタンス
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.managing.ec2.html

Elastic Beanstalk 全般
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html

6.Gitによるデプロイなど

Gitによるデプロイや、PHPフレームワークのfuelphpを使う場合などは、私の過去の記事を覗いてみてください。

Windows環境で Elastic Beanstalk を使ってデプロイ(アプリ更新)
Elastic Beanstalk でFuel PHPをデプロイ
Elastic Beanstalk で RDS(MySQL)を使う
Elastic Beanstalk の RDS を FuelPHP から利用

さらに詳しい内容を知りたい方は以下が参考になるでしょう!

CloudFormationで環境構築を自動化する(竹永篤史 さん)
http://www.atmarkit.co.jp/ait/articles/1408/25/news014.html

AWS CloudFormation サービスサンプルテンプレート
http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/sample-templates-services-us-west-2.html

AWS Elastic Beanstalkの(多分)最速設定(soramugi さん)
http://qiita.com/soramugi/items/1258127d159703fe731d

ElasticBeanstalkのログ保存方法(今岡久敏 さん)
http://blog.cloudpack.jp/2015/01/28/how-to-store-log-of-elasticbeanstalk/

Elastic BeanstalkでWordPressをインストールしてみました(サーバワークス CSチーム かわむら さん)
http://blog.serverworks.co.jp/tech/2012/06/29/elastic-beanstalk_wordpress_install/

Elastic Beanstalk アプリケーションソースバンドルを作成する
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.deployment.source.html

AWS麻雀のCDP:Job Observerパターン

JAWS-DAYS 2015 AWS麻雀体験企画
– AWS麻雀のCDP役を理解する –

5.Job Observerパターンを実践・理解する

AWS麻雀CDP役(1〜4ECU+7ECU+1〜SQS{中扱い})
01

今回のJob Observerパターンは、SQSのキュー(処理待ちリクエストなど、一時的な保管データ)と、CloudWatchというリソース情報管理する機能を利用します。
SQS内の処理待ちリクエストが一定量を超えてないかCloudWatchで監視し、超えた時点でAuto Scaling機能で、EC2のインスタンス(サーバ)を追加起動します。
これにより、バッチ処理(Webと違い、計算などの処理を黙々と行うこと)を行うサーバを自動で増減し効率良く処理する事ができます。

例えば、バックグラウンドで実施している動画のサムネイル画像作成処理などで、サムネイル作成指示用SQSのキューが増分した場合、自動で処理サーバを増やす事で一定の処理パフォーマンスを保つができるようになります。

今回はとりあえずt2.microEC2インスタンス(サーバ)と、AMI(サーバイメージ)を作成して、SQS内のキューをコンソールより追加して試してみます。
SQSのキューが5個を超えた時点でサーバの負荷大になると想定し、新しいインスタンス(サーバ)が追加されるよう設定し、処理が実施されるか試したいと思います。

参考情報は以下です。

Amazon SQS との組み合わせで素早く Auto Scaling
http://aws.typepad.com/aws_japan/2015/01/auto-scaling-with-sqs.html

“SQS”と”CloudWatch”と”Auto Scaling”(スズキさん)
http://blog.suz-lab.com/2011/06/sqscloudwatchauto-scaling.html

Amazon SQSとCloudWatchによる高速AutoScaling(横田あかりさん)
http://dev.classmethod.jp/cloud/amazon-sqs-cloudwatch-rapid-autoscaling/

Amazon SQS のディメンションおよびメトリックス
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/sqs-metricscollected.html
先ずは好きなインスタンスで、サーバを立ち上げます。
今回は、Amazon Linux AMI 2015.03 (HVM) t2.micro を利用します。

余談ですが、今回から管理コンソールが日本語化表示です!
00

 

1.EC2のイメージ作成

今回は、バッチジョブと呼ばれる裏方作業のサーバをEC2で起動します。
但し、実際のバッチジョブのアプリ実装は大変ですので、あくまでサーバの起動までを試します。

管理コンソールでEC2の画面を表示します。
00A

インスタンスの作成を行います。
02

Amazon Linux AMI を選択します。
03

t2.micro を選択します。(試して課金はさけたいところ、くれぐれもお間違いなく!)
04

作成 します。
05

既存のキーペアーを選択するか、新しく指定して インスタンスを作成します。
06

以上で、新しいインスタンスが作成。
07

作成したインスタンスのイメージ(AMI)を作成します。
これはSQSの処理待ちキューが増えた場合に、サーバ(インスタンス)を増やす場合の元イメージになります。
本来はシステムを構築したインスタンスのイメージを使います。
が、今回は動きを確認するだけで、Amazon Linux AMI をそのまま使います。
08

インスタンス行の上で 右クリックで、イメージ、イメージの作成 を選択します。
09

イメージ名、説明を適当に設定し イメージの作成をします。
10

 

イメージ(AMI)が完成します。
11

作成したイメージ(AMI)を確認します。
12

 

2.SQSの設定

今回はSQSの処理待ちキューの数が一定量を超える事で、バッチ処理サーバを増やす想定です。
このSQSは、バッチ処理サーバとは別に、業務サーバや、Webサーバなどよりバックグラウンドで行う処理の指示と関連する情報を保管します。
バッチ処理サーバは、このSQSに蓄積されたキューの処理指示に従い、裏方処理を実施します。
SQSは複数のバッチ処理サーバからのアクセスを考慮した処理も実装可能です。

処理待ちを管理するのSQSのキューを作成します。
00B

 

新しいキューの作成 を行います。
13

キュー名、キューの設定 を行います。可視性、メッセージの消滅は短めに設定しました。
キューの作成 をします。
14

キューが出来上がりました。
キューの試験用データは他の設定完了後に行います。
15

 

3.AutoScallingの設定

SQSのキューが閾値を超えた際にバッチ処理サーバを増やします。
これはコンソールのEC2内にある、AutoScalling という機能を利用します。
AutoScalling は今回の例の他に、AWSのロードバランサーと組み合わせて、自動スケールアウト・無停止Webサーバの設定などによく用いられます。

Auto Scalling グループの作成 を行います。
16

起動設定の作成 を行います。
17

マイAMI を選択します。
18

先に作ったイメージ(AMI)を選択します。
19

t2.micro を選択します。(試して課金はさけたいところ、くれぐれもお間違いなく!)
次の手順 に進みます。
20

起動設定を作成します。
名前 を設定し、確認画面にスキップ します。
21

起動設定の作成 を行います。
22

先のEC2のインスタンス作成と同じ設定にします。
23

グループ名 の設定、サブネット を選択します。
次の手順 に進みます。
24

スケーリング範囲を 1 および 2 に設定します。
本来範囲は処理量に応じて設定しますが、今回は試験なので1台の増分で止めます。
名称 、アクションを設定します。
アクションは、今回は試験なので1インスタンス(サーバ)づつ追加にしています。
確認 します。
25

AutoScalling グループの作成 を行います。
26

作成されました。
27

以下のように表示されます。
28

 

4.CloudWatchの設定

CloudWatchはAWSの各サービスの状況を監視し、アラームによる通知・処理などを行います。
その他のサービスと連携し、今回のようなSQSのキュー数の閾値によるインスタンス(サーバ)起動なども行えます。

SQSのキュー数を監視するためのCloudWatchのアラームを作成します。
00C

アラームの作成 を行います。
29

SQSメトリックス を選択します。
30

ApproximateNumberOfMessagesVisible をチェックし、次へ 進みます。
ApproximateNumberOfMessagesVisible はSQS内の有効なキューの数です。
31

名前、説明 を設定します。
ApproximateNumberOfMessagesVisible の値が5以上でアクションを実施するよう設定します。
通知 アクションを削除し、Auto Scalling アクション を追加します。
32


追加した アクション に、アラーム 警告 を選択します。
グループ他には、先に設定した Auto Scalling の設定を選択し、アラームの作成 を行います。

33

作成されたばかりの状態です。
34
以上で設定は終わりです。

 

5.試験の実施

設定が完了しましたが、SQSにキューを登録しない限りインスタンス(サーバ)の数はそのままです。
SQSにデータを5件登録、そして削除した場合のインスタンス(サーバ)の数を確認してみます。

EC2のインスタンスの画面で、稼働しているのは先に作成したインスタンス(サーバ)1個のみです。
40

SQSの画面でキューのメッセージを追加(メッセージの送信)します。
41

5件ほど適当なメッセージを入れて、メッセージの送信 します。
42

43

メッセージの表示 で確認します。
44

メッセージのポーリングを開始します。
45

キュー内に5件のメッセージがあります。
46

CloudWatchの画面で、早速 アラーム が発生しています!
47

最初EC2のインスタンス(サーバ)画面に戻って、起動数が変わらず、、、。
先の赤書きの部分を間違えて設定して、、、最大数を2に変更しました。
48

EC2の画面で、もう1つ同じイメージ(AMI)のインスタンス(サーバ)が起動し始めました。
49

ステータスチェックも合格し、無事起動です!
50

では、意地悪くインスタンス(サーバ)のトラブルを想定し、起動したインスタンス(サーバ)を削除してみます。
51

52

terminatedとは削除された状態で、削除されています!
53

少し待つと、再度アラームの処理で、新しいインスタンス(サーバ)が起動を始めます!
54

これは サーバ管理者の眠れない夜! 撲滅に効果大ですね!(^^)v

では、SQSのキュー内のメッセージを削除してみます。
55

56

SQSキュー内のメッセージが4個になりました。
57

SQSのアラートが消えて正常になっています!
58

EC2のインスタンス(サーバ)が自動で削除(terminated)されています!
59

今回のCDPパターンは地味ですが、この機能は
・ソフト会社で基幹系システムのSI屋さん
・Webサービスでバックグランド処理をかかえるIT屋さん
などには必須の機能ですね!

このブロッグでは触りの部分のみ紹介しましたが、もっと突き詰めて設定すると素晴らしいパフォーマンスの停止しないシステムを構築可能でしょう!!

JAWS-DAYS 2015 AWS麻雀体験企画 に戻る

Edisonでセンサ値をAmazon Kinesisに上げてみた

Edison に接続したセンサ値を Amazon Kinesis にUPする手順を試してみました。

0.動機

JAWS-DAYS 2015 HackDay は参加できずに斜め見程度で残念に思ってました。
http://jawsdays2015.jaws-ug.jp/timetable/about_hackday/

ですが、その後気づいたのが KenTamagawa さんの素晴らしいブロッグ!

Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【前編】
http://qiita.com/KenTamagawa/items/3f2e2bd3bb36a27dc439

Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【後編】
http://qiita.com/KenTamagawa/items/b5bc103ab84761281112

ちょうど必要となり2台目のエジソンを購入しました。
一応、楽しむためだけに買ったのではないであしからず。(汗)

11149484_874564905933098_524984166140834136_n (1)

そりゃ届いたからには一通り触らにゃいかん!
という性格で、先ずは同じ手順をやってみることにしました。

1.OSの設定

前のブロッグ記事(これ)なども振り返りながら、先ず Yoct Linux を設定。

今回は自宅の Windows 7 のTraTermで接続してみます。

起動した接続画面を閉じて、シリアルポートを開きます。
IoT_Ed-01

ボート・レートを 115200 に変更するだけでコンソール画面を表示します。
IoT_Ed-02

以下のログイン画面が表示されます。
最初は root でパスワード無しでログインできます。
IoT_Ed-03

2.自分の環境設定

先ずは configure_edison でパスワード、無線LANの設定します。
この説明はKenTamagawa さんのブロッグか、私の過去の記事などをご参照ください。

ネットに繋がったら先ず現在のパッケージソフトを最新のものに更新します。
普段はパッケージソフトの管理は、yum、apt-get を使いますが、Yoct Linux は opkg というパッケージ管理ソフトを使います。
しかしながら初期設定がされていませんので、viエディタで以下のファイルを作成します。

vi /etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

vi /etc/opkg/intel-iotdk.conf
src intel-all http://iotdk.intel.com/repos/1.1/iotdk/all
src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src intel-quark http://iotdk.intel.com/repos/1.1/iotdk/quark
src intel-i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src intel-x86 http://iotdk.intel.com/repos/1.1/iotdk/x86

上記が終わったら、apt-get と同じように update を行います。

opkg update
opkg upgrade

ネット環境が良いと、処理速度が速いのでそんなに待たされません。
私は個人的に vi エディタの代わりに nano を使いますのでインストールします。

opkg install nano

その他、パッケージはそこそこ準備されているようですので、お好みの環境を整えると良いでしょう。

3.センサデータをJavaScriptで取得

いよいよ、KenTamagawa さんのブロッグの手順に従い、Edison に mraa  をインストールします。
mraa の詳細については玉川さんのブロッグか以下のリンクをご参照ください。

intel-iot-devkit/mraa
https://github.com/intel-iot-devkit/mraa/tree/master/examples/javascript

nano /etc/opkg/mraa-upm.conf
src mraa-upm http://iotdk.intel.com/repos/1.1/intelgalactic

opkg update
opkg upgrade

以上で、mraa の準備が完了します。

全く同じでは芸がない、という事で玉川さんの例を以下にしてみました。

nano readIO2.js

var m = require('mraa'); //require mraa

var B=3975*4; //B value of the thermistor
var S=100; //C value for which the LED should turn on.

//setup access analog inpuput pin 0, 1
var analogPin0 = new m.Aio(0);
var analogPin1 = new m.Aio(1);

var digitalPin = new m.Gpio(8);
digitalPin.dir(m.DIR_OUT);

//read the value of the analog pin
var analogValue0 = analogPin0.read();
var analogValue1 = analogPin1.read();

//light
var analogValue10 = (1023-analogValue0)*10/analogValue0;
analogValue10 = (10000 / Math.pow(analogValue10*10,4/3))*200;
analogValue10 = Math.round(analogValue10)/10;
console.log("light: " + analogValue0 + " => " + analogValue10);

//LED
if(analogValue10 < S){
  digitalPin.write(1);
}else{
  digitalPin.write(0);
}

//temperature
analogValue1b = (1023-analogValue1)*10000/analogValue1;
var analogValue11 = (1/(Math.log(analogValue1b/10000)/B+1/298.15)-273.15)*10;
analogValue11 = Math.round(analogValue11)/10;
console.log("temperature: " + analogValue1 + " => " + analogValue11);

過去 Raspberry Pi でGroveのセンサを使った事がありましたので以下のリンクを参照しました。
温度、照度の計測に、照度がある程度下がったたLEDを点灯するロジックも追加しています。

seeed Main Page
http://www.seeedstudio.com/wiki/index.php?title=Main_Page#Grove

Grove – Light Sensor
http://www.seeedstudio.com/wiki/Grove_-_Light_Sensor
https://github.com/spaniakos/LightSensor/blob/master/LightSensor.cpp

照度と明るさの目安
http://photon.sci-museum.kita.osaka.jp/publish/text/koyomi/66.html

Grove – Temperature Sensor
http://www.seeedstudio.com/wiki/Grove_-_Temperature_Sensor
https://github.com/Seeed-Studio/Grove_Temperature_Sensor/blob/master/Temperature_Sensor.ino

照度LUX値は上記リンクから、以下をJavaScriptに変換したら良い筈でした。

sensorValueはセンサからの取得値。
Rensor = ( (float) (1023 – sensorValue) * 10.0f / (float) sensorValue);
LUX = round(10000.0f / (float) pow((Rensor*10.0f),(4.0f/3.0f)));

ですが Raspberry Pi で同じセンサで取得した値と異なり、照度と明るさの目安からもおかしい値が表示されます。
苦肉の策として、LUX値*200 で室内レベルではそこそこましになってきました。
浮動小数点の精度誤差としてもあり得ないように感じましたので、不思議です。
後日時間がある時に mraa の中身や、PDFのセンサスペックを覗いてみようと思います。

温度も同じく、以下をJavaScriptに変換したら良い筈でした。

aはセンサからの取得値。
int
B=3975;
resistance=(float)(1023-a)*10000/a;
temperature=1/(log(resistance/10000)/B+1/298.15)-273.15;

結果がおかしくて Raspberry Pi で計測している温度(検証済)と異なります。
ですが実際は B=3975*4 でやっと近似値になりました。

node.js は初体験ですので、根本を理解できてないミスかもしれないですが、不思議です。

原因はいずれ解明します。

20150417_000012

4.アクセス認証を準備

KenTamagawa さんの例に従い Kinesis へ PUT する再は Cognito のデバイスからの特定のリソースへのアクセスを認証を使います。

最初に Cognito の Indentity Pool を作成します。
こちらも KenTamagawa さんの以下のブロッグを参考に行ってみてください。

Amazon CognitoをJavaScriptから使ってみる

http://qiita.com/KenTamagawa/items/36238d6264ee14c2b50f

作成した IdentityPoolId  を控えます。

Cognitoのゲストアクセスができるか試すため、KenTamagawa さんに習って以下のコードを作成。

AccountId => 2XXXXXXX3
Pool mame => iot_hack
IdentityPoolId => 8XXXXXXXXXXXXXXXXXXXXXXXX9
npm install aws-sdk
nano cognito.js
var AWS = require('aws-sdk');

var awsRegion = "us-east-1";
var cognitoParams = {
  AccountId: "2XXXXXXXXXX3";,
  RoleArn: "arn:aws:iam::2XXXXXXXXX3:role/Cognito_iot_hackUnauth_DefaultRole",
  IdentityPoolId: "us-east-1:8XXXXXXXXXXXXXXXXXXXXXXXX9";
};

AWS.config.region = awsRegion;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
AWS.config.credentials.get(function(err) {
  if (!err) {
    console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
  }
});

実際に上記コードを実行すると、以下のCognito Identityが取れた様子が分かります。

node cognito.js
Cognito Identity Id: us-east-1:f041a697-a29d-49be-a986-XXXXXXXXX

5.センサデータをKinesisへPUT

Amazon Kinesis のストリーム作成は KenTamagawa さんのブロッグを参考に行ってみてください。

プログラムは以下のようにしてみました。

nano kinesis3.js

var m = require('mraa'); //require mraa

var B=3975*4; //B value of the thermistor
var S=100; //S value for which the LED should turn on.

var AWS = require('aws-sdk');
var deviceId = "Edison";
var streamName = 'iot_hack_edison_sensordata'; // Kinesis stream
var partitionKey = "xyz"; // Kinesis partitionKey

// Congito setting
var awsRegion = "us-east-1";
var cognitoParams = {
  AccountId: "2XXXXXXXXXX3";,
  RoleArn: "arn:aws:iam::2XXXXXXXXXX3:role/Cognito_iot_hackUnauth_DefaultRole";,
  IdentityPoolId: "us-east-1:8XXXXXXXXXXXXXXXXXXXXXXXXXXXX9";
};

//setup access analog inpuput pin
var analogPin0 = new m.Aio(0);
var analogPin1 = new m.Aio(1);

var digitalPin = new m.Gpio(8);
digitalPin.dir(m.DIR_OUT);

// Get identity from Amazon Cognito
AWS.config.region = awsRegion;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
AWS.config.credentials.get(function(err) {
  if (!err) {
    console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
  }
});

// Put data into Kinesis
var kinesis = new AWS.Kinesis();

setInterval(periodicActivity, 1000);

function periodicActivity() {
  var analogValue0 = analogPin0.read();
  var analogValue1 = analogPin1.read();

  //light
  var analogValue10 = (1023-analogValue0)*10/analogValue0;
  analogValue10 = (10000 / Math.pow(analogValue10*10,4/3))*200;
  analogValue10 = Math.round(analogValue10)/10;
  console.log("light: " + analogValue0 + " => " + analogValue10);

  //LED
  if(analogValue10 < S){
    digitalPin.write(1);
  }else{
    digitalPin.write(0);
  }

  //temperature
  analogValue1b = (1023-analogValue1)*10000/analogValue1;
  var analogValue11 = (1/(Math.log(analogValue1b/10000)/B+1/298.15)-273.15)*10;
  analogValue11 = Math.round(analogValue11)/10;
  console.log("temperature: " + analogValue1 + " => " + analogValue11);

  var json = {
    device_id: deviceId,
    time: (new Date).getTime(),
    sensors: [{
      sensordata: {
        temp: analogValue10,
        lux : analogValue11,
      }
    }]
  };
  var kparams = {
    Data: JSON.stringify(json),
    PartitionKey: partitionKey,
    StreamName: streamName
  };

  kinesis.putRecord(kparams, function(err, data) {
    if (err) {
      console.log(err, err.stack);
    } else {
      console.log(data);
    }
  });
}

実行すると以下の結果となりました。

node kinesis3.js
light: 445 => 304
temperature: 351 => 21.4
light: 477 => 359.9
temperature: 348 => 21.3
light: 479 => 363.6
temperature: 352 => 21.4
Cognito Identity Id: us-east-1:2b10dc1b-f1f4-4779-9d49-0492e73a5a57
light: 481 => 367.5
temperature: 349 => 21.4
light: 482 => 369.4
temperature: 350 => 21.4
{ SequenceNumber: ‘49549802611433803905821669191073794678384151765993914370’,
ShardId: ‘shardId-000000000000’ }
{ SequenceNumber: ‘49549802611433803905821669191075003604203766395168620546’,
ShardId: ‘shardId-000000000000’ }
{ SequenceNumber: ‘49549802611433803905821669191076212530023381024343326722’,
ShardId: ‘shardId-000000000000’ }

SequenceNumber を取得できていますので、無事 Kinesis に Put できたようです。

6.KinesisへPUTされたデータの確認

KenTamagawa さんのブロッグでは、Mac で AWS CLI を使った方法が紹介されていました。
今回はお試しに Edison に AWS CLI を設定してみました。
参考サイトは以下です。

CentOS に AWS CLI を「pip install awscli」でインストールする手順(山下 晴規さん)
http://www.checksite.jp/centos-pip-install-awscli/

【AWS】CLIの初期設定について(認証情報とコマンド補完 tasukujpさん)
http://www.task-notes.com/entry/20141026/1414322858

以下を実行します。(詳細は上記リンクを参照ください。)

opkg install python-pip
opkg install python-setuptools
pip install awscli

which aws
/usr/bin/aws

aws –version
aws-cli/1.7.22 Python/2.7.3 Linux/3.10.17-poky-edison+

バージョンまで確認できたら無事インストールできています。
続いて設定を行います。
ACCESS_KEY_ID 他は Kinesis の権限を与えたユーザのものをご利用ください。

aws configure で設定する方法もありますが、私は適宜環境を変えるので以下を実行しています。

export AWS_ACCESS_KEY_ID=***ACCESS_KEY_ID***
export AWS_SECRET_ACCESS_KEY=***SECRET_ACCESS_KEY***
export AWS_DEFAULT_REGION=us-east-1
export AWS_DEFAULT_OUTPUT=json

aws cli で Kinesis に保管されている情報を取得します。
PUT した際の SequenceNumber を指定します。

aws kinesis get-shard-iterator –stream-name iot_hack_edison_sensordata –shard-id shardId-000000000000 –shard-iterator-type AT_SEQUENCE_NUMBER –region us-east-1 –starting-sequence-number “49549802611433803905821669191073794678384151765993914370”
{
“ShardIterator”: “AAAAAAAAAAFEKajskTnty44aKQLATzuRijuQNgd0xhxdAmplu/VIrTEakExnTOwTs4yMBpug9PYZOZ7kkGL5zLwBiMvHGS/W80uFCQu3qFNQaiZCW2zli7psbr6qszsC+BBdpgPehA4eieXosTpaplDN9za/m8sFaohXoi9DuG+IMqyvawCfMK3IqlSShJogx8mXXv47SLiTROByiLzuL1DZbr3eariS”
}
aws kinesis get-records –region us-east-1 –shard-iterator “AAAAAAAAAAFEKajskTnty44aKQLATzuRijuQNgd0xhxdAmplu/VIrTEakExnTOwTs4yMBpug9PYZOZ7kkGL5zLwBiMvHGS/W80uFCQu3qFNQaiZCW2zli7psbr6qszsC+BBdpgPehA4eieXosTpaplDN9za/m8sFaohXoi9DuG+IMqyvawCfMK3IqlSShJogx8mXXv47SLiTROByiLzuL1DZbr3eariS”
{
“Records”: [
{
“PartitionKey”: “xyz”,
“Data”: “eyJkZXZpY2VfaWQiOiJFZGlzb24iLCJ0aW1lIjoxNDI5MTk1MTM1ODc0LCJzZW5zb3JzIjpbeyJzZW5zb3JkYXRhIjp7InRlbXAiOjM2Ny41LCJsdXgiOjIxLjR9fV19”,
“SequenceNumber”: “49549802611433803905821669191073794678384151765993914370”
},
{
“PartitionKey”: “xyz”,
“Data”: “eyJkZXZpY2VfaWQiOiJFZGlzb24iLCJ0aW1lIjoxNDI5MTk1MTMzNzk1LCJzZW5zb3JzIjpbeyJzZW5zb3JkYXRhIjp7InRlbXAiOjM1OS45LCJsdXgiOjIxLjN9fV19”,

“SequenceNumber”: “49549802611433803905821669191075003604203766395168620546”
},
{
“PartitionKey”: “xyz”,
“Data”: “eyJkZXZpY2VfaWQiOiJFZGlzb24iLCJ0aW1lIjoxNDI5MTk1MTMyNTY0LCJzZW5zb3JzIjpbeyJzZW5zb3JkYXRhIjp7InRlbXAiOjMwNCwibHV4IjoyMS40fX1dfQ==”,
“SequenceNumber”: “49549802611433803905821669191076212530023381024343326722”
},
{
“PartitionKey”: “xyz”,
“Data”: “eyJkZXZpY2VfaWQiOiJFZGlzb24iLCJ0aW1lIjoxNDI5MTk1MTM2OTU0LCJzZW5zb3JzIjpbeyJzZW5zb3JkYXRhIjp7InRlbXAiOjM2OS40LCJsdXgiOjIxLjR9fV19”,
“SequenceNumber”: “49549802611433803905821669191154792708298331989418704898”
}
],
“NextShardIterator”: “AAAAAAAAAAEdhTkDpOeBDGzHYQ1LkbM1upgnekH8/OVxn8UOlIK6WmxEoMMBUS8skb+llha9grOrHSkyE4bGvi8OAEJexu293pALrbm5iOQzsRQL9atSbHktBc5l/1t716/dlazNql/bPIro5MLypSmBSfu//gdohjQ5m3Swb/b3eZI/I+9fr/DfW0aiVL8orYhB6S1auUjgenqtTbpCsrjhnsherhKs”
}

データはBASE64でエンコードされています。
以下のサイトを利用して、デコードしてみます。

BASE64 エンコード・デコード(酒徳峰章さん)
http://kujirahand.com/web-tools/Base64.php

{“device_id”:”Edison”,”time”:1429195136954,”sensors”:[{“sensordata”:{“temp”:369.4,”lux”:21.4}}]}

PUTしたデータを無事取得できました!

IoT_Ed-05

後は Lambada で定期的に DynamoDB に保管までさせてみたいのですね。
こちらは後日試してみる予定です。

最後に、有意義な情報を公開頂いた KenTamagawa さんはじめ、リンクさせて頂いた皆様に感謝します!

AWS麻雀のCDP:Direct Hostingパターン

JAWS-DAYS 2015 AWS麻雀体験企画
– AWS麻雀のCDP役を理解する –

5.Direct Hostingパターンを実践・理解する

AWS麻雀CDP役(8Gpbs+9Gpbs+4TB)

00

今回のDirect Hostingパターンは、CMSなどのWebコンテンツを、S3に静的htmlとして出力するなどで簡単に負荷対策を行う必要が無いWebサーバーを実現できます。

短期間で急激にアクセス数が増加する場合など、EC2のインスタンス増設では間に合わない場合がある。
また、アクセス増を見込んで予め準備しておくのではコスト増となり、他ではロードバランサーとAutoScaleでの対応も検討できるが、設定が必要なうえ少しタイムラグがある。

例えば、wordpressやMovable TypeのようなCMSで更新後htmlに変換し、S3に出力し、静的サイトとして公開する事で、特定サービスのアクセス数が急激に増加してもS3側で問題なく処理できます。
結果、負荷対策を行う必要が無いWebサーバーとして利用することができます。

今回はwordpressのコンテンツをS3に静的htmlサイトとして出力する方法でDirect Hostingパターンを試してみます。但し、Route53を使わず、EC2環境を利用し、デフォルトの割り当てDNSホスト名でwordpress環境を構築します。
wordpress環境は、構築時間を超短縮するため AMIMOTO AMI を利用します。

参考情報は以下です。
wordpressをAmazon S3で運用する方法(ITANDI技術ブログ)
http://tech.itandi.co.jp/2014/05/wordpress-amazon-s3/

WordPress の StaticPress プラグインで Amazon S3 に静的なサイトを構築する(inokappa さん)
http://qiita.com/inokappa/items/d4df29279b94e04590bd

StaticPress
http://ja.staticpress.net/

megumiteam/staticpress-s3
https://github.com/megumiteam/staticpress-s3

S3をWeb Storageとして利用しますが、その環境の構築などは以下を参考にしてください。

AWS麻雀のCDP:Web Storageパターン
https://yukataoka.wordpress.com/2015/04/06/webstorage/

先ず、S3にコンテンツを更新するユーザと権限、アクセスキーの作成を行います。

AWSのコンソール画面で、Identity & Access Management を選択します。
01

Usersを選択し、Create New Users します。
02

ユーザ名を入力し、Create します。
03

Access Key ID と Secret Access Key を保管します。
05


Access Key ID:<——- Access Key ———–>
Secret Access Key:<——- Secret Key ———–>

作成したユーザを選択します。
06

Inline Policies の click here をクリックします。
07

Policy Generator を Select します。
08

以下の画面で、
Effect => Allow
AWS Service => Amazon S3
Actions => All Actions Select
ARN => arn:aws:s3:::バケット名/*
を登録し、Add Statement します。
09

以下が追加されますので、Next Step します。
10

Policy に青拝啓部分の追記し、Apply Policy します。
11

今回の例
{
 ”Version”: “2012-10-17”,

 ”Statement”: [
  {
   ”Sid”: “Stmt1429413096000”,
   ”Effect”: “Allow”,
   ”Action”: [
    ”s3:*”
   ],
   ”Resource”: [
    ”arn:aws:s3:::s3.ykata.net/*”
   ]
  },
  {
   ”Action”: [
    ”s3:ListAllMyBuckets”,
    ”s3:ListBucket”,
    ”s3:GetBucketLocation”
   ],
   ”Resource”: [
    ”arn:aws:s3:::*”
   ],
   ”Effect”: “Allow”
  }
 ]
}

以下が表示されます。
12

続いて、S3に静的htmlを更新する試験用のwordpress環境を作ります。

とにかく時間と手間をかけないため、デジタルキューブさんのAMIMOTO AMIを利用させて頂きます。
手順は以下をご参照ください。

AMIMOTO AMIの使い方(デジタルキューブ さん)
http://ja.amimoto-ami.com/how-to-use/

13

先ず静的HTMLを出力するプラグイン、StaticPress を追加します。
14

追加後、有効化します。設定はデフォルトそのままで良いでしょう。
15

StaticPress で作成した静的htmlをS3にアップするためのプラグイン staticpress-s3 のZIPを先のURLより取得して追加します。
16

追加できると、以下のようになります。
17

先にIdentity & Access Management で設定した、Access Key ID と Secret Access Key  リージョンを設定します。
東京リージョンは ap-northeast-1 です。
18

つづいて、該当するBacketを選択し、変更を保存します。
19

拡張子をhtmlにするため、パーマリンクを以下に変更します。
%postname%.html
20

S3は以前のWeb Storageパターン で構築した環境をそのまま利用します。
21

早速構築をしてみましたが、、、エラー!で終わります。
=>数時間色々粘ってみましたが、GitHubのコード解析するには時間的に厳しく別方法を探す事にしました。
22

代替えとして s3cmd をwordpressのEC2内に設定して、sshのオペレーションで送ることにしました。
以下を参考に設定をすることにします。

[技術ブログVol.10] 最新のs3cmd (ver1.5.0) をyumでインストールする(ディーネット さん)
http://www.denet.ad.jp/technology/2014/03/vol10-s3cmd-ver150-yum.html

staticpress-s3 のプラグインを停止します。
30

以下のようにS3の設定がなくなります。
出力先ディレクトリィにファイルが出力されるだけになります。
31

構築をしてみます。
32

無事出力されました。
33

以降はsshで wordpress が稼働しているEC2のコマンドラインで実施します。
(ssh接続の詳細が不明な方は検索サイトで EC2 ssh などのキーワードで検索ください。)

以下、コマンドでの手順です。

sudo yum update

sudo yum -y –enablerepo epel install s3cmd

インストールが簡単に終わります。
先ず試しにバージョンを表示させようとするとエラーが発生します。

s3cmd –version

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
An unexpected error has occurred.
Please try reproducing the error using
the latest s3cmd code from the git master
branch found at:
https://github.com/s3tools/s3cmd
If the error persists, please report the
following lines (removing any private
info as necessary) to:
s3tools-bugs@lists.sourceforge.net
Error loading some components of s3cmd (Import Error)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Invoked as: /usr/bin/s3cmd ?-version
Problem: ImportError: No module named S3.ExitCodes
S3cmd: unknown version. Module import problem?
python: 2.7.9 (default, Apr 1 2015, 18:18:03)
(後略)

こちらのエラーは Amazon Linux の新しいAMIのPythonのバージョンが影響しているようです。
以下のForumの投稿が参考になりました。

AWS Discussion Forums
https://forums.aws.amazon.com/thread.jspa?threadID=174345

投稿の回答に従ってコマンドを実行します。

sudo yum-config-manager –enable epel/x86_64
sudo yum install ansible -y
sudo alternatives –set python /usr/bin/python2.6
sudo yum clean all
sudo yum install yum-python26 -y
sudo yum install python-boto -y
sudo yum update -y

s3cmd –version が以下のとおり表示されるようになりました。
34

以下のサイトの情報を参考に、s3cmdを設定、実際にS3にファイルを転送してみました。

Amazon S3編~s3cmdでS3を操作してみよう!~(ナレコムAWSレシピ さん)
http://recipe.kc-cloud.jp/archives/1059

s3cmd –configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: <——- Access Key ———–>
Secret Key: <——- Secret Key ———–>
Default Region [US]: ap-northeast-1

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password:Enter
Path to GPG program [/usr/bin/gpg]:Enter

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [No]:Enter

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can’t connect to S3 directly
HTTP Proxy server name:Enter

New settings:
Access Key: <——- Access Key ———–>
Secret Key: <——- Secret Key ———–>
Default Region: ap-northeast-1
Encryption password:
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: False
HTTP Proxy server name:
HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] y
Please wait, attempting to list all buckets…
Success. Your access key and secret key worked fine 🙂

Now verifying that encryption works…
Not configured. Never mind.

Save settings? [y/N] y
Configuration saved to ‘/home/ec2-user/.s3cfg’

s3cmd put -r /var/www/vhosts/i-e849991d/static s3://s3.ykata.net

上記コマンドでS3に転送した結果が以下です。
35

AWSのコンソールでS3にアップされた様子です。
36

wordpressのサイトです。
37

S3のサイトです。
38

一部CSSや、JavaScriptのファイルか、フォルダ構成に不備があるのか、wordpressのテーマなどの設定の影響か、レイアウトが崩れてしまっています。
=>今回はCDPの実践手順の確認なので、これでOK(妥協)にします。(汗)

JAWS-DAYS 2015 AWS麻雀体験企画 に戻る