TBD

仕事の事・日常の事

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ストリームラッパーを使用するため、登録する。


バケット一覧表示

少ない HTTP リクエストで再帰的に取得する方法。


データのダウンロード・アップロード・移動

移動はドキュメントだと利用方法が分かりづらい。 移動元、移動先のパスを渡すことで、mvコマンドっぽく利用出来る。


以下は、動作確認に使用した環境と構築の流れ。


作業環境

macOS

・composer 1.10.13

FuelPHP 1.8.2

AWS SDK for PHP 3.152.1


環境構築

インフラ

個人ブログや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