آمازون S3
AWS S3
مدیریت فایل در Amazon S3 و سرویسهای سازگار مانند MinIO و Arvan Cloud
نمای کلی
نود AWS S3 ابزاری قدرتمند برای مدیریت ذخیرهسازی ابری Object Storage است.
Amazon S3 چیست؟
Amazon Simple Storage Service (S3) یکی از محبوبترین سرویسهای ذخیرهسازی ابری دنیاست که فایلها را به صورت Object در Bucketها ذخیره میکند. S3 مقیاسپذیری نامحدود، دسترسی بالا (99.999999999% durability) و قیمتگذاری بر اساس مصرف ارائه میدهد.
مدل Bucket/Object:
- Bucket: مخزن اصلی فایلها (مانند پوشه ریشه)، نام آن باید در کل جهان منحصر به فرد باشد
- Object: هر فایل ذخیره شده شامل Key (مسیر)، Value (محتوا) و Metadata
- Prefix: شبیهسازی پوشهبندی با / در Key (مثل: images/2024/photo.jpg)
Storage Classes (کلاسهای ذخیرهسازی):
- S3 Standard: دسترسی مکرر، بالاترین سرعت
- S3 Intelligent-Tiering: جابجایی خودکار بر اساس الگوی دسترسی
- S3 Standard-IA: دسترسی نادر، ارزانتر
- S3 One Zone-IA: یک منطقه، ارزانترین برای داده غیرحیاتی
- S3 Glacier: آرشیو بلندمدت (بازیابی ساعتها)
- S3 Glacier Deep Archive: ارزانترین، بازیابی 12 ساعت
سرویسهای S3-Compatible:
پروتکل S3 استاندارد صنعتی شده و سرویسهای زیادی از آن پشتیبانی میکنند:
- MinIO: متنباز، self-hosted، ایدهآل برای ایران (بدون نیاز به VPN)
- DigitalOcean Spaces: ساده و ارزان
- Backblaze B2: ارزانترین گزینه ابری
- Arvan Cloud Object Storage: سرویس ایرانی، بدون تحریم
- Cloudflare R2: بدون هزینه Egress
احراز هویت
احراز هویت AWS S3
روش 1: IAM Access Key (رایجترین)
#### مراحل ایجاد IAM User:
- 1به [AWS Console](https://console.aws.amazon.com/iam/) وارد شوید
- 2IAM > Users > Add User
- 3نام کاربر: مثل
n8n-s3-user - 4Access type: Programmatic access فعال کنید
- 5Permissions: یکی از این روشها:
#### IAM Policy پیشنهادی (حداقل دسترسی):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}- 1Access Key ID و Secret Access Key را کپی کنید
#### تنظیم در n8n:
- 1Credentials > AWS > S3
- 2Access Key ID وارد کنید
- 3Secret Access Key وارد کنید
- 4Region انتخاب کنید (مثل: eu-west-1)
- 5Test Connection بزنید
روش 2: سرویسهای S3-Compatible (MinIO, Arvan)
برای سرویسهای غیر-AWS، فقط Endpoint URL تغییر میکند:
MinIO:
Endpoint: https://minio.your-server.com
Access Key: minioadmin
Secret Key: minioadmin123
Arvan Cloud:
Endpoint: https://s3.ir-thr-at1.arvanstorage.ir
Access Key: از پنل آروان
DigitalOcean Spaces:
Endpoint: https://nyc3.digitaloceanspaces.com
Access Key: از پنل DigitalOcean
Backblaze B2:
Endpoint: https://s3.us-west-004.backblazeb2.com
Access Key: Application Key ID
Secret Key: Application Keyنکات امنیتی:
- هرگز از Root Account Key استفاده نکنید
- حداقل دسترسی لازم (Least Privilege) تنظیم کنید
- Access Keyها را مرتب Rotate کنید
- Secret Key را در متغیرهای محیطی نگهداری کنید
عملیاتهای موجود
upload
آپلود فایل جدید یا جایگزینی فایل موجود در Bucket
download
دانلود فایل از Bucket و دریافت به صورت Binary Data
delete
حذف یک Object از Bucket
list
لیست تمام Objectهای داخل یک Bucket یا Prefix خاص
copy
کپی فایل از یک مکان به مکان دیگر (حتی بین Bucketها)
getUrl
دریافت URL مستقیم فایل (فقط برای فایلهای public)
presignedUrl
ایجاد لینک دسترسی موقت با زمان انقضا (بدون نیاز به عمومی بودن فایل)
createBucket
ایجاد Bucket جدید
deleteBucket
حذف Bucket (باید خالی باشد)
listBuckets
دریافت لیست تمام Bucketهای موجود در اکانت
getMetadata
دریافت اطلاعات فایل بدون دانلود محتوا (حجم، نوع، تاریخ، متادیتا)
setAcl
تغییر سطح دسترسی Object یا Bucket
multipartUpload
آپلود فایلهای بزرگ به صورت چند قسمتی (برای فایلهای بالای 100MB)
headObject
بررسی وجود یک Object بدون دانلود آن (کاربرد: چک کردن قبل از آپلود)
getObjectTagging
دریافت Tagهای اختصاص داده شده به Object برای دستهبندی و مدیریت هزینه
کاربردهای متداول
1. بکآپ خودکار دیتابیس روزانه
ذخیره بکآپهای دیتابیس در S3:
Schedule (هر شب ساعت 2)
→ SSH Command (mysqldump database > backup.sql)
→ Compression (gzip backup.sql)
→ AWS S3 (Upload)
Bucket: my-backups
Key: database/{{$now.toFormat('yyyy/MM/dd')}}/backup.sql.gz
StorageClass: STANDARD_IA
→ Telegram (گزارش بکآپ)
→ AWS S3 (حذف بکآپهای قدیمیتر از 30 روز)2. پردازش تصاویر آپلودی
پایپلاین پردازش عکس:
Webhook (آپلود تصویر)
→ AWS S3 (Upload: originals/photo.jpg)
→ HTTP Request (API تغییر اندازه تصویر)
→ AWS S3 (Upload: thumbnails/photo_thumb.jpg)
→ AWS S3 (Upload: medium/photo_medium.jpg)
→ MySQL (ذخیره URLها)
→ Respond to Webhook (لینک تصاویر)3. میزبانی سایت استاتیک
دیپلوی خودکار فایلهای سایت:
GitHub Trigger (Push to main)
→ HTTP Request (دانلود فایلهای build)
→ Loop (هر فایل)
→ AWS S3 (Upload با Content-Type مناسب)
Bucket: my-website
ACL: public-read
→ CloudFront (Invalidation)4. مدیریت رسانه فروشگاه
آپلود و سازماندهی تصاویر محصولات:
Webhook (محصول جدید)
→ Loop (هر تصویر)
→ AWS S3 (Upload)
Key: products/{{$json.productId}}/{{$json.index}}.jpg
ACL: public-read
Metadata: {productName: "...", category: "..."}
→ MySQL (ذخیره لینکها)
→ AWS S3 (Presigned URL: لینک موقت برای پنل مدیریت)5. جمعآوری و آرشیو لاگها
ذخیره لاگهای اپلیکیشن:
Webhook (لاگ جدید)
→ Code (فرمتدهی JSON Lines)
→ AWS S3 (Upload)
Key: logs/{{$json.service}}/{{$now.toFormat('yyyy/MM/dd/HH')}}.jsonl
StorageClass: GLACIER (بعد از 30 روز)6. Data Lake با S3
ذخیره دادههای تحلیلی:
Schedule (هر ساعت)
→ MySQL (دادههای جدید)
→ Code (تبدیل به Parquet/CSV)
→ AWS S3 (Upload)
Key: data-lake/events/year={{$now.year}}/month={{$now.month}}/data.csv
→ Telegram (گزارش تعداد رکوردها)7. CDN Origin برای فایلها
S3 به عنوان منبع CloudFront:
Webhook (فایل جدید)
→ AWS S3 (Upload)
Bucket: cdn-origin
Key: assets/{{$json.category}}/{{$json.filename}}
CacheControl: max-age=31536000
→ Set (URL CDN)
URL: https://cdn.example.com/assets/...
→ MySQL (ذخیره لینک CDN)8. مدیریت اسناد و فاکتورها
آرشیو خودکار فاکتورها:
Webhook (پرداخت موفق)
→ HTTP Request (تولید PDF فاکتور)
→ AWS S3 (Upload)
Key: invoices/{{$now.toFormat('yyyy')}}/INV-{{$json.invoiceId}}.pdf
Metadata: {customerId: "...", amount: "..."}
→ AWS S3 (Presigned URL: لینک 24 ساعته)
→ Email (ارسال لینک دانلود به مشتری)9. Replication بین مناطق
کپی فایلها برای Disaster Recovery:
Schedule (هر 6 ساعت)
→ AWS S3 (List: critical-data/)
→ Loop
→ AWS S3 (Copy)
Source: primary-bucket/critical-data/
Destination: backup-bucket-eu/critical-data/
→ Telegram (گزارش Replication)10. آرشیو بلندمدت
انتقال فایلهای قدیمی به Glacier:
Schedule (هر هفته)
→ AWS S3 (List: فایلهای قدیمیتر از 90 روز)
→ Loop
→ AWS S3 (Copy با StorageClass: GLACIER)
→ AWS S3 (Delete فایل اصلی)
→ Telegram (تعداد فایلهای آرشیو شده)نکات حرفهای
نکات حرفهای
- 1Presigned URL برای آپلود مستقیم: بدون عبور ترافیک از سرور:
Webhook → AWS S3 (Presigned URL: putObject)
Expires: 600 (10 دقیقه)
→ Respond (URL برای آپلود مستقیم از Browser)
// Client با PUT مستقیم فایل را آپلود میکند- 1Storage Class انتخاب مناسب: صرفهجویی تا 90%:
فایلهای فعال: STANDARD
بکآپهای ماهانه: STANDARD_IA
لاگهای قدیمی: GLACIER
آرشیو قانونی: GLACIER_DEEP_ARCHIVE- 1Lifecycle Policy: انتقال خودکار بین کلاسها:
روز 0: STANDARD
بعد 30 روز: STANDARD_IA
بعد 90 روز: GLACIER
بعد 365 روز: حذف خودکار
// از AWS Console > Bucket > Management > Lifecycle- 1Versioning فعال کنید: محافظت از حذف تصادفی:
Bucket > Properties > Versioning > Enable
// هر بار آپلود مجدد، نسخه قبلی حفظ میشود
// قابل بازیابی با versionId- 1Server-Side Encryption: رمزگذاری خودکار:
AES256: رمزگذاری رایگان توسط AWS
aws:kms: رمزگذاری با کلید اختصاصی KMS
// Bucket > Properties > Default Encryption- 1MinIO به عنوان جایگزین S3 برای ایران:
MinIO یک Object Storage متنباز و S3-compatible است.
مزایا برای کاربران ایرانی:
- بدون نیاز به VPN یا پرداخت دلاری
- نصب روی سرور خودتان
- کاملاً سازگار با نود AWS S3 در n8n
- رابط وب مدیریتی
نصب با Docker:
docker run -p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=admin \
-e MINIO_ROOT_PASSWORD=password123 \
minio/minio server /data --console-address ":9001"
در n8n: Endpoint = http://minio-server:9000- 1Multipart Upload برای فایلهای بزرگ:
فایل < 5MB: آپلود عادی
فایل 5MB-5GB: Multipart با Part Size 5MB
فایل > 5GB: Multipart با Part Size بزرگتر
// حداکثر 10,000 Part- 1Content-Type صحیح تنظیم کنید:
.jpg → image/jpeg
.png → image/png
.pdf → application/pdf
.json → application/json
.html → text/html
.css → text/css
.js → application/javascript
.gz → application/gzip
// مهم برای سرو صحیح فایلها توسط Browser- 1Custom Metadata برای جستجو و دستهبندی:
x-amz-meta-project: "my-app"
x-amz-meta-uploader: "workflow-123"
x-amz-meta-category: "invoice"
// قابل خواندن با HeadObject- 1ACL vs Bucket Policy:
ACL: دسترسی ساده در سطح Object
→ private, public-read, public-read-write
Bucket Policy: کنترل دقیقتر با JSON
→ IP فیلتر، زمان، شرطهای پیچیده
توصیه AWS: از Bucket Policy استفاده کنید، ACL خاموش- 1Transfer Acceleration: آپلود سریعتر از مناطق دور:
Bucket > Properties > Transfer Acceleration > Enable
Endpoint: bucketname.s3-accelerate.amazonaws.com
// از شبکه Edge Location AWS استفاده میکند- 1Event Notifications: اعلان خودکار رویدادها:
S3 Event → SNS/SQS/Lambda
رویدادها: s3:ObjectCreated, s3:ObjectRemoved
// در n8n: از AWS SNS Trigger استفاده کنید- 1بهینهسازی هزینه:
- Lifecycle Policy فعال کنید
- Intelligent-Tiering برای الگوی دسترسی متغیر
- فایلهای غیرضروری پاک کنید
- از CloudFront جلوی S3 بگذارید (کاهش هزینه Transfer)
- Versioning Cleanup: نسخههای قدیمی پاک شوند
- S3 Analytics برای بررسی الگوی استفاده- 1نامگذاری استاندارد Key:
پوشهبندی منطقی:
uploads/{userId}/{year}/{month}/{filename}
backups/{service}/{date}/backup.sql.gz
assets/images/{category}/{productId}.jpg
logs/{service}/{year}/{month}/{day}/{hour}.log
// از / ابتدایی استفاده نکنید
// از فاصله و کاراکتر خاص پرهیز کنید- 1Cross-Account Access: دسترسی بین اکانتها:
Bucket Policy:
{
"Principal": {"AWS": "arn:aws:iam::ACCOUNT_ID:root"},
"Action": ["s3:GetObject"],
"Resource": "arn:aws:s3:::bucket/*"
}
// مفید برای اشتراک داده بین تیمها
// یا دسترسی سرویس ثالثرفع مشکلات
خطاهای رایج و راهحلها
1. خطای 403 AccessDenied
علت: کاربر IAM دسترسی لازم به Bucket یا Object را ندارد
راهحل
- IAM Policy را بررسی کنید: آیا Action مورد نظر (s3:PutObject, s3:GetObject) مجاز است؟
- Resource در Policy باید هم Bucket و هم Object را شامل شود:
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]- Bucket Policy جداگانه بررسی شود (ممکن است Deny صریح داشته باشد)
- Block Public Access تنظیمات Bucket چک شود
2. خطای 404 NoSuchKey
علت: فایل (Object) با این Key وجود ندارد
راهحل
- Key را دقیقاً بررسی کنید (Case-sensitive است)
- فاصله یا کاراکتر اضافی در Key نباشد
- از List استفاده کنید تا Key دقیق را پیدا کنید
- Prefix اشتباه نباشد (مثلاً
/images/به جایimages/) - توجه: S3 با
/شروع نمیشود
3. خطای 404 NoSuchBucket
علت: Bucket با این نام وجود ندارد
راهحل
- نام Bucket را بررسی کنید (حروف کوچک، بدون فاصله)
- Region درست تنظیم شده باشد
- Bucket حذف نشده باشد
- از ListBuckets برای بررسی لیست Bucketها استفاده کنید
4. خطای SignatureDoesNotMatch
علت: Access Key یا Secret Key اشتباه است
راهحل
- Secret Access Key را مجدداً کپی کنید (بدون فاصله اضافی)
- Region صحیح تنظیم شده باشد
- ساعت سرور n8n دقیق باشد (AWS Signature حساس به زمان است)
- برای S3-Compatible: Endpoint URL صحیح وارد شده باشد
- Signature Version: v4 استفاده کنید
5. خطای 503 SlowDown (Rate Limit)
علت: تعداد درخواستها بیش از حد مجاز
راهحل
- بین درخواستها Wait اضافه کنید:
Loop → AWS S3 → Wait (100ms) → Next- از Batch درخواستها استفاده کنید
- Prefixها را توزیع کنید (از Prefix یکسان پرهیز)
- Retry on Fail فعال کنید
6. خطای CORS در Browser
علت: تنظیمات CORS روی Bucket انجام نشده
راهحل
- CORS Configuration برای Bucket تنظیم کنید:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "PUT", "POST"],
"AllowedOrigins": ["https://your-domain.com"],
"MaxAgeSeconds": 3600
}
]- توجه: در n8n سمت سرور CORS مشکلی ندارد، فقط در آپلود مستقیم از Browser
7. Timeout در فایلهای بزرگ
علت: فایل بیش از حد بزرگ برای آپلود یکپارچه
راهحل
- برای فایلهای بالای 100MB از Multipart Upload استفاده کنید
- Timeout نود را افزایش دهید
- اتصال اینترنت سرور n8n بررسی شود
- حداکثر حجم: 5TB (ولی Multipart باید باشد)
8. خطای BucketAlreadyExists
علت: نام Bucket توسط اکانت دیگری استفاده شده (نامها در کل جهان منحصر به فرد هستند)
راهحل
- نام دیگری انتخاب کنید
- از پیشوند منحصر به فرد استفاده کنید:
mycompany-production-assets - از UUID یا تاریخ در نام استفاده نکنید (خوانایی کم)
- قوانین نامگذاری: 3-63 کاراکتر، حروف کوچک، اعداد و خط تیره
