AWSでのソーシャルアプリ運用について
CyberXエンジニアのIです。
今回は社内で発表したAWSでソーシャルアプリを運用する際の
ポイントについて書きたいと思います。
※AWSの基本的な説明は割愛させて頂きます
弊社が利用するAWSのサービスは、EC2, RDS, EBS, ELBです。
1.RDSのタイムゾーンがUTC
誤って、SQLのNOW関数などを使用すると、
PHP側とのタイムゾーンと一致しないため、一貫性を保てなくなります。
本番運用で、不整合が発生すると、ログインボーナスが1日に何回ももらえたり
してしまうので、注意しなければいけません。
2.グローバルIPが固定ではない
インスタンスの再起動が入るとIPが変わるので、
IPベースで接続するのはNGです。
※EC2に関しては、EIPのオプションで固定IPを取得することが可能
3. バックアップが楽
ELBで定期的にスナップショットを取ることで
リカバリや再構築が楽です。
ただ、スナップショットを取る運用ルールをしっかり決めておかないと
先祖返りしてしまう可能性もあります。
4. RDS, ELBはssh不可能
ssh接続ができないため、監視項目が制限されてしまいます。
例えば、RDSのload averageが取得できないなど。
AWSはうまく活用できれば、便利なサービスですが、
気をつけなければいけないところもあります。
この辺の仕様を理解し、今後も弊社ではうまく活用していきたいと思います!
今回は社内で発表したAWSでソーシャルアプリを運用する際の
ポイントについて書きたいと思います。
※AWSの基本的な説明は割愛させて頂きます
弊社が利用するAWSのサービスは、EC2, RDS, EBS, ELBです。
1.RDSのタイムゾーンがUTC
誤って、SQLのNOW関数などを使用すると、
PHP側とのタイムゾーンと一致しないため、一貫性を保てなくなります。
本番運用で、不整合が発生すると、ログインボーナスが1日に何回ももらえたり
してしまうので、注意しなければいけません。
2.グローバルIPが固定ではない
インスタンスの再起動が入るとIPが変わるので、
IPベースで接続するのはNGです。
※EC2に関しては、EIPのオプションで固定IPを取得することが可能
3. バックアップが楽
ELBで定期的にスナップショットを取ることで
リカバリや再構築が楽です。
ただ、スナップショットを取る運用ルールをしっかり決めておかないと
先祖返りしてしまう可能性もあります。
4. RDS, ELBはssh不可能
ssh接続ができないため、監視項目が制限されてしまいます。
例えば、RDSのload averageが取得できないなど。
AWSはうまく活用できれば、便利なサービスですが、
気をつけなければいけないところもあります。
この辺の仕様を理解し、今後も弊社ではうまく活用していきたいと思います!
PHPUnitによる自動テスト入門
CyberX インフラエンジニアの山本です。
新卒エンジニアも業務に馴染んできたこともあり、社内エンジニアミーティングのLTで
IDE(PhpStorm)+PHPUnitのデモンストレーションをLTと称して発表いたしました。
ユニットテスト/自動テストとは
ユニットテストとは、そもそも日本語では単体テストと呼ばれ、個々のモジュールが
仕様を満たしているかを試験する工程です。
昨今ではTDD(テスト駆動開発)やBDD(振舞駆動開発)・CI(継続的インテグレーション)の
自動テストという形で、ユニットテストの重要性はさらに高まりを見せました。
なお、自動テストとは各モジュールのテスト内容をプログラマブルに表現し、機械的に
ユニットテストを実施する仕組みです。
PHPUnitはその仕組みの中で、PHP言語を対象にしたユニットテストを提供します。
難しい言葉ばかりを並べましたが、簡単には以下のように説明できるでしょう。
・ユニットテストとは、モジュールの仕様試験を行う開発工程。
・関数やクラスメソッドの単体試験を機械的に行うことができる。
・プログラマブルに書かれた、モジュールの仕様書。
・対象ソースコードをリファクタなど改変後に自動テストを行うことで
デグレーション(バグ)が発生しているか機械的に検知することができる。
IDE上で、PHPUnitのテスト結果はどう見える?
今回の発表は、あくまでPHPUnitをIDE上で実行した際、どのような結果が得られるかの
デモンストレーションにフォーカスして説明いたしました。
このため、ここでの説明では四則演算を行うクラスを利用して説明しています。
ユニットテストで評価するプログラム(Arithmetic.php)
自動テストを行うクラス(TestArithmetic.php)
ユニットテストが成功した場合
ユニットテスト結果がすべてパスし、問題がないことを示しています。
ユニットテストが失敗した場合
ここでは掛け算を行うメソッドに手を加え、計算結果が一致しないよう修正しました。
testMultiplication()メソッドのアサーションに問題があることを表示してくれます。
PHPUnitの環境構築
以上で発表内容は終了なのですが、PHPUnitを行うには若干準備が必要となるため
簡単ですが環境構築方法について説明を追記いたします。
PHPUnitを利用するには、PHP実行環境に拡張ライブラリ(PEAR)をインストールします。
PHP実行環境上で、基本的には以下のコマンドでインストールすることができます。
【参考資料】
http://www.phpunit.de/manual/3.6/ja/index.html
新卒エンジニアも業務に馴染んできたこともあり、社内エンジニアミーティングのLTで
IDE(PhpStorm)+PHPUnitのデモンストレーションをLTと称して発表いたしました。
ユニットテスト/自動テストとは
ユニットテストとは、そもそも日本語では単体テストと呼ばれ、個々のモジュールが
仕様を満たしているかを試験する工程です。
昨今ではTDD(テスト駆動開発)やBDD(振舞駆動開発)・CI(継続的インテグレーション)の
自動テストという形で、ユニットテストの重要性はさらに高まりを見せました。
なお、自動テストとは各モジュールのテスト内容をプログラマブルに表現し、機械的に
ユニットテストを実施する仕組みです。
PHPUnitはその仕組みの中で、PHP言語を対象にしたユニットテストを提供します。
難しい言葉ばかりを並べましたが、簡単には以下のように説明できるでしょう。
・ユニットテストとは、モジュールの仕様試験を行う開発工程。
・関数やクラスメソッドの単体試験を機械的に行うことができる。
・プログラマブルに書かれた、モジュールの仕様書。
・対象ソースコードをリファクタなど改変後に自動テストを行うことで
デグレーション(バグ)が発生しているか機械的に検知することができる。
IDE上で、PHPUnitのテスト結果はどう見える?
今回の発表は、あくまでPHPUnitをIDE上で実行した際、どのような結果が得られるかの
デモンストレーションにフォーカスして説明いたしました。
このため、ここでの説明では四則演算を行うクラスを利用して説明しています。
ユニットテストで評価するプログラム(Arithmetic.php)
<?php
/**
* 四則演算を行うクラス
*/
class Arithmetic
{
/**
* 引数x,yの足し算を行う
*/
public function addition($x, $y) {
$ret = $x + $y;
return($ret);
}
/**
* 引数x,yの引き算を行う
*/
public function subtraction($x, $y) {
$ret = $x - $y;
return($ret);
}
/**
* 引数x,yの掛け算を行う
*/
public function multiplication($x, $y) {
$ret = $x * $y;
return($ret);
}
/**
* 引数x,yの割り算を行う
*/
public function division($x, $y) {
$ret = $x / $y;
return($ret);
}
}
自動テストを行うクラス(TestArithmetic.php)
<?php
/**
* Arithmeticクラスのユニットテスト
*/
require_once 'PHPUnit/Autoload.php';
require_once '../logic/Arithmetic.php';
class TestArithmetic extends PHPUnit_Framework_TestCase
{
/**
* @var Arithmetic
*/
protected $arithmetic;
/**
* テスト対象のオブジェクトの生成
*/
protected function setUp() {
// TODO Unitテスト開始時動作
$this->arithmetic = new Arithmetic();
}
/**
* 足し算の検証。10+5=15となることを確認する
*/
public function testAddition() {
$this->assertEquals( 15, $this->arithmetic->addition(10, 5) );
}
/**
* 引き算の検証。10-5=5となることを確認する
*/
public function testSubtraction() {
$this->assertEquals( 5, $this->arithmetic->subtraction(10, 5) );
}
/**
* 掛け算の検証。10x5=50となることを検証する
*/
public function testMultiplication() {
$this->assertEquals( 50, $this->arithmetic->multiplication(10, 5) );
}
/**
* 割り算の検証。10/5=2となることを検証する
*/
public function testDivision() {
$this->assertEquals( 2, $this->arithmetic->division(10, 5) );
}
}
ユニットテストが成功した場合
ユニットテスト結果がすべてパスし、問題がないことを示しています。
ユニットテストが失敗した場合
ここでは掛け算を行うメソッドに手を加え、計算結果が一致しないよう修正しました。
testMultiplication()メソッドのアサーションに問題があることを表示してくれます。
PHPUnitの環境構築
以上で発表内容は終了なのですが、PHPUnitを行うには若干準備が必要となるため
簡単ですが環境構築方法について説明を追記いたします。
PHPUnitを利用するには、PHP実行環境に拡張ライブラリ(PEAR)をインストールします。
PHP実行環境上で、基本的には以下のコマンドでインストールすることができます。
# pear channel-discover pear.phpunit.de※OSごとのPEARインストール方法はPHPのマニュアルをご覧ください。
# pear install phpunit/PHPUnit
【参考資料】
http://www.phpunit.de/manual/3.6/ja/index.html
正規表現のススメ
Xでエンジニアとしてお世話になっている矢入です。
正規表現使ってますか?
ログ解析や特定のパターンの文字の一斉置換やらお世話になりっぱなしだと思います。
そして思った通りの正規表現がかけたときは本当に楽しくなります。
ところで使える、使っているという方はどのようにして正規表現を学びましたか?
前任者が書いたコードでなんとなく覚えたとか、それをもとにネットで調べてなんとなく使えるようになっているというパターンが結構多いのではないでしょうか。
自分もそのパターンでした。
しかしあるとき、プログラム内に記述した正規表現がうまく機能せず、それが果たして正規表現の間違いなのか、そもそもプログラムの問題なのか切り分けができず予想外に時間を食ってしまいました。
そこでこれを気にしっかりと学んでみようと手にとった、皆が大好きオライリーの「詳説正規表現 第三版」を読んだところ、いかに自分が意味を正しく理解せず使用していたかを痛感したのでした。
この本は面白いです。
技術的な話しはもちろんのこと、学んだことの理解度を図るための例題の出し方、ユーモアにあふれたセンスのある文章、単純に読み物としても面白いのです。
お値段はご存じの通りなので躊躇してしまうかもしれませんが、買わないまでも、ぜひ一度は目を通しておいてほしい本の一つです。
そしてこの本を読んだ後にはきっと、序説で紹介されている第一般が発売されたときに寄せられたメッセージに大きく共感できるようになるでしょう。
「この本を読むまで、自分は正規表現について知っているつもりでしたが、それは間違いでした。この本を読んで本当の意味を理解できました。」
正規表現の本を読みましょう!で終わっても芸がないので、よく見かける勘違いを交えて、正規表現のさわりに触れたいと思います。
(といってもこんな感じの内容がそのまま本に記されています)
テキストの中に含まれる「gray」もしくは「grey」という文字の並びをマッチさせたい場合があるとします。
これを文字クラス [] を用いてマッチさせたい場合、以下のパターンは適切でしょうか。
gr[a|e]y
文字クラスでは [] の中に記された任意の1文字にマッチします。
そういう意味ではたしかに「a」にも「e」にもマッチするので間違いとはいえなさそうです。
では文字クラス内にある「|」はどういう意味でしょう。
「|」は正規表現では「または」の意味の便利なメタ文字です。
上記のように書いた人はきっとそのような効果を期待したに違いありません。
しかし文字クラス内の「|」は「または」という意味にならないのです。
結果、上記正規表現では「gr|y」という文字があった場合、それにもマッチしてしまうことになり、不必要なデータが検出されてしまいます。
文字クラスの中では通常意識して使うメタ文字がメタ文字ではない場合が往々にしてあるのです。
これらのメタ文字は決まり事なのでただ覚えるだけですが、本の中ではこれを以下の様に補足して、非常に理解しやすくしています。
「文字クラスは、また別のミニ言語と考えると良い。どのメタ文字をサポートし、それらがどのような意味を持つかは、文字クラスの中と外とで全く意味が異なる。」
なんとなく理解していることを言葉にしてもらえると非常に理解が深まっていきます。
この本は正規表現を学ぶ上で、そういった言葉に満ち溢れています。
新しい技術もいいですが、足元を固める技術もこれを気にしっかり学んでみませんか?
というわけで「詳説正規表現 第三版」は凄くオススメです。(最後まで本の宣伝)
終わり。
正規表現使ってますか?
ログ解析や特定のパターンの文字の一斉置換やらお世話になりっぱなしだと思います。
そして思った通りの正規表現がかけたときは本当に楽しくなります。
ところで使える、使っているという方はどのようにして正規表現を学びましたか?
前任者が書いたコードでなんとなく覚えたとか、それをもとにネットで調べてなんとなく使えるようになっているというパターンが結構多いのではないでしょうか。
自分もそのパターンでした。
しかしあるとき、プログラム内に記述した正規表現がうまく機能せず、それが果たして正規表現の間違いなのか、そもそもプログラムの問題なのか切り分けができず予想外に時間を食ってしまいました。
そこでこれを気にしっかりと学んでみようと手にとった、皆が大好きオライリーの「詳説正規表現 第三版」を読んだところ、いかに自分が意味を正しく理解せず使用していたかを痛感したのでした。
この本は面白いです。
技術的な話しはもちろんのこと、学んだことの理解度を図るための例題の出し方、ユーモアにあふれたセンスのある文章、単純に読み物としても面白いのです。
お値段はご存じの通りなので躊躇してしまうかもしれませんが、買わないまでも、ぜひ一度は目を通しておいてほしい本の一つです。
そしてこの本を読んだ後にはきっと、序説で紹介されている第一般が発売されたときに寄せられたメッセージに大きく共感できるようになるでしょう。
「この本を読むまで、自分は正規表現について知っているつもりでしたが、それは間違いでした。この本を読んで本当の意味を理解できました。」
正規表現の本を読みましょう!で終わっても芸がないので、よく見かける勘違いを交えて、正規表現のさわりに触れたいと思います。
(といってもこんな感じの内容がそのまま本に記されています)
テキストの中に含まれる「gray」もしくは「grey」という文字の並びをマッチさせたい場合があるとします。
これを文字クラス [] を用いてマッチさせたい場合、以下のパターンは適切でしょうか。
gr[a|e]y
文字クラスでは [] の中に記された任意の1文字にマッチします。
そういう意味ではたしかに「a」にも「e」にもマッチするので間違いとはいえなさそうです。
では文字クラス内にある「|」はどういう意味でしょう。
「|」は正規表現では「または」の意味の便利なメタ文字です。
上記のように書いた人はきっとそのような効果を期待したに違いありません。
しかし文字クラス内の「|」は「または」という意味にならないのです。
結果、上記正規表現では「gr|y」という文字があった場合、それにもマッチしてしまうことになり、不必要なデータが検出されてしまいます。
文字クラスの中では通常意識して使うメタ文字がメタ文字ではない場合が往々にしてあるのです。
これらのメタ文字は決まり事なのでただ覚えるだけですが、本の中ではこれを以下の様に補足して、非常に理解しやすくしています。
「文字クラスは、また別のミニ言語と考えると良い。どのメタ文字をサポートし、それらがどのような意味を持つかは、文字クラスの中と外とで全く意味が異なる。」
なんとなく理解していることを言葉にしてもらえると非常に理解が深まっていきます。
この本は正規表現を学ぶ上で、そういった言葉に満ち溢れています。
新しい技術もいいですが、足元を固める技術もこれを気にしっかり学んでみませんか?
というわけで「詳説正規表現 第三版」は凄くオススメです。(最後まで本の宣伝)
終わり。