こんにちは。植松です。
今回はAWS S3へサーバの中にあるファイルをアップロードする実装をご紹介します。
AWS SDK for PHPを使います。

AWS SDK for PHPのメリット

AWS SDKを使用するメリットは、AWSの各種サービス(S3やDynamoDB、EC2など)に対して安全かつ効率的にアクセスできるように設計されている点です。
個別のHTTPリクエストを構築する手間もなく、EC2インスタンスにIAMロールをアタッチしている場合、
SDKが自動的にそのIAMロールの認証情報を利用してAPIリクエストを安全に送信してくれます。
S3でいえば、大きなファイルの分割アップロード(multipart upload)や、S3バケットのオブジェクトバージョニングも簡単に実行が可能です。

手順

前提条件として、アップロード先のS3バケットの作成やアクセス権の設定は終わっているものとします。
今回はEC2上に実装するので、EC2に対象バケットへのアップロード権限をもつIAMロールをアタッチしておきました。

1. AWS SDK for PHPのダウンロード

AWS SDK for PHPはComposerもしくは公式からZIPでDLできます。
弊社ではレンタルサーバも案件によっては使うことがあり、その場合Composerは利用できないので
今回は公式サイトからZIPでDLする方法を取りました。

公式サイトはこちら

2. ZIPファイルの展開

DLしたZIPを解凍し、実行環境へ配置します。
今回は /var/www/html/vendor/aws へ配置しました。

3.コードを実装


// ZIPから展開したAWS SDKのオートローダーを読み込み
require '/path/to/aws-sdk-php/vendor/aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
// S3クライアントの作成
$s3Client = new S3Client([
    'version' =--> 'latest',
    'region'  => 'ap-northeast-1', // 適切なリージョンに置き換えてください
]);
// アップロードしたいファイル
$bucketName = 'bucket-name'; // S3バケット名
$csvFilePath = '/path/to/your/file.csv'; // アップロードするCSVファイルのローカルパス
$keyName = 'uploads/file.csv'; // S3上での保存先(フォルダ/ファイル名)
try {
    // CSVファイルのアップロード
    $result = $s3Client->putObject([
        'Bucket' => $bucketName,
        'Key'    => $keyName,
        'SourceFile' => $csvFilePath,
        'ACL'    => 'private', // ファイルをアップロードしたバケットのオーナー(EC2やIAMユーザー)以外はアクセスできない設定
    ]);
    echo "File uploaded successfully. S3 URL: " . $result['ObjectURL'] . "\n";
} catch (AwsException $e) {
    echo "Error uploading file: " . $e->getMessage() . "\n";
}

・コードのポイント

AWS SDK for PHPにはオートローダーが含まれているので、aws-autoloader.phpファイルを読み込む必要があります。
PHPスクリプトに以下のコードを追加し、SDKを使用できるようにします。
require '/path/to/aws-sdk-php/vendor/aws-autoloader.php';
今回の場合 /var/www/html/vendor/aws/aws-autoloader.php となります。

4. 動作確認

PHPファイルを実行し、CSVがS3にアップロードされるか確認してください。

php upload-to-s3.php

5. まとめ

今回はSDKを使って簡単にアップロードするコードを実装してみました。
アップロードだけではなくダウンロードも可能なので、サーバとS3を連携するシステムを構築する際は
積極的に利用したいですね。

AWS公式のSDKサンプルコードはこちらで確認できます。