AWS S3
Konfigurasi Amazon S3 dengan IAM, CORS, dan variabel env S3_* TurboJet.
Amazon S3 adalah API S3 asli yang diimplementasikan provider lain. Pakai ini jika Anda sudah di AWS atau butuh integrasi erat dengan ekosistem AWS.
1. Buat bucket S3
Di konsol AWS S3, buat bucket:
- Pilih nama unik global dan region dekat pengguna Anda
- Biarkan Block all public access aktif
- Versioning opsional tetapi berguna di production
Jaga bucket tetap privat
TurboJet memakai URL terpresign untuk unggah dan unduh. Akses publik tidak diperlukan.
2. Buat pengguna IAM
Di konsol IAM, buat pengguna untuk app dan lampirkan policy yang di-scope ke bucket Anda:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::your-app-bucket",
"arn:aws:s3:::your-app-bucket/*"
]
}
]
}Buat access key di Security credentials dan salin Access Key ID serta Secret Access Key.
3. Konfigurasi CORS
Bucket → Permissions → Cross-origin resource sharing (CORS):
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedOrigins": [
"https://your-marketing-domain.com",
"http://localhost:3001"
],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 3600
}
]Ganti origin dengan URL marketing nyata dan port lokal Anda.
4. Variabel environment
S3_ACCESS_KEY_ID="your-aws-access-key-id"
S3_SECRET_ACCESS_KEY="your-aws-secret-access-key"
S3_ENDPOINT="https://s3.us-east-1.amazonaws.com"
S3_REGION="us-east-1"
S3_BUCKET="your-app-bucket"Gunakan region bucket Anda. Pola endpoint: https://s3.<region>.amazonaws.com.
5. Uji unggahan
Jalankan app marketing dan ikuti Unggah file sambil masuk.
CloudFront (opsional)
Untuk latensi lebih rendah di production, taruh distribusi CloudFront di depan bucket dengan Origin Access Control (OAC) agar bucket tetap privat.
FAQ
Berapa biaya S3?
Harga berbeda per region dan kelas. S3 Standard kurang lebih sen per GB-bulan plus biaya request dan egress. Cek harga AWS S3 terkini. Untuk egress berat, bandingkan Cloudflare R2.
Apakah akses publik diperlukan?
Tidak. Pakai /api/storage/signed untuk file privat.
Bagaimana membatasi tipe atau ukuran file?
Edit packages/validations/src/storage/storage.ts — batas itu ditegakkan saat membuat URL unggah.