新旧の版を併用する方法

このガイドでは、AWS SDK for PHPの第1版と第2版をインストール、設定し、 同じアプリケーションやプロジェクトで、新旧の版を併用する方法を解説します。 AWS SDK for PHPのコードを第2版に合わせて移行する手順については、 移行ガイド を参照してください。

AWS SDK for PHPの第2版には、第1版にあったAWSサービスがすべて組み込まれているので、すぐにでも移行作業を開始するようお勧めします。 コードの一部しか移行できない場合には、新旧の版を併用することも可能です。

SDKのインストールと組み込み

SDKをインストールし、プロジェクトに組み込む際には、Composerを使うかどうか選択しなければなりません。

Composerを使ってインストール

AWS SDK for PHPのインストールには、版にかかわらず、 Composer を使うようお勧めします。 これはPHP用の依存関係管理ツールで、プロジェクトが必要な (依存する) 対象を宣言し、 これに従って、該当するものをプロジェクトに組み込むことができます。 同じプロジェクトで新旧の版を併用する場合、Composerを使ってインストールするためには、以下の作業が必要です。

  1. 新旧両方のSDKを、依存対象としてプロジェクトの composer.json ファイルに記述する。

    {
        "require": {
            "aws/aws-sdk-php": "*",
            "amazonwebservices/aws-sdk-for-php": "*"
        }
    }
    

    注: 基幹アプリケーションを配備する場合、依存対象の版を細かく限定する (例: 2.0.*) ことも検討してください。

  2. Composerをダウンロード、インストールする。

    curl -s "http://getcomposer.org/installer" | php
    
  3. 依存対象を組み込む。

    php composer.phar install
    
  4. Composerのオートローダをrequireする。

    Composerはオートロードファイルを作成します。 ダウンロードしたライブラリに属するクラスを、すべてオートロードするためのファイルです。 次のrequire文をコードのブートストラッププロセスに追加するだけで、オートロードの機能が使えるようになります。

    require '/path/to/sdk/vendor/autoload.php';
    

Composerをインストールし、オートロードの設定をする手順や、依存関係を適切に定義する方法については、 getcomposer.org を参照してください。

Composerを使わずにインストール

Composerを使わない場合、プロジェクトの依存関係を自分で管理しなければなりません。

  1. 新旧両方のSDKを (PEAR、GitHub、AWSウェブサイトのいずれかから) ダウンロードし、プロジェクトからアクセスできる場所に置く。 AWS SDK for PHP 2の依存対象をすべて収容した、aws.phar ファイルを使うこと。

  2. コードのブートストラップ処理では、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の設定とインスタンス生成

SDKの設定/インスタンス生成の手順は、サービスビルダ (Aws\Common\Aws クラス) を使うか否かによって異なります。

サービスビルダを介したクライアントのインスタンス生成

AWS SDK for PHP に付属のサービスビルダ (Aws\Common\Awsクラス) を使えば、 同じ証明書を用いるサービスクライアントを一括して設定できます。 クライアントのいくつかまたはすべての追加での設定も可能です。

サービスビルダには、証明書やその他の事項を記述した、設定ファイルを渡すことができます。 するとサービスビルダは、アプリケーションが生成するサービスクライアントすべてに、この設定事項を反映させます。 設定ファイルについて詳しくは、ガイドの 設定 節を参照してください。 新旧のSDKを併用する場合、設定ファイルには次の記述が必要です。

'includes' => array('_sdk1'),

この記述があると、SDK第1版を用いるサービスクライアントが、サービスビルダを介し、 v1.s3v1.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やサービスビルダを用いた、推奨する方法に従っています。

例1 - Amazon S3のクライアントを2つ生成

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";

例2 - Amazon DynamoDBおよびAmazon SNSのクライアント

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 を参照してください。