【初心者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

これでバケットにファイルが作成していたら完了です。

filecreate

まとめ

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

スポンサーリンク