このガイドでは、AWS SDK for PHPの第1版と第2版をインストール、設定し、 同じアプリケーションやプロジェクトで、新旧の版を併用する方法を解説します。 AWS SDK for PHPのコードを第2版に合わせて移行する手順については、 移行ガイド を参照してください。
AWS SDK for PHPの第2版には、第1版にあったAWSサービスがすべて組み込まれているので、すぐにでも移行作業を開始するようお勧めします。 コードの一部しか移行できない場合には、新旧の版を併用することも可能です。
SDKをインストールし、プロジェクトに組み込む際には、Composerを使うかどうか選択しなければなりません。
AWS SDK for PHPのインストールには、版にかかわらず、 Composer を使うようお勧めします。 これはPHP用の依存関係管理ツールで、プロジェクトが必要な (依存する) 対象を宣言し、 これに従って、該当するものをプロジェクトに組み込むことができます。 同じプロジェクトで新旧の版を併用する場合、Composerを使ってインストールするためには、以下の作業が必要です。
新旧両方のSDKを、依存対象としてプロジェクトの composer.json ファイルに記述する。
{
"require": {
"aws/aws-sdk-php": "*",
"amazonwebservices/aws-sdk-for-php": "*"
}
}
注: 基幹アプリケーションを配備する場合、依存対象の版を細かく限定する (例: 2.0.*) ことも検討してください。
Composerをダウンロード、インストールする。
curl -s "http://getcomposer.org/installer" | php
依存対象を組み込む。
php composer.phar install
Composerのオートローダをrequireする。
Composerはオートロードファイルを作成します。 ダウンロードしたライブラリに属するクラスを、すべてオートロードするためのファイルです。 次のrequire文をコードのブートストラッププロセスに追加するだけで、オートロードの機能が使えるようになります。
require '/path/to/sdk/vendor/autoload.php';
Composerをインストールし、オートロードの設定をする手順や、依存関係を適切に定義する方法については、 getcomposer.org を参照してください。
Composerを使わない場合、プロジェクトの依存関係を自分で管理しなければなりません。
新旧両方のSDKを (PEAR、GitHub、AWSウェブサイトのいずれかから) ダウンロードし、プロジェクトからアクセスできる場所に置く。
AWS SDK for PHP 2の依存対象をすべて収容した、aws.phar ファイルを使うこと。
コードのブートストラップ処理では、SDK第1版のブートストラップファイルと
SDK第2版を収容した aws.phar ファイルを、明示的にrequireする必要がある。
// Include each of the SDK's bootstrap files to setup autoloading
require '/path/to/sdk.class.php'; // Load the Version 1 bootstrap file
require '/path/to/aws.phar'; // Load the Version 2 pre-packaged phar file
SDKの設定/インスタンス生成の手順は、サービスビルダ (Aws\Common\Aws クラス) を使うか否かによって異なります。
AWS SDK for PHP に付属のサービスビルダ (Aws\Common\Awsクラス) を使えば、
同じ証明書を用いるサービスクライアントを一括して設定できます。
クライアントのいくつかまたはすべての追加での設定も可能です。
サービスビルダには、証明書やその他の事項を記述した、設定ファイルを渡すことができます。 するとサービスビルダは、アプリケーションが生成するサービスクライアントすべてに、この設定事項を反映させます。 設定ファイルについて詳しくは、ガイドの 設定 節を参照してください。 新旧のSDKを併用する場合、設定ファイルには次の記述が必要です。
'includes' => array('_sdk1'),
この記述があると、SDK第1版を用いるサービスクライアントが、サービスビルダを介し、 v1.s3 、 v1.cloudformation などのキーでアクセスできるようになります。
SDK第1版を参照する旨を記述した設定ファイルの例を示します:
<?php return array(
'includes' => array('_sdk1'),
'services' => array(
'default_settings' => array(
'params' => array(
'key' => 'your-aws-access-key-id',
'secret' => 'your-aws-secret-access-key',
'region' => 'us-west-2'
)
)
)
);
コードでは、設定ファイルのパスを渡してファクトリメソッドを呼び出し、サービスビルダのインスタンスを生成します。 次いで、戻り値であるビルダオブジェクトから、該当するサービスクライアントのインスタンスを取得します。
use Aws\Common\Aws;
// Instantiate the service builder
$aws = Aws::factory('/path/to/your/config.php');
// Instantiate S3 clients via the service builder
$s3v1 = $aws->get('v1.s3'); // All Version 1 clients are prefixed with "v1."
$s3v2 = $aws->get('s3');
個々のサービスクライアントに対応する factory() に、証明書その他、設定データの配列を渡して、そのインスタンスを生成することもできます。
factory() は新旧どちらのSDKを用いるクライアントに対しても使えます。
use Aws\S3\S3Client;
// Create an array of configuration options
$config = array(
'key' => 'your-aws-access-key-id',
'secret' => 'your-aws-secret-access-key',
);
// Instantiate Amazon S3 clients from both SDKs via their factory methods
$s3v1 = AmazonS3::factory($config);
$s3v2 = S3Client::factory($config);
クラスに別名を与えて、どちらの版から生成したものか明確にするのもよいでしょう。
use AmazonS3 as S3ClientV1;
use Aws\S3\S3Client as S3ClientV2;
$config = array(
'key' => 'your-aws-access-key-id',
'secret' => 'your-aws-secret-access-key',
);
$s3v1 = S3ClientV1::factory($config);
$s3v2 = S3ClientV2::factory($config);
新旧のSDKをインクルードし、設定し、インスタンスを生成する、完全な例を2つ示します。 Composerやサービスビルダを用いた、推奨する方法に従っています。
Amazon S3のクライアントをAWS SDK for PHPから生成し、第1版から生成したAmazon S3クライアントと併用する例です。
<?php
require 'vendor/autoload.php';
$aws = Aws\Common\Aws::factory('/path/to/config.json');
$s3v1 = $aws->get('v1.s3');
$s3v2 = $aws->get('s3');
echo "ListBuckets with SDK Version 1:\n";
echo "-------------------------------\n";
$response = $s3v1->listBuckets();
if ($response->isOK()) {
foreach ($response->body->Buckets->Bucket as $bucket) {
echo "- {$bucket->Name}\n";
}
} else {
echo "Request failed.\n";
}
echo "\n";
echo "ListBuckets with SDK Version 2:\n";
echo "-------------------------------\n";
try {
$result = $s3v2->listBuckets();
foreach ($result['Buckets'] as $bucket) {
echo "- {$bucket['Name']}\n";
}
} catch (Aws\S3\Exception\S3Exception $e) {
echo "Request failed.\n";
}
echo "\n";
AWS SDK for PHP 2から生成したDynamoDBクライアントと、第1版のSDKから生成したSNSクライアントを共存させる例です。 この例では、アイスクリームパーラが (SNSを使って)、「本日のフレーバ」を紹介する 日々のメッセージを購読者に送ります。 まずAWS SDK for PHP DynamoDBのクライアントを使って、DynamoDBから本日のフレーバを取得します。 次にSNSクライアント (第1版のSDK) を使って、メッセージを送信しています。
<?php
require 'vendor/autoload.php';
$aws = Aws\Common\Aws::factory('/path/to/config.php');
// Instantiate the clients
$ddb = $aws->get('dynamodb');
$sns = $aws->get('v1.sns');
$sns->set_region(AmazonSNS::REGION_US_W2);
// Get today's flavors from DynamoDB using Version 2 of the SDK
$date = new DateTime();
$flavors = $ddb->getItem(array(
'TableName' => 'flavors-of-the-day',
'Key' => array(
'HashKeyElement' => array('N' => $date->format('n')),
'RangeKeyElement' => array('N' => $date->format('j'))
)
))->getResult()->getPath('Item/flavors/SS');
// Generate the message
$today = $date->format('l, F jS');
$message = "It's {$today}, and here are our flavors of the day:\n";
foreach ($flavors as $flavor) {
$message .= "- {$flavor}\n";
}
$message .= "\nCome visit Mr. Foo\'s Ice Cream Parlor on 5th and Pine!\n";
echo "{$message}\n";
// Send today's flavors to subscribers using Version 1 of the SDK
$response = $sns->publish('flavors-of-the-day-sns-topic', $message, array(
'Subject' => 'Flavors of the Day - Mr. Foo\'s Ice Cream Parlor'
));
if ($response->isOK()) {
echo "Sent the flavors of the day to your subscribers.\n";
} else {
echo "There was an error sending the flavors of the day to your subscribers.\n";
}
既に述べたように、 クライアントのインスタンスを、旧SDKから、AWS SDK for PHP 2の サービスビルダを使って生成しても、クライアントの動作は変わりません 。 例えば、SDKの版による応答の処理方法の違いに着目してみましょう。 版による違いはすべて、 移行ガイド に記載してあります。
旧SDKの使い方について詳しくは、 Version 1 API Documentation および Version 1 SDK README を参照してください。