へろへろもへじ

(ブログタイトル募集中)

AWS SDK for PHP 2でAmazonS3のファイルを移動してみた

追記・修正

2014-11-29

id:DQNEOさんよりご指摘を頂き、オブジェクト数が1001件以上だった場合でも対応できるよう、コードを修正しました。id:DQNEOさんありがとうございました!




バージョン2系のSDKでは、「S3Client」クラスを利用することでS3の操作を行うことになりますが、
一発でファイルを移動するメソッドが(たぶん)用意されていません。(moveObjectとかあると楽なんですが...)
なので、copyObjectとdeleteObjectメソッドを使うことで実現しました。
また、前回SQSを操作したとき*1は、PEARパッケージからインストールしましたが、今回はComposerで。

ComposerでAWS SDK for PHP 2をダウンロードする

カレントディレクトリにcomposer.jsonを用意し、以下を定義する。

{
    "require": {
        "aws/aws-sdk-php": "2.*"
    }
}

*2

Composerをダウンロードする

curl -sS https://getcomposer.org/installer | php

AWS SDK for PHP 2をダウンロードする

php composer.phar install

これでカレントディレクトリにvenderというディレクトリが作成され、その中にcomposer.jsonで定義したパッケージ(今回だとAWS SDK for PHP 2)がダウンロードされます。

AWS SDK for PHP 2を使ってファイル移動

<?php

require './vendor/autoload.php';

use Aws\S3\S3Client as S3Client;

$s3 = S3Client::factory(array(
  'key' => 'your access key',
  'secret' => 'your secret key',
));

$marker = null;
while (true) {
    // コピー元のオブジェクト一覧を取得
    if (is_null($marker)) {
      $pamans = array(
          'Bucket' => 'コピー元のバケット名',
          'Prefix' => 'コピー元のディレクトリ名'
      );
    } else {
      $pamans = array(
          'Bucket' => 'コピー元のバケット名',
          'Prefix' => 'コピー元のディレクトリ名',
          'Marker' => $marker
      );
    }

    $list_objects = $s3->listObjects($pamans);

    $contents = $list_objects['Contents'];
    foreach($contents as $item) {
        $key = $item['Key'];
        // ファイル名のみ切り出し
        $from_file = end(explode('/', $key));

        // まずコピー
        $s3->copyObject(array(
            'Bucket' => 'コピー先のバケット名',
            'Key' => "コピー先のディレクトリ/$from_file",
            'CopySource' => "コピー元のバケット/$key"
        ));

        // コピーが終わったので削除
        $s3->deleteObject(array(
            'Bucket' => 'コピー元のバケット',
            'Key'    => "コピー元のディレクトリ/$from_file"
        ));
    }

    if (!$list_objects['IsTruncated']) {
        // IsTruncatedがfalseの場合、全てのコンテンツの処理が完了したのでループを抜ける
        break;
    }

    $marker = $list_objects['NextMarker'];
}

exit(0);

こんな感じでできました。Composerは機会があれば仕事でも積極的に使っていきたいですね。

*1:前回のエントリはこちら→AWS SDK for PHP 2でAmazonSQSをいじってみた - へろへろもへじ

*2:2.*はaws/aws-sdk-php - Packagistを参照し、適宜変更してください