Sử dụng AWS S3 để lưu trữ file trong Laravel

Giới thiệu

Một website dạng bình thường không cần lưu trữ quá nhiều hình ảnh, video hay các tệp tin khác thì bạn có thể lưu trữ luôn ngay trên hosting, server của mình. Nhưng một số website đặc thù cần lưu trữ một lượng lớn tệp tin mà hosting, server không đáp ứng được thì bắt buộc phải sử dụng dịch vụ bên thứ 3 để lưu trữ.
Amazon S3 (Simple Storage Service) là một dịch vụ tuyệt vời để lưu trữ tệp tin phổ biến nhất trong công nghệ điện toán đám may hiện nay, nó lưu trữ tệp tin như một object trong các bucket
Bài viết này, mình xin giới thiệu với các bạn cách sử dụng AWS S3 để lưu trữ file trong các dự án Laravel

Cấu hình AWS S3

Tạo tài khoản riêng cho S3

Để quản lý S3, ta nên tạo một tài khoản riêng chỉ để quản lý S3 để dễ dàng quản lý hơn
Đăng nhập vào AWS Console bằng tài khoản tạo bằng Gmail. Sau đó chọn My Security Credentials
Màn hình AIM hiện ra, click tạo User. Điền tên tài khoản sẽ quản lý S3 như hình
PS: Chọn programe thì chỉ tạo ra access_key để truy cập S3
Chọn dòng tiếp theo sẽ tạo mật khẩu để đăng nhập vào Console
Sau đó click Next, hiện ra màn hình set quyền chọn S3FullAccess Sau đó click Next 2 lần là đã tạo tài khoản thành công Các thông tin được tạo ra gồm có

  • Đường dẫn dạng Account ID.signin.aws.amazon.com
  • Account và Password để đăng nhập AWS S3
  • AWS_ACCESS_KEY_ID:
  • AWS_SECRET_ACCESS_KEY:

Tạo bucket

Đăng nhập vào AWS S3 bằng tài khoản đã tạo Các bạn vào trang https://aws.amazon.com/s3/ để đăng ký tài khoản
Sau đó vào https://console.aws.amazon.com/console tìm và chọn S3
Chọn create bucket
Chọn next, có một số dịch vụ bạn có thể chọn enable nó lên, không thì bỏ qua và tiếp tục bấm next
Để mặc định và tiếp tục bấm next, nó sẽ tự tạo bucket cho mình
Sau đó, chọn vào quản lý bucket vừa tạo để set quyền truy cập vào file sẽ xử lý
Access for bucket owner: List objects, Write objects, Read bucket permissions
Public access Everyone: List objects

Sử dụng S3 để lưu trữ file trong Laravel

Thiết lập file .env

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
AWS_URL=
FILESYSTEM_DRIVER=s3

Thiết lập filesystems.php

'cloud' => env('FILESYSTEM_CLOUD', 's3'),

'disks' => [
     ...

    's3' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => 'us-east-1',
        'bucket' => env('AWS_BUCKET'),
        'url' => env('AWS_URL'),
    ],

],

Cài thư viện

Như trên docs của laravel có ghi là để sử dụng S3 driver bạn sẽ phải cài thư viện league/flysystem-aws-s3-v3 Mở terminal lên và chạy

composer require league/flysystem-aws-s3-v3

Các thao tác sử dụng

Mình đã tạo một project để demo. Các bạn có thể tham khảo mã nguồn Tại đây

Thao tác upload file lên S3

    public function postUpload(StoreImage $request)
    {
        $path = Storage::disk('s3')->put('images/originals', $request->file, 'public');
        $request->merge([
            'size' => $request->file->getClientSize(),
            'path' => $path
        ]);
        $this->image->create($request->only('path', 'title', 'size'));
        return back()->with('success', 'Image Successfully Saved');
    }

Hiển thị file ra view

<th><img width="100px" src="{{$image->url}}"></th>

Thao tác xóa file trên S3

public function destroy(Image $image)
{
    $path = $image->path;
    $image->delete();
    Storage::disk('s3')->delete($image->path);
    return back()->with('success', 'Image Successfully Saved');
}

Tài liệu tham khảo

Dùng Amazon S3 để lưu trữ file trong Laravel
Giới thiệu về filesystem storage trong Laravel
Laravel: Upload file to AWS S3 in 20 minutes challenge