Semua artikel

Menyimpan File Aplikasi di Cloud Storage seperti Amazon S3

Cara menyimpan file upload, dokumen, dan media di object storage seperti Amazon S3: kapan lebih baik daripada disk server, bucket private dan presigned URL, upload langsung dari browser, CloudFront, storage class dan lifecycle, backup, biaya, dan alternatif yang kompatibel dengan S3.

Infrastruktur Cloud|Dipublikasikan |10 menit baca
Hard disk yang terbuka sehingga piringan dan head-nya terlihat

Hampir semua aplikasi bisnis menyimpan file: invoice, foto produk, dokumen KYC, kontrak yang sudah ditandatangani, hasil export, dan file yang di-upload pengguna. Banyak aplikasi awalnya menyimpan semua itu di folder di server aplikasi. Cara ini berjalan sampai server kedua ditambahkan, disknya penuh, atau server harus dibangun ulang dan tidak ada yang yakin file upload-nya ikut di-backup. Object storage seperti Amazon S3 menyelesaikan masalah-masalah ini, asalkan keamanan dan biayanya dipikirkan sejak awal.

Kenapa Pakai Object Storage daripada Disk Server

AspekFile di disk serverObject storage seperti S3
Menambah serverSetiap server butuh file yang sama, jadi harus pakai shared folder atau sinkronisasiSemua server membaca dan menulis ke bucket yang sama lewat API
KapasitasTerbatas ukuran disk, yang harus diperbesar seiring data bertambahPraktis tidak terbatas, dan Anda membayar sesuai data yang disimpan
Ketahanan dataTergantung backup dan RAID yang Anda siapkan sendiriS3 dirancang dengan durability 99,999999999 persen karena menyimpan salinan di beberapa fasilitas
Mengirim file ke penggunaSetiap unduhan memakai bandwidth dan worker server aplikasiPengguna mengunduh langsung dari storage atau CDN
Membangun ulang serverFile upload harus dipulihkan dulu sebelum aplikasi bisa berjalanServer tidak menyimpan file, jadi bisa diganti kapan saja

Perlu diingat, object storage berbeda dengan file system biasa. File disimpan sebagai object dengan key, misalnya invoices/2026/10/abc123.pdf, dan diakses lewat HTTP API. Mengganti nama folder berarti menyalin lalu menghapus semua object di dalamnya, dan tidak ada file locking. Kalau aplikasi dirancang untuk menulis file sekali lalu merujuknya lewat key, object storage sangat cocok.

Buat Bucket Tetap Private

Kebocoran data S3 paling sering berasal dari bucket yang dibuat public supaya praktis. Bucket baru di AWS sudah memblokir akses public secara default, dan pengaturan itu sebaiknya tetap aktif untuk semua bucket yang berisi data pelanggan. Untuk membagikan file, aplikasi membuat presigned URL: link sementara yang ditandatangani dengan kredensial aplikasi, berlaku beberapa menit, dan hanya untuk satu object. Pengguna yang berhak melihat sebuah invoice mendapat link yang berlaku lima menit. Orang lain yang menemukan link itu seminggu kemudian hanya akan melihat pesan error.

  • Beri aplikasi IAM role yang hanya bisa mengakses bucket miliknya sendiri, dan hanya untuk aksi yang dibutuhkan.
  • Jangan pernah menaruh access key AWS di kode frontend atau aplikasi mobile. Browser cukup menerima presigned URL dari backend.
  • Biarkan enkripsi default tetap aktif. Object baru di S3 otomatis terenkripsi, dan Anda bisa memakai key KMS kalau regulasi mengharuskan kontrol atas kuncinya.
  • Pisahkan bucket per environment, supaya script testing tidak mungkin menghapus file production.
  • Aktifkan server access logging atau CloudTrail data events untuk bucket berisi dokumen sensitif, supaya terlihat siapa mengakses apa.

Upload Langsung dari Browser

Mengirim video 200 MB lewat server aplikasi berarti satu worker tertahan selama proses upload, ditambah memakan memori dan bandwidth server. Cara yang lebih baik adalah membiarkan browser meng-upload langsung ke bucket dengan presigned URL. Aplikasi cukup mengecek hak akses, membuat URL, dan mencatat hasilnya.

  1. 1Browser meminta izin upload ke backend dengan mengirim nama, jenis, dan ukuran file.
  2. 2Backend mengecek hak akses pengguna dan batasan file, membuat key unik seperti UUID, lalu mengembalikan presigned URL atau presigned POST dengan syarat ukuran dan content-type.
  3. 3Browser meng-upload file langsung ke S3. File besar memakai multipart upload, jadi kalau koneksi putus, cukup satu bagian yang dikirim ulang.
  4. 4Browser memberi tahu backend bahwa upload selesai, lalu backend memastikan object-nya ada sebelum menyimpan key-nya ke database.
  5. 5Pekerjaan lanjutan seperti membuat thumbnail, mengambil teks dari dokumen, atau scan malware dijalankan di background job.

Upload dari browser butuh aturan CORS di bucket yang mengizinkan domain aplikasi Anda. Simpan key object di database, jangan URL lengkapnya, supaya nanti Anda bisa mengganti domain CDN atau pindah provider tanpa harus mengubah semua data. Hindari juga memakai nama file asli dari pengguna sebagai key, karena bisa berisi karakter yang bermasalah dan kadang memuat informasi pribadi.

Sajikan File Public Lewat CDN

Foto produk, banner, dan file lain yang memang untuk umum bisa disajikan lewat CloudFront di depan bucket private. Dengan Origin Access Control, hanya CloudFront yang boleh membaca bucket, jadi bucket-nya sendiri tetap private. Pengguna mengunduh lebih cepat dari lokasi edge terdekat, biaya transfer data lewat CloudFront biasanya lebih murah daripada langsung dari S3, dan Anda bisa menambahkan header cache supaya browser tidak mengunduh gambar yang sama berulang kali.

Pilih Storage Class dan Atur Lifecycle

Storage classCocok untukYang perlu diperhatikan
S3 StandardFile yang sering diakses, seperti upload aktif dan gambarHarga per GB paling tinggi di antara kelas yang umum dipakai
S3 Standard-IAFile yang disimpan lama tapi jarang dibuka, seperti invoice lamaAda biaya per GB saat file diambil, dan minimal ditagih 30 hari penyimpanan
S3 Intelligent-TieringData yang pola aksesnya sulit ditebakAda biaya monitoring kecil per object, yang terasa kalau jumlah file kecilnya jutaan
Kelas S3 GlacierArsip dan backup yang jarang dipulihkanMengambil data bisa butuh beberapa menit sampai beberapa jam tergantung kelasnya, dan ada masa simpan minimal

Lifecycle rule memindahkan object secara otomatis, misalnya ke Standard-IA setelah 90 hari dan ke Glacier setelah setahun, sekaligus menghapus file sementara seperti hasil export setelah seminggu. Tambahkan juga aturan untuk menghapus multipart upload yang tidak selesai. Upload yang terputus ini tidak terlihat di console, tapi tetap ditagih.

Lindungi dari Penghapusan dan Siapkan Backup

  • Aktifkan versioning untuk bucket berisi dokumen penting, supaya file yang tertimpa atau terhapus bisa dikembalikan.
  • Tambahkan lifecycle rule untuk versi lama. Tanpa aturan ini, versioning diam-diam bisa melipatgandakan biaya storage.
  • Replikasi bucket yang kritis ke region lain atau akun AWS lain, supaya satu akun yang dibobol tidak bisa menghapus semuanya.
  • Pakai Object Lock untuk backup yang tidak boleh diubah atau dihapus selama periode tertentu. Fitur ini juga melindungi dari ransomware.
  • Lakukan uji restore secara rutin. Backup yang belum pernah dicoba dipulihkan belum bisa dipastikan berfungsi.

Dari Mana Biayanya Datang

Tagihan S3 terdiri dari tiga komponen utama: penyimpanan per GB per bulan, jumlah request, dan transfer data keluar ke internet. Biaya penyimpanan biasanya paling bisa ditebak. Yang perlu diawasi adalah transfer data, terutama untuk aplikasi yang melayani banyak unduhan atau video. CDN atau provider tanpa biaya egress bisa mengubah hitungannya cukup jauh. Jumlah request mulai terasa kalau file kecilnya jutaan, karena request PUT lebih mahal daripada GET. Cek harga di region yang Anda pakai, termasuk region Jakarta, karena harganya berbeda antar region.

Alternatif yang Kompatibel dengan S3

API S3 sudah jadi standar umum, jadi kebanyakan library bisa dipakai dengan provider lain cukup dengan mengganti endpoint dan kredensial. Cloudflare R2 tidak menagih biaya egress, sehingga cocok untuk aplikasi yang banyak melayani unduhan. Google Cloud Storage, DigitalOcean Spaces, dan Wasabi juga pilihan yang umum. Beberapa provider cloud lokal di Indonesia juga menyediakan object storage yang kompatibel dengan S3, berguna kalau datanya harus tetap berada di dalam negeri. Untuk kebutuhan on-premise ada pilihan self-hosted seperti MinIO, tapi cek dulu status lisensi dan dukungan versi community-nya, dan ingat bahwa urusan ketahanan data dan backup jadi tanggung jawab Anda sendiri.

Memakainya dari Framework

  • Laravel: Storage facade dengan disk s3, yang juga bisa dipakai untuk provider kompatibel S3 dengan mengatur endpoint. Method temporaryUrl membuat presigned URL untuk unduhan.
  • Django: package django-storages dengan backend S3, sehingga FileField dan ImageField langsung tersimpan ke bucket.
  • Node.js: AWS SDK v3 untuk S3 ditambah package request presigner untuk membuat URL upload dan unduhan.
  • Go: AWS SDK for Go v2 dengan S3 client dan presign client-nya.

Sebelum go-live, coba buka salah satu URL file di jendela private browser tanpa login. Kalau dokumen pelanggan bisa terbuka, berarti bucket atau CDN-nya lebih terbuka dari yang Anda kira.

Poin penting

  • Pindahkan file upload dan dokumen dari disk server ke object storage, supaya server bisa ditambah dan diganti dengan bebas.
  • Buat bucket tetap private, beri aplikasi IAM role yang sempit, dan bagikan file lewat presigned URL yang masa berlakunya singkat.
  • Biarkan browser meng-upload langsung ke bucket, lalu simpan key object di database, jangan URL lengkapnya.
  • Pakai CloudFront untuk file public, lifecycle rule untuk data lama, dan versioning atau replikasi untuk dokumen penting.
  • Awasi biaya transfer data, dan pertimbangkan provider yang kompatibel dengan S3 kalau biaya egress atau lokasi data jadi pertimbangan.

Artikel terkait

Artikel lain tentang software development, AI, cloud, dan infrastruktur.

Layar komputer yang menampilkan desain landing page di samping tablet dan HP
Pengembangan Web|

Cara Membuat Website Company Profile yang Mendatangkan Calon Klien

Yang dibutuhkan website company profile supaya mendatangkan pertanyaan dari calon klien: halaman layanan yang jelas, bukti seperti studi kasus dan logo klien, kontak yang mudah, cepat dibuka di HP, dasar-dasar SEO, pilihan platform, dan tracking untuk melihat halaman mana yang menghasilkan leads.

Pelanggan membayar dengan HP di kasir toko
Pengembangan Software|

Cara Integrasi Payment Gateway seperti Midtrans dan Xendit dengan Aman

Cara mengintegrasikan payment gateway Indonesia seperti Midtrans atau Xendit: memilih metode pembayaran, halaman checkout bawaan atau API langsung, verifikasi webhook, menangani notifikasi ganda, desain status pesanan, masa berlaku pembayaran, refund, testing di sandbox, dan rekonsiliasi harian.

Sedang mencari partner untuk pengembangan software?

Ceritakan proyek yang sedang Anda bangun, kebutuhan yang ingin diselesaikan, dan tantangan yang dihadapi. Kami dapat membantu membahas pendekatan teknis, scope, timeline, dan estimasi biaya.

Mulai diskusi