🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

دليل AWS S3 الكامل 2026: الدلاء، Boto3 وأنماط الإنتاج

⏱️4 min read  ·  664 words

Amazon S3 (خدمة التخزين البسيطة) هي أساس التخزين السحابي. يستخدم كل عبء عمل خطير لدى AWS S3 — بدءًا من مواقع الويب الثابتة والنسخ الاحتياطية وحتى مستودعات البيانات ومجموعات بيانات التدريب على التعلم الآلي. يغطي هذا الدليل الكامل S3 بدءًا من المجموعة الأولى وحتى بنية فئة الإنتاج في عام 2026.

ما هو S3؟

S3 هو تخزين الكائنات: الملفات (الكائنات) المخزنة في مجموعات، ويمكن الوصول إليها عبر HTTP. المفاهيم الأساسية:

  • دلو– حاوية للكائنات، اسم فريد عالميًا
  • هدف— ملف + بيانات وصفية، يصل حجم كل منها إلى 5 تيرابايت
  • Key– المسار الكامل للكائن داخل المجموعة (على سبيل المثال،images/2026/photo.jpg)
  • منطقة– يعيش الدلو في منطقة AWS واحدة
  • متانة– 99.999999999% (11 تسعة) – يتم نسخ البيانات عبر 3+ مناطق توافر

إنشاء الدلاء وتحميل الملفات

# AWS CLI setup
pip install awscli
aws configure  # enter Access Key, Secret, region

# Create bucket
aws s3 mb s3://my-bucket-2026 --region us-east-1

# Upload file
aws s3 cp file.jpg s3://my-bucket-2026/images/file.jpg

# Upload directory
aws s3 sync ./dist s3://my-bucket-2026/website/ --delete

# List objects
aws s3 ls s3://my-bucket-2026/
aws s3 ls s3://my-bucket-2026/images/ --recursive

# Download
aws s3 cp s3://my-bucket-2026/data.csv ./data.csv

# Delete
aws s3 rm s3://my-bucket-2026/old-file.txt
aws s3 rm s3://my-bucket-2026/old-folder/ --recursive

Boto3 — Python SDK لـ S3

import boto3
from botocore.exceptions import ClientError
from pathlib import Path
import json

# Initialize client
s3 = boto3.client('s3', region_name='us-east-1')

# Or use resource (higher-level API)
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket('my-bucket-2026')

# Create bucket
def create_bucket(bucket_name: str, region: str = 'us-east-1') -> bool:
    try:
        if region == 'us-east-1':
            s3.create_bucket(Bucket=bucket_name)
        else:
            s3.create_bucket(
                Bucket=bucket_name,
                CreateBucketConfiguration={'LocationConstraint': region}
            )
        return True
    except ClientError as e:
        print(f"Error: {e}")
        return False

# Upload file
def upload_file(file_path: str, bucket: str, key: str = None) -> bool:
    if key is None:
        key = Path(file_path).name
    try:
        s3.upload_file(file_path, bucket, key,
                       ExtraArgs={'ContentType': 'image/jpeg'})
        return True
    except ClientError as e:
        print(f"Upload failed: {e}")
        return False

# Upload from memory (no temp file needed)
def upload_bytes(data: bytes, bucket: str, key: str, content_type: str = 'application/octet-stream'):
    s3.put_object(Body=data, Bucket=bucket, Key=key, ContentType=content_type)

# Download
def download_file(bucket: str, key: str, dest_path: str):
    s3.download_file(bucket, key, dest_path)

def download_bytes(bucket: str, key: str) -> bytes:
    response = s3.get_object(Bucket=bucket, Key=key)
    return response['Body'].read()

# List objects
def list_objects(bucket: str, prefix: str = '') -> list[dict]:
    paginator = s3.get_paginator('list_objects_v2')
    objects = []
    for page in paginator.paginate(Bucket=bucket, Prefix=prefix):
        objects.extend(page.get('Contents', []))
    return objects

# Delete
def delete_object(bucket: str, key: str):
    s3.delete_object(Bucket=bucket, Key=key)

استضافة المواقع الثابتة

# Enable static hosting
aws s3 website s3://my-website-bucket/   --index-document index.html   --error-document 404.html

# Bucket policy for public access
cat > policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::my-website-bucket/*"
  }]
}
EOF

aws s3api put-bucket-policy   --bucket my-website-bucket   --policy file://policy.json

# Deploy website
aws s3 sync ./dist s3://my-website-bucket/   --delete   --cache-control "max-age=31536000"   --exclude "*.html"

# HTML files: no cache
aws s3 sync ./dist s3://my-website-bucket/   --exclude "*" --include "*.html"   --cache-control "no-cache"

# Website URL: http://my-website-bucket.s3-website-us-east-1.amazonaws.com

عناوين URL الموقعة مسبقًا – وصول مؤقت آمن

# Generate time-limited URLs for private objects

def get_presigned_url(bucket: str, key: str, expiry_seconds: int = 3600) -> str:
    url = s3.generate_presigned_url(
        'get_object',
        Params={'Bucket': bucket, 'Key': key},
        ExpiresIn=expiry_seconds
    )
    return url

# Upload pre-signed URL — let clients upload directly to S3
def get_presigned_upload_url(bucket: str, key: str, content_type: str, expiry: int = 300) -> dict:
    response = s3.generate_presigned_post(
        bucket,
        key,
        Fields={'Content-Type': content_type},
        Conditions=[
            {'Content-Type': content_type},
            ['content-length-range', 1, 10 * 1024 * 1024]  # max 10MB
        ],
        ExpiresIn=expiry
    )
    return response

# FastAPI endpoint returning upload URL
# @app.get('/upload-url')
# def get_upload_url(filename: str, content_type: str):
#     key = f'uploads/{uuid4()}/{filename}'
#     url_data = get_presigned_upload_url(BUCKET, key, content_type)
#     return {'url': url_data['url'], 'fields': url_data['fields'], 'key': key}

فئات التخزين S3 (تحسين التكلفة)

فصل حالة الاستخدام يكلف
معيار يتم الوصول إليها بشكل متكرر 0.023 دولار/جيجابايت
التدرج الذكي أنماط وصول غير معروفة التحسين التلقائي
ستاندرد-IA وصول غير متكرر 0.0125 دولار/جيجابايت
لحظة الجليدية المحفوظات، استرجاع مللي ثانية 0.004 دولار/جيجابايت
الأرشيف الجليدي العميق أرشيفات الامتثال 0.00099 دولار/جيجابايت

سياسات دورة الحياة – أتمتة توفير التكاليف

{
  "Rules": [{
    "ID": "archive-old-logs",
    "Status": "Enabled",
    "Filter": {"Prefix": "logs/"},
    "Transitions": [
      {"Days": 30, "StorageClass": "STANDARD_IA"},
      {"Days": 90, "StorageClass": "GLACIER"}
    ],
    "Expiration": {"Days": 365}
  }]
}

إصدار S3 والنسخ المتماثل

# Enable versioning
aws s3api put-bucket-versioning   --bucket my-bucket   --versioning-configuration Status=Enabled

# Cross-region replication (in AWS Console or CloudFormation)
# Requires versioning on both source and destination buckets

# List object versions
aws s3api list-object-versions --bucket my-bucket --prefix data.csv

أفضل الممارسات الأمنية

  • منع الوصول العامبشكل افتراضي – افتح فقط ما تحتاجه
  • استخدم أدوار IAMللوصول إلى EC2/Lambda — لا توجد مفاتيح مشفرة
  • تمكين التشفير من جانب الخادم(SSE-S3 أو SSE-KMS)
  • تمكين كلاودتريل— تدقيق كافة استدعاءات S3 API
  • استخدم نقاط نهاية VPCللوصول الخاص من EC2
  • تمكين حذف MFAللمجموعات ذات الإصدارات التي تحتوي على البيانات المهمة

S3 قابل للتطوير بشكل لا نهائي، ويكلف قرشًا لكل جيجابايت، ويتكامل مع كل خدمة من خدمات AWS. أتقن واجهة سطر الأوامر (CLI) وBoto3، واستخدم عناوين URL الموقعة مسبقًا لتحميلات المستخدم، وسياسات دورة الحياة لتحسين التكلفة، وقم دائمًا بحظر الوصول العام بشكل افتراضي.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা