【初心者AWS S3+PHP】S3にファイルをアップロード!composer使いません!!
どうも!ヒグッティ(twitter→ヒグッティ@システムエンジニア)です!
今回はPHPでS3にファイルをアップロードします!awsのライブラリはzipを利用しています!composerなどは使いません!既存のサーバにzipを展開するだけでS3を利用できるようになります。
ローカルPCで動かせるように構築も詳細に説明していきます!
目次
やりたいこと
- PHPでS3にファイルをアップロード。
- AWSのライブラリはzipを利用。
全体の流れ
- 環境周りの設定(ローカルPC)
- AWSのライブラリの配置
- S3アップロードサンプルコードの説明、実行
- まとめ
環境
- Docker(Docker Engine v20.10.24)
- Windows11
Dockerの設定
DockerFileなど諸々の設定です。
以下、docker-compose.ymlとDockerFileです。
version: '3'
services:
web:
build:
context: ./php
dockerfile: Dockerfile
volumes:
- ../www:/var/www/html
- ../lib:/var/www/lib
- ./php/php.ini:/usr/local/etc/php/php.ini
ports:
- 80:80
FROM php:8.2-apache
# Update image
RUN apt-get clean && apt-get update -y
COPY ./php.ini /usr/local/etc/php/php.ini
サンプルコードのディレクトリ配置
以下、ディレクトリ配置です。
├─lib → AWSのライブラリを入れるところ
│ └─aws
├─dockerlocal → Docker周りのファイル入れるところ
│ ├─php
│ │ ├─Dockerfile
│ │ └─php.ini
│ └─docker-compose.yml
└─www → S3にアップロードするサンプルファイル
├─S3upload.php
└─hello.txt → アップロードするファイル
AWSのライブラリを配置する
以下のURLからライブラリをダウンロードして、lib(任意のディレクトリ)に配置してください。
https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/getting-started_installation.html
.zip ファイルをダウンロードって箇所をクリックするとダウンロードできます。
S3バケットの確認
今回はS3バケットを作成する作業は割愛します。以下のバケット、ディレクトリにファイルをアップロードします。

サンプルコードを確認!
以下のソースコードを見ていきます。
<?php
/**
* S3にアップロードする
*/
require '../lib/aws/aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
$bucket = 'your Bucket Name';
$s3key = 'your key';
$s3secretKey = 'your secret key';
$s3 = new S3Client([
'credentials' => [
'key' => $s3key,
'secret' => $s3secretKey,
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
try {
$result = $s3->putObject([
'Bucket' => $bucket,
'Key' => 'receive/hello.txt',
'SourceFile' => 'hello.txt',
'ACL' => 'private'
]);
// Print the URL to the object.
echo $result['ObjectURL'] . PHP_EOL;
} catch (S3Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
最初に注目する箇所は「require '../lib/aws/aws-autoloader.php’」ですね。この行でS3にファイルをアップロードするためのライブラリを読み込みます。
次は、バケット名とアクセスキーの設定です。以下は自分で作成した情報を入力します。アクセスキーはユーザを作成した時にしか、払い出されないので無くさないように情報を保管しましょう!
$bucket = 'your Bucket Name';
$s3key = 'your key';
$s3secretKey = 'your secret key';
次はアップロードするメソッドのです。
$result = $s3->putObject([
'Bucket' => $bucket,
'Key' => 'receive/hello.txt',
'SourceFile' => 'hello.txt',
'ACL' => 'private'
'Key’に設定する値は、バケット内のディレクトリとファイル名です。ACLはprivateにしていますが、他には以下の値が設定可能です。
- private
- public-read
- public-read-write
- authenticated-read
- aws-exec-read
- bucket-owner-read
- bucket-owner-full-control
詳細は公式ドキュメントを参照してください。全部英語です、、、
https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject
今回は以下のソースを参考にさせていただきました。AWS公式のサンプルです。よかったら参考にしてください。
https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/php/example_code/s3/s3-uploading-object.php
実行してみよう!
Dockerにログインしてみましょう。
docker exec -it コンテナ名 /bin/bash
実際にサンプルコードを実行してみます。
cd /var/www/html
php S3upload.php
これでバケットにファイルが作成していたら完了です。

まとめ
今回はPHPからS3にファイルをアップロードしてみました。やはり簡単ですね。awsのライブラリのおかげで、ほとんど何もしなくてもアップロードできます。公式ドキュメントや公式のサンプルがgitにあるので捗りますね!
今回はzipからライブラリを取得しましたが、本来はcomposerなどを利用した方良いですよね、、でもオンプレ環境などでやむおえない場合などあると思うので、参考になればと思います!
ACL周りの権限が運用では大事になると思いますが、ひとまずprivateなら安全です!!
ちなみにS3は3円/1GB/1か月ほどなのでめちゃくちゃ安い!!