🖼️

Laravelで画像をAWS S3にアップロードする方法

に公開

今回はAWS S3へ画像アップロードする手順を解説します
この記事ではAWS側の設定からLaravel側のコード実装まで、実際に動作するコードとともにステップバイステップで紹介する流れです

使用技術

  • AWS S3
  • PHP: 8.4
  • Composer:2.8.8
  • Laravel: 12.0

1.IAMユーザーの権限設定

使用するユーザーポリシーに「AmazonS3FullAccess」の書き込み権限を付与します

■ダッシュボード「IAM」→「ユーザー」→「許可を追加」

2.IAMユーザーのアクセスキー作成

アプリ側からAWSへ接続できるように、アクセスキーを発行します



「アクセスキー」「シークレットアクセスキー」が発行されます
後ほどenvファイルで使うためCSVファイルをダウンロードし、完了ボタンを押してください

3.S3のバケット作成

バケットを作成します
バケットとはファイルを区別するフォルダのようなものです
※リージョンは予め「東京」を設定ください

■ダッシュボード「S3」→「汎用バケット」→「バケットを作成」

  • AWS リージョン:アジアパシフィック (東京) ap-northeast-1
  • バケットタイプ:汎用
  • バケット名:任意の名前
  • オブジェクト所有者:ACL無効
  • このバケットのブロックパブリックアクセス設定:パブリックアクセスをすべて ブロック
  • バケットのバージョニング:無効にする
  • デフォルトの暗号化
    • 暗号化タイプ:Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
    • バケットキー:有効にする



3.Laravel側の設定

ここからはアプリ側のLaravelを設定していきます

flysystem-aws-s3-v3インストール

composer require league/flysystem-aws-s3-v3

.env

AWS_ACCESS_KEY_ID=[IAMユーザーのアクセスキー]
AWS_SECRET_ACCESS_KEY=[IAMユーザーのシークレットアクセスキー]
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=[バケット名]

config/filesystems.php

's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
    'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
    'throw' => false,
    'report' => false,
],

Controller

public function store(StoreRequest $request): RedirectResponse
{
    if ($request->hasFile('image')) {
        $image = $request->file('image');
        $fileName = time() . '_' . $image->getClientOriginalName();

        $s3 = Storage::disk('s3');
        $result = $s3->putFileAs('', $image, $fileName);

        if ($result) {
            $imageUrl = $s3->url($result);
            return back()->with('status', 'アップロード成功: ' . $imageUrl);
        }
    }
}

blade.php

<div class="sm:col-span-4">
    <label for="image" class="block text-sm font-medium text-gray-700">
        画像<span class="text-red-500">*</span>
    </label>
    <div class="mt-1">
        <input type="file" name="image" id="image" accept="image/*" required>
    </div>
</div>

設定は以上です
画像から画像を登録すると、、、


無事バケットへアップロード出来ていることが確認できます

まとめ

今回は、LaravelとAWS S3を連携した画像アップロード機能の実装方法について解説しました
本記事が参考になれば幸いです!

Discussion