AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

S3バケットから正規表現にマッチするファイル一覧を取得

S3バケット内のファイルを、正規表現にマッチしたものだけ取り出したいのですが、以前のSDKにはあったメソッドが、現在のv2にはなかったので、それっぽいものを作ってみました。

v2 に map_string( $pcre )

次のコマンドで、イテレーターオブジェクトを取得。

その後、ファイル名だけを配列として取り出して、map_string()で変換。という流れで作ってみてます。

<?php
// 関数 map_string (SDK v1を少し改造版)
function map_string($ilist, $pcre = null)
{
	$list = array_map('strval', $ilist);
	$dlist = array();

	if ($pcre)
	{
		foreach ($list as $item)
		{
			$dlist[] = preg_match($pcre, $item) ? $item : null;
		}
		$list = array_values(array_filter($dlist));
	}
	return $list;
}

// s3クライアント
$iterator = $s3->getIterator('ListObjects', array(
    'Bucket' => 'backet-name'
));

// 取得したイテレーター内のファイル名一覧を作成した関数にかける
$dlist = array();
$nlist = array();
$pattern = '/*.txt/'

foreach ($iterator as $object) {
    echo $object['Key'] . "\n";
    $dlist[] = $object['Key'];
}

$nlist = map_string($dlist, $pattern);
?>

AWS SDK for PHP 1 の場合

get_object_list () メソッドのオプションとして正規表現を設定できます。
SDK内部で preg_match() を使ってフィルタが実装されていました。

その他

v2 でも UploadSyncGuilderクラスには、uploadFromGlobメソッドがありglob()と同じようにアップロード対象が絞り込めます。こちらは、PHP5.3から提供されているイテレータークラスを使って実装されていました。

もしかするとこちらの方向でも、実装できるのかもしれませんが理解が足りなかったので、今回は前述の方法で解決することにしました。

イテレータークラスについては、次のサイトが詳しくわかりやすかったです。


あと余談ですが、今回 AWS SDK のソースを追いかけてみて、オープンソースの恩恵を受けてるなぁと感じました。ここまで追いかけることってこれまでなかったので。感謝。


(ところで、うまくHatenaBlogのPHPシンタックスハイライトされない。。。JavaScriptとしてみたら少々ましになった)