AWS SDK for PHPを利用したS3操作〜オブジェクト移動も可能〜
触る機会があったため、AWS SDK for PHPを利用したS3操作について、整理しておく。 AWSで必要なリソースを構築し、FuelPHPを利用したアプリでS3を操作する例。
アプリ開発
ファイルはソース構成に合わせて作成・配置する。 実際にはクラス作成して、個別にラッパー関数とするのが良い気がする。 以下ではコードだけまとめる。
<?php // インポート設定 require 'fuel/vendor/autoload.php'; // FuelPHPのパスに合わせて設定 use Aws\S3\S3Client; // S3操作をするため設定 use Aws\Exception\AwsException; // SDK全般の例外 use Aws\S3\Exception\S3Exception; // S3固有の例外 // 認証情報取得 use Aws\Credentials\CredentialProvider; // 認証情報を取得するため設定 try { $provider = CredentialProvider::instanceProfile(); $memoizedProvider = CredentialProvider::memoize($provider); } catch (AwsException $e) { echo $e->getMessage(); } // S3クライアント認証情報設定 $client = new S3Client([ 'region' => 'ap-northeast-1', 'version' => 'latest', 'credentials' => $memoizedProvider, 'debug' => true // debug指定すると検証時にエラーログが詳細に見れる。 ]); // S3ストリームラッパー登録 try { $client->registerStreamWrapper(); } catch (S3Exception $e) { echo $e->getMessage(); } // バケット一覧表示 try { $iter = Aws\recursive_dir_iterator('s3://bucket/key'); foreach ($iter as $filename) { echo $filename . "\n"; } } catch (S3Exception $e) { echo $e->getMessage(); } // データのダウンロード try { $data = file_get_contents('s3://bucket/key'); } catch (S3Exception $e) { echo $e->getMessage(); } // データのアップロード try { file_put_contents('s3://bucket/key', 'Hello!'); } catch (S3Exception $e) { echo $e->getMessage(); } // データの移動 try { rename('s3://bucket/src', 's3://bucket/dist'); } catch (S3Exception $e) { echo $e->getMessage(); }
インポート設定
AWS SDK for PHP バージョン 3 の基本的な使用パターン - AWS SDK for PHP
インポート設定を追加する。
認証情報取得
認証情報プロバイダの使用 - AWS SDK for PHP
認証情報を取得する。今回はインスタンスプロファイルから取得する。
S3クライアント認証情報設定
S3クライアントを定義し、認証情報を設定する
S3ストリームラッパー登録
AWS SDK for PHP バージョン 3 での Amazon S3 ストリームラッパー - AWS SDK for PHP
S3操作に辺り、S3ストリームラッパーを使用するため、登録する。
バケット一覧表示
データのダウンロード・アップロード・移動
移動はドキュメントだと利用方法が分かりづらい。 移動元、移動先のパスを渡すことで、mvコマンドっぽく利用出来る。
以下は、動作確認に使用した環境と構築の流れ。
作業環境
・composer 1.10.13
・FuelPHP 1.8.2
環境構築
インフラ
個人ブログやQiitaでIAMユーザーのアクセスキー、シークレットアクセスキーをハードコーディングしている例をよく見かける。 アンチパターンであり、実運用ではまず使われないと考えているので、IAMロールを利用した例をまとめる。 検証用のEC2にS3アクセス権限を付与したIAMユーザーを設定し、EC2で利用する。 構築にはCloudFormationを利用する。
検証用EC2構築
※CloudFormation定義記載予定。
検証用S3構築
※CloudFormation定義記載予定。
検証用IAMロール作成
※CloudFormation定義記載予定。
検証用EC2インスタンスプロファイル構築
※CloudFormation定義記載予定。
アプリ
composerインストール
macにcomposerが入っていないので、Homebrew利用でインストール。
brew install composer
FuelPHPプロジェクト作成
フレームワークはFuelPHPを利用する。composerでプロジェクト作成する。
composer create-project fuel/fuel:1.8.2 aws_php_sdk
余談だが、composer create-project
は指定したプロジェクトをgit cloneしてから、composer installしているらしい。
Command-line interface / Commands - Composer
AWS SDK for PHPインストール
AWS SDK for PHP バージョン 3 のインストール - AWS SDK for PHP
プロジェクトのディレクトリ配下で下記を実行。 fuel/vendor/aws/aws-sdk-php配下にsdkがインストールされる。
composer require aws/aws-sdk-php