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麻雀体験企画 に戻る

AWS麻雀のCDP:Cache Distributionパターン

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

4.Cache Distributionパターンを実践・理解する

AWS麻雀CDP役(9Gpbs+4TB+1〜4ECU)

CDP4-00

今回のCache Distribution パターンは、動画などのコンテンツ配信では、遠方な場所への配信を行うと遅延などによる品質低下を避けるため、例えばオリジナルのコンテンツを世界のリージョン(データセンター)にキャッシュし配信する事で、高品質な配信サービスを実現できる。

CloudFrontは執筆時点東京リージョンで1GBの転送で20円弱です。世界のリージョンのキャッシュサーバー(エッジサーバー)を個人でも利用できますね!

よく利用するパターンで、S3に公開するコンテンツを保管し、CloudFrontで配信します。
S3に動画などのコンテンツを保管し配信する方法は、前回の AWS麻雀のCDP:Web Storageパターン を参照ください。
今回の説明は前回のS3に構築した環境を利用する前提で説明します。

前回構築したS3の環境。
CDP4-04

またログを保管するためのbacketもs3に準備しておきます。
CDP4-06

上記準備が終わったら、マネジメントコンソールで CloudFrontを選択します。
CDP4-01

以下の画面で Create Distribution を行います。
Distribution は一つのまとまりのように捉えると良いでしょう。
CDP4-02

今回はWeb Distribution を開始します。
RTMP については説明を省きますので こちら を参照してください。
CDP4-03

Origin Domain Name にS3で先に公開したドメインを入力か、自動で紹介される場合は選択します。
EC2のWebサイトや、外部で公開しているWebサイトなどのドメインも登録して、キャッシュ利用可能です。
Origin ID には任意に設定します。
CDP4-05

ログを保管したい場合は以下のように設定してください。
Bucket for Logs は先に設定したs3のbacketを指定します。
(注意:この設定ではログが保管されませんでした。)

Create Distribution します。
CDP4-07

以下の画面で、Statusが Enabled になるまで待ちます。
コーヒーを1杯飲める以上の時間(結構待ちます)がかかります。
CDP4-08

以上で出来上がりです。
指定された Domain Name でアクセスしてみます。
CDP4-09

しっかり表示されました。
現在は Disable にしていますので、アクセスできません。
CDP4-10

動画ファイルも直接表示されました。
CDP4-11

問題はS3に記録した筈のログがすぐには見えない事です。
最初これではまりましたが、1時間以上経過しないと保管されないようです。
=> 上記ではログも問題なく設定したつもりでしたが、保管されておらず設定の見直しが必要です。

EC2のWebコンテンツでも試してみましたが、Origin Domain Name 以外ほぼ同じ設定でした。

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

AWS麻雀のCDP:Web Storageパターン

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

3.Web Storageパターンを実践・理解する

AWS麻雀CDP役(8Gpbs+4TB+1〜4ECU)

cdp3-00

今回のWeb Storage パターンは、EC2動的サイトを運用している場合、S3にPDF、動画などの重い静的ファイルの配信を任せることで、EC2動的サイトの負荷を軽減する事が可能です。

このように、EC2で公開するWebサイトなどの負荷をS3に静的ファイルを置いて分散することができます。

今回のWeb Storage パターンとは異なりますが、静的コンテンツしかない場合はS3のみでWebサイトを構築する事も可能です。
ついでに今回はS3のみの静的サイトも構築してみました。

 

マネジメントコンソールでS3を選択します。
cdp3-02

 

 

以下の画面で、Create Backet を行います。
Backetは静的コンテンツの入るフォルダと考えると良いでしょう。
cdp3-03

バケットの名称と、リージョンを選択し、Createします。
リージョンは日本なので東京で良いでしょう。
cdp3-04

今回利用するBacketができました。
cdp3-05

Backetの Static Website Hosting を設定します。
Endpoint にリンク用のURLが表示されますので控えておいてください。
以下の例は demo-s3web.s3-website-ap-northeast-1.amazonaws.com です。
cdp3-06

Enable website hosting を選択し、Index Document には index.html など適宜設定します。
cdp3-07

Permissions でこの bucket へのアクセス権限などを設定します。
Add bucket policy をクリックします。
cdp3-08

bucket policy設定用の画面が表示されます。
そのまま記述するのは面倒ですので、AWS Policy Generater を使って設定を作ります。
cdp3-09

以下の画面で、
Select Type of Policy => S3 Bucket Policy
Effect => Allow
Principal => *
Actions => GetObject
ARN => arn:aws:s3:::バケット名/*
を登録し、Add Statement します。
cdp3-10

以下のように追加できていたら、Generate Policy します。
cdp3-11

以下が表示されますので、この設定をコピーします。
cdp3-12

Bucket Policy Editor 画面に戻って貼り付け、Save します。
cdp3-13

続いてファイルをアップするため、Bucketに移動します。
cdp3-14

Upload します。
cdp3-15

Add File します。
cdp3-16

必要なファイルを洗濯します。
cdp3-17

Start Upload します。
cdp3-18

以下のようにFileがアップされれば終了です。
cdp3-20

今回の例では
http://demo-s3web.s3-website-ap-northeast-1.amazonaws.com/ファイル名
のリンクをEC2の動的プログラムに設定するだけです。
以下はEC2のPHPプログラム内のHTMLからS3の動画フィアルを<video>タグでの表示例です。
(いつもはEC2インスタンスを停止させていますので、普段 http://aws.ykata.net/ は参照できません。)
cdp3-21

cdp3-22

Bucket名をドメインにすると、静的サイトをRoute53や、お名前.comなどで取得したドメインで運用できます。
お名前.comのような外部DNSを利用する場合は、DNSのcnameレコードで登録します。
以下のURLサイトはこのしくみを使っています。

http://s3.ykata.net/s3web.html

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