気ままに

プログラム関連で困ったことを調べて気ままに投稿

【AWS】PHPでローカルとS3のファイルを同期する処理を作ってみたよ

サイトにアップされた画像をS3に個別にアップしようと思ったけど、すでに処理が書かれているプログラムを改修するのが大変だったので、 画像アップのディレクトリごとS3にアップすることにしたよ。

以下のAmazonのサイトを参考にしながら書いたんだけど、ソースコードが通してで書かれていないので、個別に実行してもアップできない。。 なので、動くプログラムを公開 Amazon S3 Transfer Manager - AWS SDK for PHP

getenv 関数で環境変数に設定しているIAMの情報とS3バケット名を読み込んでいるので、 環境変数に設定できない場合は直接書き換えるか変数化するなりして適宜読み替えてください。

<?php
require '../vendor/autoload.php';

try {
    $client = new Aws\S3\S3Client([
                'credentials' => [
                    'key' => getenv('AWS_ACCESS_KEY_ID'),
                    'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
                ],
                'region' => 'ap-northeast-1',
                'version' => 'latest',
    ]);

    $bucket = getenv('S3_BUCKET_NAME');

    $image_path = '/upload/
    $source = $image_path;
    $dest = 's3://' .$bucket . $image_path;

    $uploader = new Aws\S3\Transfer($client, $source, $dest, [
        'before' => function (\Aws\Command $command) {
            // Commands can vary for multipart uploads, so check which command
            // is being processed
            if (in_array($command->getName(), ['PutObject', 'CreateMultipartUpload'])) {
                // Set custom cache-control metadata
                $command['CacheControl'] = 'max-age=3600';
                // Apply a canned ACL
                $command['ACL'] = 'public-read';
            }
        },
    ]);

    // 非同期処理
    $promise = $uploader->promise();

    // 転送処理
    $uploader->transfer();

    // 非同期処理が成功した時の処理
    $promise->then(function() {
        echo 'Done';
    });

    // 非同期処理に失敗した時の処理
    $promise->otherwise( function ($reason) {
        echo 'fail';
        var_dump($reason);
    } );

// 非同期処理で対応しているので必要かもしれないけど、念の為
} catch(Exception $e) {
    echo $e->getMessage();
}

?>

AWSのドキュメントは、ちゃんと書かているけど、ソースコードが断片的すぎて、そのままだと実行できるサンプルになっていないことがおおのと、 サンプルごとに変数名が違っているので、?となるのが難点ですね。

S3にファイルごとにアップする時のサンプルはこちらの記事のも書いています。

unot13.hatenablog.com

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)