2011年12月9日金曜日

S3ってなんじゃ?(SDKで複数S3オブジェクトを一括削除:SDKバグの修正パッチつき)

S3で複数のS3オブジェクトを指定して一括で削除できるようになりました。
早速PHPのSDKで試してみたいと思います。

delete_objectsというメソッドが追加されていますので、これを使ってみます。
対象のバケットには以下のようにファイルがあります。


ここで、以下のようなプログラムでvp_sample.csvとwelcome.txtを削除するコードを書きます。
$ vi bulk_delete.php
-------------------------------------------
#!/usr/bin/php -q
<?php
require_once '/opt/aws/php/default/sdk.class.php';

$bucket = 'hoge-bucket';

$s3 = new AmazonS3('AccessKey','SecretKey');
$s3->set_region(AmazonS3::REGION_APAC_NE1);

$response = $s3->delete_objects ($bucket, array(
        'objects' => array(
                array('key' => 'vp_sample.csv'),
                array('key' => 'welcome.txt')
        )
));
echo "done."
?>


これを実行します。

$ php bulk_delete.php
PHP Notice:  Undefined property: AmazonS3::$multi_object_delete_xml in /opt/aws/php/sdk-1.4.8/services/s3.class.php on line 1406
PHP Fatal error:  Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /opt/aws/php/sdk-1.4.8/services/s3.class.php:1406
Stack trace:
#0 /opt/aws/php/sdk-1.4.8/services/s3.class.php(1406): SimpleXMLElement->__construct('')
#1 /opt/cloudpack/test/bulk_delete.php(21): AmazonS3->delete_objects('hoge-bucket', Array)
#2 {main}
  thrown in /opt/aws/php/sdk-1.4.8/services/s3.class.php on line 1406

。。。。。
エラーになりました。

なんでしょう?
/sdk-1.4.8/services/s3.class.php を調べてみると、delete_objectsメソッド内でSimpleXMLObjectの初期化に失敗しているようです。

1406行目の
$xml = new SimpleXMLElement($this->multi_object_delete_xml);

ここで、初期化の引数に渡している
$this->multi_object_delete_xml
がどこにも存在していないことが原因のようです。SDKのバグですね。
これを直してみます。

ここで、まず238行目あたりに、
public $multi_object_delete_xml;

とクラスのプロパティを追加し、

さらに238行目あたり、__construct内で、他のXMLのタグ文字列の初期化と同じように、以下のように初期化します。
$this->multi_object_delete_xml = '<?xml version="1.0" encoding="utf-8"?><MultiObjectDelete></MultiObjectDelete>';


これで、再度実行してみます。
$ php bulk_delete.php
done.

おお、成功しました。

実際削除されたのか確認します。

いけてますね。

この修正パッチをAWSのフォーラムにアップしましたので、必要な方は自己責任でご利用ください。
またパッチ内容に問題があればご一報いただけると助かります。

Bug: PHP SDK 1.4.8 Multi Object Delete (patch)
https://forums.aws.amazon.com/thread.jspa?threadID=81967&tstart=0

以上です。

追記:2011/12/21
このバグは1.4.8.1で修正されたようです。
https://forums.aws.amazon.com/thread.jspa?threadID=81967&tstart=0&messageID=299617#299617