Implementasi Amazon S3 Pada Laravel - CRUDPRO

Implementasi Amazon S3 Pada Laravel

AWS S3 menyediakan tempat untuk menyimpan file dari server. Ini memiliki beberapa keuntungan utama.

  1. Cadangan/redundansi - S3 dan sejenisnya memiliki cadangan dan redundansi bawaan
  2. Penskalaan - Menyimpan file di luar server menjadi penting di hosting modern, seperti lingkungan tanpa server, serta di lingkungan tradisional dengan beban seimbang
  3. Penggunaan disk-Jika Anda menyimpan file di cloud, Anda tidak memerlukan banyak ruang disk
  4. Fitur-S3 (dan cloud lainnya) memiliki beberapa fitur hebat seperti dukungan pembuatan versi file, aturan siklus hidup untuk menghapus (atau menyimpan lebih murah) file lama, perlindungan penghapusan, dan banyak lagi.

Menggunakan S3 sekarang (bahkan dengan pengaturan server tunggal) dapat mengurangi sakit kepala dalam jangka panjang. Inilah yang perlu Anda ketahui!

Konfigurasi

Ada dua tempat untuk menyiapkan S3.
  1. Di Laravel-biasanya melalui .env, tetapi juga di config/filesystem.php
  2. Di akun AWS Anda

Konfigurasi Laravel

Jika Anda memeriksa file config/filesystem.php, Anda dapat melihat bahwa s3 sudah menjadi opsi. Itu diatur untuk menggunakan variabel lingkungan dalam file .env.

Kecuali Anda perlu menyesuaikannya, Anda dapat membiarkannya apa adanya dan menyetel nilainya dalam file .env.

# Optionally Set the default filesystem driver to S3
FILESYSTEM_DRIVER=sqs
 
# Add items needed for S3-based filesystem to work
AWS_ACCESS_KEY_ID=xxxzzz
AWS_SECRET_ACCESS_KEY=xxxyyy
AWS_DEFAULT_REGION=us-east-2
AWS_BUCKET=my-awesome-bucket
AWS_USE_PATH_STYLE_ENDPOINT=false
File config/filesystem.php berisi opsi seperti berikut:
return [
    'disks' => [
        // 'local' and 'public' ommitted...
 
        '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),
        ],
    ],
];

Ada beberapa opsi yang tidak saya gunakan di file .env. Misalnya, Anda dapat mengatur AWS_URL. Ini berguna saat menggunakan awan penyimpanan file lain dengan API yang kompatibel dengan S3 seperti CloudFlare's R2 dan DigitalOcean's Spaces.

Konfigurasi AWS

Dalam AWS, Anda perlu melakukan dua hal:
  1. Buat bucket di layanan S3 Anda
  2. Buat pengguna IAM untuk mendapatkan key/kunci rahasia dan lampirkan kebijakan untuk mengizinkan pengguna tersebut mengakses S3 API.

Seperti hal lain di AWS, untuk membuat bucket di S3, Anda perlu melihat banyak opsi konfigurasi dan bertanya-tanya apakah Anda memerlukan salah satunya. Sebagian besar kasus penggunaan tidak!

Buka konsol S3, buat nama bucket (harus unik secara global, bukan hanya akun AWS Anda), pilih wilayah yang ingin Anda gunakan, dan beri label semua default (berlabel "blokir pengaturan akses publik"). ) "untuk bucket ini").

*Ya, beberapa opsi ini mungkin ingin Anda gunakan, tetapi Anda dapat memilihnya nanti.

Setelah membuat bucket, Anda memerlukan izin untuk melakukan sesuatu dengannya. Katakanlah Anda telah membuat sebuah bucket bernama "my-awesome-bucket".

Anda dapat membuat pengguna IAM dan memilih Akses Terprogram, tetapi Anda tidak dapat melampirkan kebijakan atau menyetel lainnya. Pastikan untuk mencatat kunci akses rahasia karena hanya akan ditampilkan sekali.

Kunci akses dan kunci akses rahasia harus ditempatkan di file .env.

Kemudian klik pengguna IAM untuk menambahkan kebijakan sebaris. Edit menggunakan editor JSON dan tambahkan yang berikut (langsung dari dokumen Flysystem):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1420044805001",
            "Effect": "Allow",
            "Action": [
                "s3:ListBuckets",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:ReplicateObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-awesome-bucket",
                "arn:aws:s3:::my-awesome-bucket/*"
            ]
        }
    ]
}

Ini memungkinkan Anda melakukan tindakan S3 API yang diperlukan di bucket baru.

Cara menggunakan Laravel

Di dalam Laravel, Anda dapat menggunakan penyimpanan file sebagai berikut:

# If you set S3 as your default:
$contents = Storage::get('path/to/file.ext');
Storage::put('path/to/file.ext', 'some-content');
 
# If you do not have S3 as your default:
$contents = Storage::disk('s3')->get('path/to/file.ext');
Storage::disk('s3')->put('path/to/file.ext', 'some-content');

File bernama `path/to/file.ext` ada di b`s3://my-awesome-bucket/path/to/file.ext` karena path ke file (dalam S3) ditambahkan ke nama bucket.

Direktori secara teknis tidak ada di S3. Di S3, file disebut "objek" dan jalur + nama file adalah "kunci objek". Jadi, di dalam bukcet "my-awesome-bucket", saya membuat objek menggunakan key `path/to/file.ext`.

Periksa area penyimpanan dokumen Laravel Anda untuk menemukan cara yang lebih nyaman untuk menggunakan penyimpanan, seperti streaming file dan URL sementara.

harga

S3 cukup murah-kebanyakan dari kita menghabiskan beberapa dolar sebulan untuk satu sen. Ini terutama benar jika Anda ingin menghapus file dari S3 setelah Anda selesai melakukannya, atau jika Anda ingin menetapkan aturan siklus hidup untuk menghapus file setelah jangka waktu tertentu.

Harga (kebanyakan) ditentukan oleh 3D. Harga bervariasi menurut wilayah dan penggunaan. Ini adalah contoh berdasarkan penggunaan aplikasi aktual pada bulan tertentu dari Chipper CI (aplikasi CI saya untuk Laravel), yang menyimpan sejumlah besar data di S3.

  1. Penyimpanan: $0,023 per GB, ~ 992GB ~ = $22,82
  2. Jumlah panggilan API: ~ 7 juta permintaan ~ = $ 12
  3. Penggunaan bandwidth: Ini sangat tidak akurat. Transfer data untuk biaya ini sekitar $23, yang tidak termasuk biaya bandwidth berbasis EC2.

Informasi yang berguna tentang S3

  1. Jika pengaturan AWS Anda memiliki server di jaringan pribadi Anda dan Anda menggunakan gateway NAT, pastikan untuk membuat S3 Endpoint (type ofi gateway). Ini dilakukan dalam endpoint layanan VPC. Hal ini memungkinkan panggilan ke dan dari S3 untuk melewati gateway NAT, menghindari biaya bandwidth tambahan. Tidak ada biaya tambahan untuk menggunakannya.
  2. Jika Anda khawatir tentang menimpa atau menghapus file, pertimbangkan untuk mengaktifkan pembuatan versi pada bucket S3 Anda.
  3. Pertimbangkan untuk mengaktifkan Intelligent Tiering pada bucket S3 Anda untuk menghemat biaya penyimpanan untuk file yang kemungkinan tidak akan berinteraksi kembali setelah kedaluwarsa.
  4. Perlu diingat bahwa menghapus bucket besar (file dalam jumlah besar) dapat memakan biaya. Ini karena jumlah panggilan API yang diperlukan untuk menghapus file.