share facebook facebook twitter menu hatena pocket slack

2011.12.09 FRI

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

三浦 悟

WRITTEN BY 三浦 悟

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

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

ここで、以下のようなプログラムでvp_sample.csvとwelcome.txtを削除するコードを書きます。

$ vi bulk_delete.php
-------------------------------------------
#!/usr/bin/php -q
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);

ここで、初期化の引数に渡している下記のファイルがどこにも存在していないことが原因のようです。
SDKのバグのようなので、これを直してみます。

$this->multi_object_delete_xml

ここで、まず238行目あたりに、下記のようにクラスのプロパティを追加します

public $multi_object_delete_xml;

さらに238行目あたりの__construct内で、他のXMLのタグ文字列の初期化と同じく、以下のように初期化します。

$this->multi_object_delete_xml = '';

これで、再度実行してみます。

$ php bulk_delete.php
done.

無事、成功しましたので、実際削除されたのか確認します。

削除されていました。

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

Bug: PHP SDK 1.4.8 Multi Object Delete (patch)

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、

三浦 悟

三浦 悟

高円寺在住のなんじゃ系男子 またの名をmemorycraftといいます。 炭水化物大好き 日々の「なんじゃ?」を記事にしてます。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。