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