【PHP】AWS SDKを使用してS3オブジェクトをダウンロードする方法

#PHP
written by みよしや

こんにちは、みよしやです。

今回は、AWS SDK for PHP 3を使用して、S3オブジェクトをダウンロードする方法について書いていきます。

 

AWS SDK for PHP のインストール

composerコマンドによる直接インストールが一番簡単です。
自動で最新バージョンをインストールしてくれます。。
※サーバーにcomposerがインストールされていることが前提となります。

$ composer require aws/aws-sdk-php

プロジェクトのベースディレクトリで上記コマンドを実行

 

S3オブジェクトのダウンロード処理実装

[検証環境]
サーバ:EC2 AmazonLinux2
PHP:バージョン 7.4.11 (cli)
AWS SDK for PHP: バージョン 3.183

require_once('[プロジェクトのベースディレクトリ]/vendor/autoload.php');

まず、composerのオートローダーファイルを読み込みます。

 

use Aws\S3\S3Client;

// S3Clientインスタンス生成
$s3Client = S3Client::factory([
     'credentials' => [
           'key'    => [アクセスキー],
           'secret' => [シークレットアクセスキー],
     ],
     'region'  => 'ap-northeast-1',
     'version' => 'latest',
]);

// IAMロールを利用する場合は、下記のように認証情報を指定せずに生成
$s3Client = S3Client::factory([
     'region'  => 'ap-northeast-1',
     'version' => 'latest',
]);

次に、S3Clientのインスタンスを生成します。

 

$result = $s3Client->getObject([
     'Bucket' => [対象のバケット名],
     'Key'    => [対象のファイル名(フルパス)]
]);

指定のバケットからオブジェクトをダウンロードします。

 

use GuzzleHttp\Psr7\Stream; 

$body = $result['Body']->getContents();

返却オブジェクトから必要なフィールドを取得します。
※$result[‘Body’]にはGuzzleHttp/Psr7/Streamクラスのオブジェクトが入っています。
この出力ストリームを文字列に変換するにはgetContents関数を使用します。

 

サンプルコード

require_once('/var/www/html/sample/vendor/autoload.php');
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
use GuzzleHttp\Psr7\Stream;

try {
     // S3Clientインスタンス生成(IAMロールを使用)
     $s3Client = S3Client::factory([
          'region'  => 'ap-northeast-1',
          'version' => 'latest',
     ]);

     // S3からオブジェクトを取得
     $result = $s3Client->getObject([
          'Bucket' => 'sample-bucket',
          'Key'    => 'contents/sample.jpg'
     ]);

     // ステータスコードを判定
     if ($result['@metadata']['statusCode'] != 200) return;

     // bodyの出力ストリームを文字列に変換して返却
     return array (
          'contentType' => $result['@metadata']['headers']['content-type'],
          'body'        => $result['Body']->getContents(),
     );

} catch (S3Exception $e) {
     // 指定したファイルが見つからないなど、S3エラー発生時はここでキャッチされる
     error_log($e->getMessage());
     return;
}

 

最後に

最近のインフラ構築はAWS主流のため、プログラムとAWSサービスで連携する機会は多くなってきています。
今回はPHP×S3でしたが、他の組み合わせについての記事も今後書きたいと思います。