動的に生成したファイルをAWS SDK 2 for PHPでEC2からS3に転送する

AWS SDK 3ならStreamが使えるので、比較的簡単に転送できると思うんだけど、環境が稼働済みのPHP 5.3だったので下手にバージョンアップすることが許さない。

さらに、フレームワークはZend frameworkとEthnaっていう初めて聞いたフレームワークを、外注先の会社独自frameworkがwrapしてるっぽくて、この先一体どうなっちゃうの!?状態。

結果から書くとまる1日半かかって対応したので、恐らく参考にならないけどその対応方法。
(ちなみにその外注先の会社、どうやら知り合いの会社っぽくて業界狭すぎと思った。)

最初はAWS SDK 3 for PHPでAmazon S3 Stream Wrapperって言うのがあるので、これ使ったら簡単じゃんって思って突っ込んだらエラーが出る。

エラー出てる場所を見たらyieldでエラーを吐いていて、バージョン確認したら前述のとおり5.3でした。

しょうがないのでAWS SDK 2 for PHP(バージョン2.8.12)に入れ替えます。
AWS SDKを読み込むのに

require_once("AWS-SDK/aws-autoloader.php");

としてるのだが、この中身は以下の通り、spl_autoload_registerで多数のファイルを__autoloadに登録しているだけである。

<?php
$mapping = array(
    'Aws\AutoScaling\AutoScalingClient' => __DIR__ . '/Aws/AutoScaling/AutoScalingClient.php',
    'Aws\AutoScaling\Enum\LifecycleState' => __DIR__ . '/Aws/AutoScaling/Enum/LifecycleState.php',
~省略~
    'Symfony\Component\EventDispatcher\Tests\GenericEventTest' => __DIR__ . '/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php',
    'Symfony\Component\EventDispatcher\Tests\ImmutableEventDispatcherTest' => __DIR__ . '/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php',
);

spl_autoload_register(function ($class) use ($mapping) {
	if (isset($mapping[$class])) 
	{
        require $mapping[$class];
    }
}, true);

実行してみるとZend_Exceptionが出た。

独自フレームワークで__autoloadにZend_Loader::loadClassを指定しているのだが、sql_autoload_registerを使うと__autoloadが無効化されたらしく、クラスを読み込めなかったらしい。

調べると、__autoloadはsql_autoload_registerに指定できるとの記事を見つけたので以下のようにする。

require_once("AWS-SDK/aws-autoloader.php");
spl_autoload_register("__autoload");

これでエラーは出なくなったので実際にEC2からS3にアップロードする。
コードは大体以下の通り(実際はtry-catchとか色々してる)

$client = Aws\S3\S3Client::factory(array(
			'key' => 'hoge',
			'secret' => 'fuga',
			'region' => Aws\Common\Enum\Region::AP_NORTHEAST_1,
		));
$client->putObject(array(
			'Bucket' => 'Bucket-name',
			'Key' => 'path/to/file',
			'Body' => Guzzle\Http\EntityBody::factory(resource),
			'ACL' => Aws\S3\Enum\CannedAcl::PUBLIC_READ,
		));

こうすることによって、https://s3-ap-northeast-1.amazonaws.com/Bucket-name/path/to/file(もしくはhttps://Bucket-name.s3-ap-northeast-1.amazonaws.com/path/to/file)で外部からアクセスすることが出来る。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中