2016年08月28日

[Web] AWS Lambda のHello Worldをやってみた

個人開発のアプリでAWSのEC2を利用しているのですが、
非常にアクセス数が少ないのに、利用時間による従量課金になっています。

AWS EC2の料金表:
https://aws.amazon.com/jp/ec2/pricing/

t2.micro だと、$0.02/時間 なので、1年だと
1日の料金(0.02 x 24) x 365 = 175.2$
かかります。

ほとんど使われないのに、EC2を起動し続けているために毎年これくらいの
費用がかかってしまいます。

そうなると「使うときだけ料金が発生してくれたらなー」と考えてしまいます。
そこで登場するのが「AWS Lambda」というサービスです。

簡単にいうと、
・利用したときだけ料金が発生する
・サーバーを持つ必要がなくメンテナンスの必要がない
・アクセス数が急増してもAWS側で自動で対応してくれる
というサービスです。

AWS Lambdaについてのamazonの説明:
https://aws.amazon.com/jp/lambda/

初めてのAWS Lambda:
https://codezine.jp/article/detail/8446

AWS Lambdaの料金については、
メモリ128MB で、1ヶ月の無料利用枠の秒数が 3,200,000秒(約37日)
それを超えると100 ミリ秒単位の価格が0.000000208$ です。

現状の少ないアクセス数ならば、Lambdaの実行時間が1秒だとしても
無料枠で十分まかなえます。

AWS Lambdaの料金表
https://aws.amazon.com/jp/lambda/pricing/

これは利用しなければ!
ということで、Hello World をやってみましたので、記録として残しておきます。

----------------------------------
ここからは「AWSのアカウントを開設している」ことが前提になっています。
AWSのアカウントを開設していない方は、開設してからお進みください。
----------------------------------

管理画面のサービスの中から Lambda を選びます。
lambda1_1.png


Get Started Now を選びます。
lambda1_2.png


blue print(青写真)を選ぶ画面になったら、画面中央の">"を押して青写真一覧の次のページを
表示します。
lambda1_3.png


hello-world の青写真があるので、選択します。
lambda1_4.png


ここは何もせず"Next"を選択。
lambda1_5.png


ファンクション名が必須なので、"helloWorld"とします。
他はデフォルトのままです。
lambda1_6.png


画面を下に進めると"Lambda function handler and role"の欄で"Role"を設定する必要があります。
lambda1_7.png


Roleを作っていないので、ここでRoleを作ります。
Roleのプルダウンメニューの中から、"Create a custom role"を選択します。
lambda1_8.png


Roleを作成する画面に移ったら、デフォルト設定のまま"許可"を押します。
lambda1_9.png


Lambdaの画面に戻ると、RoleとExisting roleの欄が先ほど作ったRoleで埋まっています。
他の設定はデフォルトのまま"Next"を押します。
lambda1_10.png


確認画面になりますので、"Create function"を押します。
lambda1_11.png


Lambdaのダッシュボード画面に切り替わると、Hello Worldのコードの内容が表示されます。
今回はそのまま、画面上の"Test"を押して実行してみす。
lambda1_12.png


ダッシュボード画面の下の方に、実行結果が表示されます。
さらに詳しいログを見るときは、"Click here"を押します。
lambda1_13.png


CloudWatchの画面に移ります。先ほどのログが表示されています。
ログを選択します。
lambda1_14.png


詳しいログを確認することができます。
lambda1_15.png


Hello World の流れは以上です。
次は、Unityとの連携をしてみます。

続きの記事:
[Unity] AWS Lambda をUnityから実行してみた(iPhoneから実行も)
posted by be-style at 14:46| Comment(0) | Web

2013年08月31日

[Web] AWSを使ってみる FRDSのParameter Groupを管理画面(Management Console) から変更してみた

RDSの文字化け対策のために

[Web] AWSを使ってみる CRDSでの文字化けに対処してみた

で、Amazon RDS Command Line Toolkit を使ってParameter Group を更新しました。

Toolkitをインストールして、環境設定して……、というのが面倒だなーと思っていたら、
AWSの管理画面(Management Console)で設定できることがわかりました orz

手順は、
[Web] AWSを使ってみる CRDSでの文字化けに対処してみた
でAWSの管理画面で「Parameter Group」を作るところまでは同じです。

AWS管理画面(Management Console) > Serceves(画面左上) > RDS > Parameter Groups(画面左)

で、一覧表示されるので、
変更したいParameter Groupを選択(デフォルト以外で)すると、画面上の「Edit Parameters」ボタンが有効になるので押します。

スクリーンショット 2013-08-31 18.11.55.png

すると、設定できるパラメーター一覧が表示されるので、該当のパラメーターについて入力します。
※下の例は文字化け対策としてUTF-8を設定しました

スクリーンショット 2013-08-31 18.14.31.png

その後、画面上に戻ると

・Cancel Editing ※変更しないで元の画面に戻る
・Preview Changes ※どの値が変更されたのか一覧が表示される(反映はまだされない)
・Save Changes ※変更された値を反映させる ※誤った値が入力されていると教えてくれる

のボタンがあるので、それぞれ選択します。

スクリーンショット 2013-08-31 18.16.57.png

Save Changesを押した後、Parameter Groupsを使用しているRDSのインスタンスの状態を見ると
Parameter Group が「applying」になっています。
この状態ではまだRDSに反映されていません。

スクリーンショット 2013-08-31 12.33.13.png

数分待つと「pending-reboot」となります。

スクリーンショット 2013-08-30 19.20.49.png

この後、RDSのインスタンスを再起動(Reboo)すると、Parameter Groupが反映されます。

管理画面(Management Console)を使うもよし、Amazon RDS Command Line Toolkit を使うもよし、
作業しやすい方で作業出来るっていいね!
posted by be-style at 18:27| Comment(0) | Web

2013年08月28日

[Web] AWSを使ってみる Eクーロンとシェルスクリプトを使ってPHPを定期実行

色々と準備が出来たところで、やっとアプリで使うPHPを作ることができます。
流れはこんな感じです。

@EC2でPHPを作ってコンソール画面から実行してみる
APHPをクーロンで実行してみる
Bシェルスクリプトを利用する
C修正後のクーロン
Dデバッグ用に時間を出力する



@EC2でPHPを作ってコンソール画面から実行してみる

Webブラウザを通して実行していたPHPですが、内部処理だけに使いたいときは
コンソールから実行しています。

$ php -f ~/[PHPファイル名].php [パラメーター]  ←ホーム( ~/ )にPHPファイルを置いてます

PHPの中身↓
==================================================
// PHPのパラメーターを取得
$var = array_reverse(explode('=',$_SERVER['argv'][1]));
echo "$var[0]"; ← PHP実行コマンドのパラメーターが表示される
==================================================

【参考】
第 43章PHP をコマンドラインから使用する


APHPをクーロンで実行してみる

毎度手作業でPHPを実行するのは大変なので、
クーロンを使って定期的に実行してもらいます。

クーロンの状況について順番に確認していきます。
● 実行されているか
/etc/rc.d/init.d/crond status

● 2から5がONになっているか
chkconfig --list crond

● crontab に実行権限があるか
ls -la /etc/crontab

● cronの実行ログを確認
sudo tail -f /var/log/cron

● クーロンの編集 ※ここで実行したいPHPについて記述
crontab -e

例として、こんな感じです↓
==================================================
* * * * * /usr/bin/php -q ~/[PHPファイル名].php 2 >> ~/test.log;
→PHPファイルにパラメーター「2」を渡して”毎分”実行。ログを test.log に追記する。
==================================================

● 中身を削除
crontab -r

● 登録状況を確認
crontab -l

【参考】
はじめての crontab / crontab コマンドの使い方
[サーバ]crontabがどうしても動かないときに確認すべき3つの点+α
"crontab" 指定した時間にコマンドを自動実行 @LCD -Linux Command Dictionary- 【山澤】
[FedoraCore6][apache]cronでphpAdd Star

クーロンの最小実行単位時間は「分」ですが、sleep コマンドを使うと”秒単位”にすることができます。

==================================================
* * * * * sleep 1; /usr/bin/php -q ~/[PHPファイル名].php 2 >> ~/test.log; ←毎分「1秒」に実行
* * * * * sleep 2; /usr/bin/php -q ~/[PHPファイル名].php 2 >> ~/test.log; ←毎分「2秒」に実行
* * * * * sleep 3; /usr/bin/php -q ~/[PHPファイル名].php 2 >> ~/test.log; ←毎分「3秒」に実行
==================================================

【参考】
crontab 秒間実行について

これで秒単位で実行できるぞー、と安心したのも束の間、
この方法だと「sleepで指定した時間、コンソールが固まる(sleepを実行してるから)
という事態に陥ってしまいました!

sleep 1000; とか記述してたので、使えるようになるまでかなり待ちました orz
そんな時に見つけた方法が、「クーロン + シェルスクリプト」という方法でした。


Bシェルスクリプトを利用する

シェルスクリプトは、コンソールで実行したいコマンドをファイルにまとめて記述したファイルのことです。
シェルスクリプト( .sh ファイル )を実行すると、中身に記述されたコマンドが実行されます。

下の例だと、毎秒PHPファイルを実行しつつ、各回に1から10のパラメーターを渡しています。

0秒目 : PHPを実行(パラメーター = 1)
1秒目 : PHPを実行(パラメーター = 2)
2秒目 : PHPを実行(パラメーター = 3)

という感じです。
~/test.sh ↓
==================================================
#!/bin/sh
for i in `seq 1 10`
do
/usr/bin/php -q ~/[PHPファイル名].php $i >> ~/test.log;
sleep 1
done
exit 0
==================================================

C修正後のクーロン

Bでシェルスクリプトが出来たので、Aのクーロンを修正します。
下の修正では、3分かけてPHPファイルを30回実行した例です。

==================================================
1 * * * * sh ~/test1.sh ←毎時「1分」に実行 ※0秒から9秒の間に毎秒実行される
2 * * * * sh ~/test2.sh ←毎時「2分」に実行 ※0秒から9秒の間に毎秒実行される
3 * * * * sh ~/test3.sh ←毎時「3分」に実行 ※0秒から9秒の間に毎秒実行される

※test1.sh, test2.sh, test3.sh の中身は部分的に修正しています↓
・test1.sh → for i in `seq 1 10`
・test2.sh → for i in `seq 11 20`
・test3.sh → for i in `seq 21 30`
==================================================

【参考】
シェルスクリプト入門 [制御構文]
for 文の使用方法


Dデバッグ用に時間を出力する

Cがちゃんと時間通りに実行されているかについて、PHPから時間を出力して確認したいとき
「strtotime()」を使いましたが、デフォルトの状態では警告が出てしまします。
そのときは、php.ini の一部を書き変える必要がありました。

$ sudo vim /etc/php.ini
;date.timezone =

date.timezone = "Asia/Tokyo"

PHPでの記述例↓
==================================================
$now = strtotime("now");
echo date('Y-m-d H:i:s', $now) . " arg=$var[0]\n";
==================================================

【参考】
Windows+VMWareでLAMP環境を作る【その3】


Cで複数のシェルスクリプトに分けて、クーロンで各々実行した理由ですが
たくさんのPHPの実行を時間的に集中させたらサーバーのCPUが跳ね上がってしまったからでした。

Cの方法で処理を分散させてみたのですが、これで正しいかどうかはまだ疑問です。
まだまだ手探り状態です。。。
posted by be-style at 17:36| Comment(0) | Web