【PHP】AWS SDKを使用してS3オブジェクトをダウンロードする方法
こんにちは、みよしやです。
今回は、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でしたが、他の組み合わせについての記事も今後書きたいと思います。