そらとぶへび

仕事・プライベートを通しての気づき、JavaやPHP、データベースやサーバの話などこつこつと書いていきます

AWS S3へのファイルアップロード

[環境]
AWS EC2
php:5.6.30
FuelPHP:1.8

AWS SDK for PHPを使って、S3にファイルをアップロード・ダウンロードする方法をまとめます。
バージョンによって違ったりするので、今回使用した一連のパターンをまとめました。

なお、使用したバージョンはAWS SDK for PHP(バージョン3)です。
公式サイト
screenshot

S3にアクセスするユーザとポリシーを作成

IAMにてユーザとポリシーを作成します。
ポリシーには、利用したいActionの権限を指定します。(今回はs3:GetObjectとs3:PutObjectのみ。)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
            ],
            "Resource": "arn:aws:s3:::dms-*"
        }
    ]
}

AWS SDK for PHPパッケージのインストー

fuel配下にあるcomposer.jsonをviで開き、requireの配列に下記を追加します。

        "aws/aws-sdk-php": "3.*"

コンソールに戻り、composerでアップデート処理を行います。

php composer.phar update

正常にインストールされると、vendorフォルダ以下にaws-sdk-phpがインストールされます。


アップロード用のクラスを作成

[classaws.php]

<?php
use \Aws\S3\S3Client;
use \Aws\S3\Exception\S3Exception;

class ClassAWS{

	private static function uploadS3($filepath,$filenm){
		$s3 = S3Client::factory(\Config::get('s3_access_key'));
		// バケット名
		try {
			$result = $s3->putObject(array(
					'Bucket' => \Config::get('s3_contents_bucket'),
					'Key' => 'logo/' . $filenm,
					'Body'   => fopen($filepath,'rb'),
			));

		} catch (S3Exception $exc) {
			echo "アップロード失敗";
			echo $exc->getMessage();
		}
	}
}

必要最低限のものしか指定していません。
その他のパラメータの記載は公式のAPI仕様を参照ください。
AWS SDK for PHP 3.x


ステージ環境と本番環境でキーやバケットが異なるので、環境別のConfig.phpに追記しました。

[config.php]

<?php

return array(
	/*  AWS設定 */
	's3_access_key' => array(
			"key" => "XXXXXXXXXXXXXXXXXXXX",                         // IAMでユーザ作成時に入手したaws_access_key_id 
			"secret" => "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",  //IAMでユーザ作成時に入手したaws_secret_access_key
			"region" => 'ap-northeast-1',//Region::AP_NORTHEAST_1    // AP_NORTHEAST_1はtokyo region
			'version'           => '2006-03-01',
			'signature_version' => 'v4'
		),
	's3_contents_bucket' => 'static-contents',  //静的コンテンツ格納バケット名

このクラスを呼びだして使用します。

\ClassAWS::uploadS3($filepath,$filenm);

まとめ

一度設定してしまえば、あとは簡単にS3を利用したアップロード&ダウンロードができます。
ぜひ一度使ってみてください。