【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にファイルごとにアップする時のサンプルはこちらの記事のも書いています。
Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)
- 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/03/23
- メディア: 単行本
- この商品を含むブログを見る
Amazon Web Services実践入門 (WEB+DB PRESS plus)
- 作者: 舘岡守,今井智明,永淵恭子,間瀬哲也,三浦悟,柳瀬任章
- 出版社/メーカー: 技術評論社
- 発売日: 2015/11/10
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る