راه‌اندازی استوریج آبجکت؛ از ساخت باکت تا اتصال اپلیکیشن

آموزش گام‌به‌گام راه‌اندازی استوریج آبجکت: ساخت باکت، تولید کلید دسترسی، تنظیم CORS و اتصال از اپلیکیشن با مثال‌های عملی و خطاهای رایج.

۵ دقیقه به‌روزرسانی ۳۱ شهریور ۱۴۰۵

چرا استوریج آبجکت برای برنامه شما ضروری است؟

وقتی برنامه‌تان رشد می‌کند، ذخیره‌سازی فایل‌ها روی دیسک سرور دیگر جواب نمی‌دهد. محدودیت فضا، سختی پشتیبان‌گیری و کندی دسترسی همزمان، سه مشکل اصلی هستند که خیلی زود سراغتان می‌آیند. استوریج آبجکت این مسائل را با معماری متفاوت حل می‌کند: هر فایل به‌عنوان یک «آبجکت» با شناسه یکتا ذخیره می‌شود و شما به‌جای مسیر فیزیکی، از طریق یک URL و کلید دسترسی به آن می‌رسید.

در این مقاله یاد می‌گیرید که چطور یک استوریج آبجکت را از صفر راه‌اندازی کنید: ساخت باکت، تولید کلید دسترسی، تنظیمات امنیتی و در نهایت اتصال از یک اپلیکیشن واقعی. همه مثال‌ها را می‌توانید مستقیماً اجرا کنید.

مرحله ۱: ساخت باکت — اولین قدم در استوریج آبجکت

باکت (Bucket) ظرفی است که آبجکت‌ها در آن قرار می‌گیرند. نام باکت باید در کل فضای ذخیره‌سازی شما یکتا باشد، چون بخشی از آدرس نهایی فایل می‌شود. مثلاً اگر نام باکت my-app-media باشد، آدرس یک فایل به این شکل خواهد بود:

https://bucket.my-provider.com/my-app-media/images/profile.jpg

برای ساخت باکت در پنل مدیریتی استوریج آبجکت، معمولاً این مراحل را طی می‌کنید:

  1. وارد بخش «باکت‌ها» شوید و گزینه «ساخت باکت جدید» را بزنید.
  2. نام باکت را با حروف کوچک، اعداد و خط تیره وارد کنید (بدون فاصله و کاراکتر خاص).
  3. منطقه جغرافیایی را انتخاب کنید — نزدیک‌ترین منطقه به کاربران اصلی‌تان.
  4. نوع دسترسی را روی «خصوصی» بگذارید و بعداً با Policy تنظیمش کنید.

اشتباه رایج: خیلی از توسعه‌دهنده‌ها باکت را «عمومی» می‌سازند تا فایل‌ها سریع دیده شوند. این کار امنیت را به خطر می‌اندازد. همیشه باکت را خصوصی بسازید و دسترسی را فقط برای فایل‌هایی که لازم است (مثل تصاویر پروفایل) از طریق URL موقت باز کنید.

تعیین خط‌مشی دسترسی (Bucket Policy)

بعد از ساخت باکت، باید مشخص کنید چه کسی به چه چیزی دسترسی دارد. ساده‌ترین حالت، اجازه خواندن عمومی برای یک پوشه خاص است:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-app-media/public/*"
    }
  ]
}

این Policy فقط به فایل‌های داخل پوشه public/ اجازه خواندن می‌دهد. بقیه فایل‌ها خصوصی می‌مانند. اگر با سرویس‌های سازگار با S3 کار می‌کنید (مثل MinIO یا Ceph)، این ساختار JSON دقیقاً قابل استفاده است.

مرحله ۲: تولید کلید دسترسی و تنظیم امنیت

برای اتصال برنامه به استوریج آبجکت، به دو مقدار نیاز دارید: Access Key و Secret Key. این دو مثل نام کاربری و رمز عبور عمل می‌کنند و باید با دقت نگهداری شوند.

در پنل مدیریتی، معمولاً از بخش «کلیدهای دسترسی» می‌توانید یک جفت کلید جدید بسازید. بعد از تولید، Secret Key فقط یک بار نمایش داده می‌شود — پس همان لحظه آن را در یک جای امن ذخیره کنید.

بهترین شیوه‌های امنیتی برای کلیدها

  • کلیدها را در کد برنامه یا فایل‌های عمومی مثل .env که در Git کامیت می‌شود قرار ندهید.
  • برای هر محیط (توسعه، تست، تولید) یک کلید جدا بسازید.
  • دسترسی هر کلید را محدود کنید — مثلاً فقط به یک باکت خاص و فقط عملیات خواندن.
  • اگر کلید لو رفت، فوراً آن را غیرفعال و کلید جدید بسازید.

نکته مهم: در استوریج آبجکت، کلیدها معمولاً به یک «کاربر» متصل می‌شوند. برای هر کاربر می‌توانید Policy جداگانه تعریف کنید. مثلاً یک کاربر فقط برای آپلود و دیگری فقط برای دانلود.

مرحله ۳: اتصال از اپلیکیشن — مثال عملی با Python

حالا که باکت و کلیدها آماده هستند، وقت اتصال است. برای این مثال از کتابخانه boto3 استفاده می‌کنیم که استاندارد ارتباط با سرویس‌های سازگار با S3 است. اول کتابخانه را نصب کنید:

pip install boto3

سپس یک فایل پیکربندی بسازید:

import boto3
from botocore.client import Config

s3 = boto3.client(
    's3',
    endpoint_url='https://your-storage-endpoint.com',
    aws_access_key_id='YOUR_ACCESS_KEY',
    aws_secret_access_key='YOUR_SECRET_KEY',
    config=Config(signature_version='s3v4'),
    region_name='us-east-1'
)

حالا می‌توانید یک فایل آپلود کنید:

s3.upload_file(
    'local-image.jpg',
    'my-app-media',
    'public/profile.jpg',
    ExtraArgs={'ContentType': 'image/jpeg'}
)

و برای دانلود:

s3.download_file(
    'my-app-media',
    'public/profile.jpg',
    'downloaded-image.jpg'
)

تولید URL موقت برای فایل‌های خصوصی

اگر فایل خصوصی است و می‌خواهید کاربر برای مدت محدودی به آن دسترسی داشته باشد، از URL امضا شده استفاده کنید:

url = s3.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'my-app-media', 'Key': 'private/report.pdf'},
    ExpiresIn=3600  # یک ساعت
)
print(url)

این URL شامل امضای دیجیتال است و بعد از یک ساعت منقضی می‌شود. برای نمایش تصاویر پروفایل یا دانلود فاکتورها عالی است.

مرحله ۴: تنظیم CORS برای دسترسی از مرورگر

اگر برنامه شما فرانت‌اند جاوااسکریپتی دارد و می‌خواهد مستقیم از مرورگر به استوریج آبجکت وصل شود، باید CORS را تنظیم کنید. بدون این تنظیم، مرورگر درخواست را بلاک می‌کند و خطای No 'Access-Control-Allow-Origin' header می‌گیرید.

در پنل مدیریتی، بخش CORS را پیدا کنید و این تنظیمات را اضافه کنید:

[
  {
    "AllowedOrigins": ["https://my-app.com"],
    "AllowedMethods": ["GET", "PUT"],
    "AllowedHeaders": ["*"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3000
  }
]

در این مثال فقط دامنه my-app.com اجازه دسترسی دارد. برای محیط توسعه، می‌توانید http://localhost:3000 را هم اضافه کنید.

اشتباه رایج: بعضی‌ها AllowedOrigins را روی * می‌گذارند تا همه چیز سریع کار کند. این کار در تولید خطرناک است چون هر سایت دیگری می‌تواند به فایل‌های شما دسترسی پیدا کند. همیشه دامنه‌های مشخص را لیست کنید.

مرحله ۵: مدیریت خطاها و عیب‌یابی

در کار با استوریج آبجکت، چند خطای رایج را حتماً خواهید دید. این‌ها را بشناسید تا سریع حلشان کنید:

خطای 403 Forbidden

معمولاً یعنی کلید دسترسی درست نیست یا Policy اجازه نمی‌دهد. اول کلیدها را چک کنید، بعد Policy باکت را بررسی کنید. اگر از URL موقت استفاده می‌کنید، مطمئن شوید منقضی نشده باشد.

خطای 404 Not Found

یا فایل وجود ندارد یا مسیر (Key) اشتباه است. دقت کنید که Key شامل نام پوشه‌ها هم می‌شود. مثلاً اگر فایل را در public/ آپلود کرده‌اید، Key باید public/filename.jpg باشد نه فقط filename.jpg.

خطای SignatureDoesNotMatch

این خطا یعنی زمان سیستم شما با سرور هماهنگ نیست. با دستور زیر زمان را همگام کنید:

sudo ntpdate pool.ntp.org

یا در سیستم‌های مدرن‌تر:

sudo timedatectl set-ntp true

جمع‌بندی و گام‌های بعدی

راه‌اندازی استوریج آبجکت کار سختی نیست، اما جزئیات امنیتی و پیکربندی را نباید ساده بگیرید. خلاصه مراحل:

  1. باکت را خصوصی بسازید و Policy را دقیق تنظیم کنید.
  2. کلیدهای دسترسی را جداگانه برای هر محیط بسازید و امن نگه دارید.
  3. از کتابخانه استاندارد (مثل boto3) برای اتصال استفاده کنید.
  4. برای فایل‌های خصوصی، URL موقت تولید کنید نه دسترسی عمومی.
  5. CORS را فقط برای دامنه‌های مجاز باز کنید.

اگر به دنبال یک زیرساخت ابری قابل اعتماد برای پروژه‌های خود هستید، سرورنت خدمات متنوعی در حوزه فضای ابری و ذخیره‌سازی ارائه می‌دهد که می‌تواند نیاز شما را پوشش دهد. اما فارغ از انتخاب سرویس‌دهنده، اصولی که در این مقاله گفتیم در همه سرویس‌های سازگار با S3 یکسان است و مهارت‌تان را می‌توانید به هر پلتفرمی منتقل کنید.

حالا نوبت شماست: یک باکت بسازید، اولین فایل را آپلود کنید و از سادگی کار لذت ببرید. اگر به خطایی برخوردید، بخش عیب‌یابی را دوباره مرور کنید — احتمالاً جوابتان آنجاست.

آیا این مطلب برایتان مفید بود؟