unoh.github.com

Amazon Web Services入門: PHPとEC2/S3/SQS/SimpleDBで作るビデオ共有サイト

Sun Jan 03 00:36:48 -0800 2010

新年あけましておめでとうございます、五十川です。

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のうち、EC2S3SQSSimpleDBを利用します。

一般的なビデオ共有サイトでは、ユーザから投稿される様々な形式のビデオを、共通の形式(一般的に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

  1. DescribeKeyPairsリクエストで「awstutorial」キーペアの存在を確認
  2. キーペアが存在しない場合、CreateKeyPairリクエストでキーペアを作成し、プライベートキーを、/etc/aws.confファイルの「tutorial_file_path」で設定したディレクトリの「id_rsa-awstutorial」ファイルに保存
  3. DescribeSecurityGroupsリクエストで「awstutorial」セキュリティグループの存在を確認
  4. グループが存在しない場合、CreateSecurityGroupリクエストでグループを作成
  5. グループの設定でポート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