新年あけましておめでとうございます、五十川です。
PHPデベロッパー向けのAmazon Web Services(AWS)のリソースはhttp://aws.amazon.com/php/にまとめられていますが、そのArticles & Tutorialsカテゴリーにある、Introduction to AWS for PHP Developersという記事は、AWSの主要サービスの概要と、PHPによるその操作を学ぶチュートリアルで、ここで取り上げられているサービスに初めて取り組むPHPデベロッパーには格好の入門となっており、ここではこのチュートリアルを紹介したいと思います。
また、このチュートリアルはAmazon純正のライブラリを利用していますが、AWS用のライブラリには様々なものがあり、この記事の最後ではそのひとつ、CloudFusionを紹介しようと思います。
なお、以下のチュートリアルのスクリプトの実行には、もちろんAWSアカウントが必要で、スクリプトの実行に応じてAWSの利用料が課金されます。チュートリアルには、例えば起動したEC2インスタンスを停止(Terminate)するなど、余計な課金がされないようにする手順は説明されていませんので、AWS Consoleや各種デベロッパーツールを利用して(あるいはチュートリアルの復習も兼ねて、そうしたプログラムを自作するなどして)、適宜対処してください。
チュートリアルのシナリオ
チュートリアルはビデオ共有サイトを題材にしており、AWSのうち、EC2、S3、SQS、SimpleDBを利用します。
- ウェブサーバはEC2でホストされる
- ユーザは任意の形式のビデオをサイトのファイルアップロードフォームからアップロードできる
- アップロードされたビデオはS3に保存され、SQSで管理されるバッチプロセスでFLVに変換される
- 変換されたビデオはS3に保存され配信される
- ビデオのメタデータはSimpleDBに記録される
一般的なビデオ共有サイトでは、ユーザから投稿される様々な形式のビデオを、共通の形式(一般的にFLV)に変換して視聴に供します。ビデオの変換は相応のリソースと時間を消費するため、バッチプロセスで処理され、キューシステムで管理されますが、チュートリアルではここにSQSを採用しています。また、バッチプロセスをウェブサーバとは別のコンピュータ(EC2インスタンス)に分離し、さらにそれらが複数に分散されることを想定し、変換前後のビデオはS3に保存します。
チュートリアルの著者について
チュートリアルの著者は、Feedsterを経て現在はAPIのマネージメントサービスを提供するMasheryのチーフアーキテクトを務めるClay Lovelessさんです。彼はオライリーのPHP Cookbook Second Editionの4つの章の著者であり、かつて存在していたpearified.comの運営者でもありました。また、このチュートリアルで使われるS3のストリームラッパー実装(Killersoft_Wrapper_S3)とSOAPクライアント(AWSSoapClient)は彼自身の手によるものです。
チュートリアルファイルのダウンロード
http://s3.killersoft.com/AWSforPHP/awsfiles.zip
チュートリアルのPHPスクリプトは、バージョン5.1.2以上のPHPでの実行を前提にしています。チュートリアルファイル中のcompatibility.phpで動作要件を確認できます。
チュートリアルはAmazon純正の以下のライブラリを利用します。
チュートリアルファイルにはこれらのライブラリが含まれていますが、それらはチュートリアルが執筆された時点のバージョンのものであり、最新のものではありません。当然、対象となるAPIバージョンもチュートリアルの執筆時点のものとなっている点に注意してください。
設定ファイルの作成
チュートリアルは/etc/aws.confファイルに保存された設定情報を利用します。
/etc/aws.confファイルに、Security Credentialsで表示されるAccess Key IDとSecret Access Key、及びAccount Numberを、以下の書式で記述します。
; AWS Security Credentials ; Access Key ID access_key = "06224BHAZ75910F2" ; Secret Access Key secret_key = "aIfbA2568+12TEqLDYpiqOyRULvi9" ; Account Number account_id = "123412341234"
さらに/etc/aws.confファイルに、チュートリアルのPHPスクリプトが作成するファイルを保存するディレクトリのパスを、以下の書式で追記しておきます。
; Path to writable directory where we can save files tutorial_file_path = "/tmp"
接続の確認
チュートリアルの最初に登場するPHPスクリプトは、avail-zones.phpです。このスクリプトは、EC2のゾーンの利用可否を問い合せるDescribeAvailabilityZonesリクエストを発行します。
$ php avail-zones.php <?xml version="1.0"?> <DescribeAvailabilityZonesResponse xmlns="http://ec2.amazonaws.com/doc/2008-05-05/"> ...
このスクリプトは最もプリミティブなRESTリクエストの作成例で、外部ライブラリに依存せずにURLをいちから組み立てています。そのため、スクリプトの実行で、/etc/aws.confファイルに記述したSecurity Credentialsの正当性が確認できるとともに、そのソースを読み解くことで、RESTリクエストのURLの構成、特にその署名(Signature)の作成方法が把握できるようになっています。
SOAPリクエスト
すべてのAWSはRESTとSOAPの両インタフェースで利用できます。チュートリアルは基本的にRESTを利用しますが、一部のスクリプトにはそのSOAP版も用意されています。
SOAPリクエストではX.509 Certificateが必要になります。Security CredentialsでX.509 Certificateを設定後、/etc/aws.confファイルに、cert-....pemファイルとpk-....pemファイルのパスを以下の書式で追記します。SOAPを利用しない場合は、この手順は不要です。
; X.509 Certificate Path cert_file = "/path/to/my/cert-....pem" ; RSA private key private_key_file = "/path/to/my/pk-....pem"
avail-zones-soap.phpは、avail-zones.phpのSOAP版です。
$ php avail-zones-soap.php us-east-1a: available ...
これ以降に登場するチュートリアルのPHPスクリプトはその冒頭でexample_setup.phpをインクルードしています。このexample_setup.phpは、/etc/aws.confファイルから設定情報を読み込み、あわせて各スクリプトが利用するクラスライブラリ用のオートロードを定義しています。
EC2インスタンスの起動
初めてチュートリアルに取り組む際は、実際にEC2インスタンスを起動する前に、まずec2-prelaunch.phpを実行して、キーペアの作成とセキュリティグループの設定を行います。
ec2-prelaunch.php
- DescribeKeyPairsリクエストで「awstutorial」キーペアの存在を確認
- キーペアが存在しない場合、CreateKeyPairリクエストでキーペアを作成し、プライベートキーを、/etc/aws.confファイルの「tutorial_file_path」で設定したディレクトリの「id_rsa-awstutorial」ファイルに保存
- DescribeSecurityGroupsリクエストで「awstutorial」セキュリティグループの存在を確認
- グループが存在しない場合、CreateSecurityGroupリクエストでグループを作成
- グループの設定でポート80とポート22が開放されていない場合、AuthorizeSecurityGroupIngressリクエストでポートを開放
$ php ec2-prelaunch.php Creating awstutorial keypair... generated fingerprint f3:e4:e6:c8:92:dd:f1:52:be:ea:a3:9d:75:57:ba:65:61:a7:a3:28 generated material