EC2のLaravelでAmazon S3にファイル送受信・削除する手順・プログラム

こんにちは!
エンジニアの岩間です。

今回は、EC2にインストールしたLaravelでAmazon S3にファイル送受信・削除する手順をご紹介します。

 

目次

この記事でご紹介すること

  • EC2とS3の接続する方法
  • LaravelからファイルをS3に保存する方法
  • LaravelでS3からファイルダウンロードする方法
  • LaravelでS3からファイル削除する方法

をご紹介していきます。

環境情報

以下環境情報です。

OS Almalinux9 (AWS EC2 Marketplaceにて選択、Tokyoリージョン)
Laravel 9.4
PHP 8.1
Composer 2.5.1

EC2とS3を接続する

まずはLaravelをインストールしたEC2とS3を接続します。

方法としては、S3にアクセスできるIAMポリシーを割り当てたIAMロールを作成し、そのIAMロールを対象のEC2に割り当てます。

VPCのエンドポイント経由での通信となるため、外にでることなくセキュアな通信ができます。

早速設定していきましょう。

 

①S3バケットを作成する

最初にS3バケットを作成します。

AWSコンソール画面からS3を検索、「バケットを作成する」ボタンをクリックします。

 

以下のように設定します。

バケット名 任意のバケット名を設定
リージョン EC2のリージョンに合わせる
オブジェクト所有者 ACL無効(推奨)
パブリックアクセス すべてブロック
バケットのバージョニング 任意
デフォルトの暗号化 任意

入力できたら、「バケットを作成」ボタンをクリックしてバケットを作成します。

これでS3バケットの作成完了です。

 

②IAMロールを設定する

次にEC2にアタッチするためのIAMロールを設定します。

AWSコンソール画面からIAMを検索、画面左のメニュー内の「ロール」をクリックします。

「ロールを作成」ボタンをクリックします。

以下の画像のように設定し、「次へ」をクリックします。

 

許可の追加の画面に遷移したら、「ポリシーを作成」をクリックしてIAMポリシーを新規作成します

以下の画像のようにJSONを記述します。

「次のステップ:タグ」→「確認」でIAMポリシーを作成します。

 

以下は、JSONでの設定内容詳細です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ReplicateObject", // レプリケーション許可する場合は追加
                "s3:PutObject",       // オブジェクトをバケットに追加する許可
                "s3:GetObjectAcl",    // S3からオブジェクトを取得する許可
                "s3:GetObject",       // オブジェクトのアクセス制御リスト (ACL) を返す許可
                "s3:ListBucket",      // リクエストの認証済み送信者が所有するすべてのバケットのリストを返す許可
                "s3:DeleteObject",    // オブジェクトの削除許可
                "s3:PutObjectAcl"   // サブリソースを使用してacl、S3 バケット内の新規または既存のオブジェクトのアクセス コントロール リスト (ACL) アクセス許可 
            ],            
            "Resource": [
                "arn:aws:s3:::バケット名",
                "arn:aws:s3:::バケット名/*"
            ]
        }
    ]
}

 

IAMポリシーを作成したら、先ほどのIAMロールの許可を追加画面で作成したIAMポリシーをチェックし、「次へ」をクリックします。

確認画面でIAMロール名を入力し、「ロールを作成」をクリックします。

これでIAMロールの作成が完了です。

 

③EC2インスタンスにIAMロールをアタッチする

次は、上記で作成したIAMロールをEC2インスタンスにアタッチしていきます。

AWSコンソール画面からEC2を検索、左メニューの「インスタンス」をクリックします。

対象のインスタンスにチェックをいれ、右上の「アクション」→「セキュリティ」→「IAMロールを変更」をクリックします。

 

以下の画像のような画面に遷移するので、先ほど作成したIAMロールを選択し、「IAMロールの更新」ボタンをクリックします。

 

これでEC2にIAMロールを設定することができました。

 

④Laravelの設定

次は、Laravel側の設定を行っていきます。

1.composerでflysystem-aws-s3-v3をインストールする

Laravelプロジェクトフォルダで以下のコマンドを実行します。

composer require league/flysystem-aws-s3-v3 --with-all-dependencies

(--with-all-dependenciesで依存関係にあるパッケージのみupgradeする)

これでS3接続に必要なパッケージがインストールできました。

 

2..envファイルに設定を追記する

Laravelの.envファイルを開き、以下の設定を追記します。

AWS_ACCESS_KEY_ID=                 // 空白
AWS_SECRET_ACCESS_KEY=             // 空白
AWS_DEFAULT_REGION=ap-northeast-1  // S3のリージョン
AWS_BUCKET='バケット名'              // S3バケット名
AWS_URL=https://s3.ap-northeast-1.amazonaws.com/バケット名

 

以上で、Laravel⇔S3の接続設定は完了です。

 

Laravelプログラム

ここまででLaravel⇔S3の接続に必要な設定ができました!

次は実際のファイル操作に必要なプログラムを書いていきます。

ファイルアップロード

アップロードされたファイルをLaravelでS3に保存するサンプルプログラムです。

ファイルアップロードフォームから「アップロード」ボタンをクリックすると、アップロードしたファイルをS3に送信、保存できるようにします。

まずはファイルアップロードフォームをHTMLでつくります。

HTML

<form action="{{ route('upload') }}" enctype="multipart/form-data" method="POST">
@csrf 
<input name="upload_file" type="file" /> 
<button>アップロード</button>
</form>

 

「アップロード」ボタンがクリックされると、S3Controllerクラスのupload関数内の処理が走るようにします。

ルーティング

Route::post('/upload', [\App\Http\Controllers\S3Controller::class, 'upload'])->name('upload');

 

コントローラー

※アップロード先S3フォルダ名に「test」を指定しています。S3バケットの「フォルダの作成」から作成できます。

<?php
namespace App\Http\Controllers\S3Controller;
use Illuminate\Http\UploadedFile;
use Storage;
use Request;

class S3Controller extends Controller
{
   /**
    * S3へのアップロード 
    */
   public function upload(Request $request)
   {

      // アップロードされたファイルを変数に格納
      $upload_file = $request->file(‘upload_file’);

      // ファイルがアップロードされた場合
      if(!empty($upload_file)) {

         // アップロード先S3フォルダ名 
         $dir = 'test';

         // バケット内の指定フォルダへアップロード ※putFileはLaravel側でファイル名の一意のIDを自動的に生成してくれます。
         $s3_upload = Storage::disk('s3')->putFile('/'.$dir, $upload_file);

         // ※オプション(ファイルダウンロード、削除時に使用するS3でのファイル保存名、アップロード先のパスを取得します。)
         // アップロードファイルurlを取得
         $s3_url = Storage::disk('s3')->url($s3_upload);
 
         // s3_urlからS3でのファイル保存名取得
         $s3_upload_file_name = explode("/", $s3_url)[5];

         // アップロード先パスを取得 ※ファイルダウンロード、削除で使用します。
         $s3_path = $dir.'/'.$s3_upload_file_name;
      }

      return view('sampleview');
   }
}

 

ファイルダウンロード

ファイルダウンロードはS3ファイルパスを使用してダウンロードします。

LaravelでS3からファイルダウンロードするサンプルプログラムです。

 

コントローラー

/**
 * S3からダウンロード
 */
public function downloadS3()
{
   // ファイル名(ここでは例としてtest.pdfという名前でダウンロードするよう指定しています。)
   $file_name = 'test.pdf';

   // メディアタイプ取得 $s3_pathは初回アップロード時に取得したs3のファイルパスを指定しています。※上記アップロードのコントローラ参照
   $mimeType = Storage::disk('s3')->mimeType($s3_path);

   // ダウンロードする際のファイル名をContent-Dispositionで指定
   $headers = [
     'Content-Type' => $mimeType,
     'Content-Disposition' => 'attachment; filename="' . $file_name . '"'
   ];

   return $headers;

}

 

ファイル削除

ファイル削除もファイルダウンロードと同様にS3ファイルパスを使用してダウンロードします。

LaravelでS3に保存したファイルを削除するサンプルプログラムです。

 

コントローラー

/**
 * S3からファイル削除
 */
public function deleteS3()
{
   // S3からファイル削除実行 $s3_pathは初回アップロード時に取得したs3のファイルパスを指定しています。※上記アップロードのコントローラ参照
   Storage::disk('s3')->delete($s3_path);

   // 画面表示処理
   return view('sampleview');
}

 

まとめ

お疲れさまでした!

以上、EC2のLaravelでAmazon S3にファイル送受信・削除する手順・プログラムのご紹介でした。

ここまでお読みいただきありがとうございました。

この記事が気に入ったら
いいね ! しよう

Twitter で

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ