AWS Documentation · Tiếng Việt

Amazon S3

Dịch vụ lưu trữ đối tượng (Object Storage) có độ bền 99.999999999% — Tài liệu toàn diện từ kiến trúc đến vận hành

Cập nhật 04/2026
Storage · Object
AWS Core Service
01 · Tổng quan

S3 là gì?

Amazon Simple Storage Service (S3) là dịch vụ lưu trữ đối tượng (object storage) của AWS, cho phép lưu trữ và truy xuất bất kỳ lượng dữ liệu nào, từ bất kỳ đâu trên internet. S3 được thiết kế với độ bền 99.999999999% (11 nines) và khả năng mở rộng gần như vô hạn.

♾️
Không giới hạn
Lưu trữ không giới hạn dung lượng. Mỗi object tối đa 5 TB. Không cần provision trước.
🛡️
11 nines Durability
99.999999999% durability — dữ liệu được replicate tự động qua ≥3 AZ.
💰
Pay-per-use
Trả tiền theo GB lưu trữ + số request. Không phí tối thiểu, không cam kết.
🌍
Toàn cầu
Có mặt tại tất cả AWS Region. Hỗ trợ Transfer Acceleration cho tốc độ cao.
🔒
Bảo mật đa lớp
Encryption at rest/in transit, Bucket Policy, ACL, VPC Endpoint, Object Lock.
🔗
Tích hợp sâu
Kết nối Lambda, CloudFront, Athena, EMR, Redshift và 200+ dịch vụ AWS.

Use Cases phổ biến

  • Backup & Archive: Lưu trữ backup database, log files, compliance data
  • Data Lake: Trung tâm dữ liệu cho analytics với Athena, Redshift Spectrum, EMR
  • Static Website Hosting: Host website tĩnh (HTML/CSS/JS) kết hợp CloudFront
  • Media Storage: Lưu trữ và phân phối hình ảnh, video, audio
  • Application Assets: Lưu file upload từ user, avatar, documents
  • Disaster Recovery: Cross-Region Replication cho DR strategy
  • Big Data & ML: Training data cho SageMaker, input/output cho EMR jobs
  • Software Distribution: Phân phối packages, installers, firmware updates

So sánh S3 vs EBS vs EFS

Tiêu chí S3 (Object Storage) EBS (Block Storage) EFS (File Storage)
Loại storage Object (key-value) Block (raw disk) File (NFS)
Truy cập HTTP/HTTPS API Gắn vào 1 EC2 (hoặc multi-attach io2) Mount NFS từ nhiều EC2
Dung lượng tối đa Không giới hạn 64 TB / volume Không giới hạn (elastic)
Object size tối đa 5 TB N/A (block level) 47.9 TB / file
Durability 99.999999999% 99.999% (replicate trong AZ) 99.999999999%
Latency ~100-200ms (first byte) Sub-millisecond ~ms (tùy mode)
Giá (us-east-1) ~$0.023/GB/tháng ~$0.08-0.125/GB/tháng ~$0.30/GB/tháng (Standard)
Use case chính Backup, data lake, static web OS disk, database Shared file system, CMS
💡 Khi nào chọn S3?
Chọn S3 khi bạn cần lưu trữ dữ liệu không cấu trúc (unstructured data) với quy mô lớn, truy cập qua HTTP API, và không cần mount như filesystem. S3 là lựa chọn mặc định cho hầu hết nhu cầu lưu trữ trên AWS nhờ giá rẻ và độ bền cực cao.
02 · Kiến trúc

Kiến trúc S3

S3 được xây dựng trên mô hình flat namespace — không có thư mục thực sự. Mọi thứ đều là object được định danh bằng key trong một bucket.

Các thành phần cốt lõi

Bucket

  • Container cấp cao nhất chứa objects
  • Tên bucket phải globally unique trên toàn bộ AWS (tất cả account, tất cả region)
  • Tên bucket: 3-63 ký tự, lowercase, không chứa dấu chấm (khuyến nghị), không bắt đầu bằng xn-- hoặc kết thúc bằng -s3alias
  • Bucket được tạo trong một Region cụ thể — dữ liệu không rời region trừ khi bạn cấu hình replication
  • Mỗi account tối đa 100 buckets (có thể request tăng lên 1000)

Object

  • Đơn vị dữ liệu cơ bản trong S3, gồm: data (body) + metadata
  • Kích thước tối đa: 5 TB (5,497,558,138,880 bytes)
  • Upload đơn: tối đa 5 GB — trên 5 GB bắt buộc dùng multipart upload
  • AWS khuyến nghị dùng multipart upload cho file > 100 MB

Key (Object Key)

  • Định danh duy nhất của object trong bucket — tương tự "đường dẫn file"
  • Ví dụ: photos/2024/vacation/beach.jpg
  • Prefix photos/2024/vacation/ tạo ảo giác thư mục trong Console, nhưng thực tế là flat
  • Key tối đa 1,024 bytes (UTF-8 encoded)

Region & Endpoint

  • Mỗi bucket thuộc một Region cụ thể (ví dụ: ap-southeast-1 cho Singapore)
  • Path-style URL: https://s3.ap-southeast-1.amazonaws.com/my-bucket/key
  • Virtual-hosted style (khuyến nghị): https://my-bucket.s3.ap-southeast-1.amazonaws.com/key
  • S3 global endpoint: https://s3.amazonaws.com (tự redirect về region đúng)
Kiến trúc Amazon S3 👤 Client HTTP/HTTPS API 📦 Amazon S3 Service 🪣 Bucket: my-app-prod Region: ap-southeast-1 📄 Key: images/logo.png Size: 45KB | Class: STANDARD 📄 Key: data/report.csv Size: 2.3MB | Class: IA 📄 Key: backup/db-2024.sql.gz Size: 1.2GB | Class: GLACIER 📋 Object Metadata Content-Type: image/png x-amz-server-side-encryption ETag, Last-Modified, VersionId 🪣 Bucket: my-logs Region: us-east-1 access-logs/2024/03/*.log cloudtrail/events/*.json 🔄 Auto Replication ≥ 3 AZs trong Region 11 nines durability

Cấu trúc URL của S3 Object

S3 URL Formats
# Virtual-hosted style (khuyến nghị — mặc định từ 2023)
https://bucket-name.s3.region.amazonaws.com/key
https://my-app-prod.s3.ap-southeast-1.amazonaws.com/images/logo.png

# Path-style (deprecated cho bucket mới từ 09/2023)
https://s3.region.amazonaws.com/bucket-name/key

# S3 URI (dùng trong AWS CLI & SDK)
s3://my-app-prod/images/logo.png

# ARN (dùng trong IAM Policy)
arn:aws:s3:::my-app-prod/images/logo.png
⚠️ Tên bucket là vĩnh viễn
Sau khi tạo bucket, bạn không thể đổi tên. Phải xóa và tạo lại. Hãy đặt tên cẩn thận theo convention: {company}-{env}-{purpose}-{region}. Ví dụ: acme-prod-assets-apse1.

Consistency Model

Từ tháng 12/2020, S3 cung cấp strong read-after-write consistency cho tất cả operations:

  • PUT object mới: Đọc ngay sau khi write sẽ nhận được object mới nhất
  • Overwrite PUT / DELETE: Đọc ngay sau sẽ phản ánh thay đổi mới nhất
  • LIST operations: Phản ánh ngay các thay đổi
✅ Tin tốt
Bạn không cần lo về eventual consistency nữa! S3 đã cung cấp strong consistency miễn phí, không cần cấu hình gì thêm.
03 · Storage Classes

S3 Storage Classes

S3 cung cấp nhiều storage class khác nhau, tối ưu cho từng pattern truy cập. Chọn đúng class giúp tiết kiệm đáng kể chi phí mà vẫn đảm bảo hiệu năng.

Tổng quan các Storage Classes

S3 Standard
Truy cập thường xuyên. Latency thấp, throughput cao. Mặc định khi upload.
📉
S3 Standard-IA
Infrequent Access. Giá lưu trữ rẻ hơn, nhưng có phí retrieval per-GB.
1️⃣
S3 One Zone-IA
Như Standard-IA nhưng chỉ lưu trong 1 AZ. Rẻ hơn 20%, rủi ro mất AZ.
🧠
Intelligent-Tiering
Tự động chuyển object giữa các tier dựa trên access pattern. Phí monitoring nhỏ.
🧊
Glacier Instant
Archive với truy cập millisecond. Rẻ hơn Standard-IA cho data hiếm khi truy cập.
❄️
Glacier Flexible
Archive truyền thống. Retrieval: 1-5 phút (Expedited) đến 5-12 giờ (Bulk).
🏔️
Glacier Deep Archive
Rẻ nhất. Retrieval: 12-48 giờ. Cho data lưu trữ 7-10 năm (compliance).
📡
S3 Express One Zone
Latency single-digit ms, throughput cực cao. Cho ML training, analytics.

Bảng so sánh chi tiết

Storage Class Durability Availability AZs Giá lưu trữ (GB/tháng) Phí retrieval Min storage First byte latency
Standard 11 nines 99.99% ≥ 3 $0.023 Không Không milliseconds
Intelligent-Tiering 11 nines 99.9% ≥ 3 $0.023 → $0.0025 Không Không milliseconds
Standard-IA 11 nines 99.9% ≥ 3 $0.0125 $0.01/GB 128 KB, 30 ngày milliseconds
One Zone-IA 11 nines 99.5% 1 $0.01 $0.01/GB 128 KB, 30 ngày milliseconds
Glacier Instant 11 nines 99.9% ≥ 3 $0.004 $0.03/GB 128 KB, 90 ngày milliseconds
Glacier Flexible 11 nines 99.99% ≥ 3 $0.0036 $0.01/GB 40 KB, 90 ngày phút → giờ
Glacier Deep Archive 11 nines 99.99% ≥ 3 $0.00099 $0.02/GB 40 KB, 180 ngày 12-48 giờ
Express One Zone 11 nines 99.95% 1 $0.16 Không Không single-digit ms

* Giá tham khảo cho region us-east-1 (N. Virginia). Giá thực tế có thể khác theo region.

Intelligent-Tiering — Chi tiết các tier

Tier Điều kiện Giá tương đương Tự động?
Frequent Access Mặc định khi upload = S3 Standard
Infrequent Access Không truy cập 30 ngày = Standard-IA
Archive Instant Access Không truy cập 90 ngày = Glacier Instant
Archive Access Không truy cập 90 ngày = Glacier Flexible Opt-in
Deep Archive Access Không truy cập 180 ngày = Glacier Deep Archive Opt-in
✅ Khuyến nghị
  • Không chắc access pattern? → Dùng Intelligent-Tiering (phí monitoring chỉ $0.0025/1000 objects/tháng)
  • Data truy cập < 1 lần/tháng nhưng cần ngay? → Standard-IA hoặc Glacier Instant Retrieval
  • Backup/archive lưu trữ dài hạn? → Glacier Flexible hoặc Deep Archive
  • Data có thể tái tạo (thumbnails, cache)? → One Zone-IA để tiết kiệm 20%
🚨 Cẩn thận minimum storage duration
Nếu bạn xóa object trong Standard-IA trước 30 ngày, bạn vẫn bị tính phí đủ 30 ngày. Glacier Flexible: 90 ngày. Deep Archive: 180 ngày. Đây là "bẫy chi phí" phổ biến!
04 · Bảo mật

Bucket Policy & ACL

S3 cung cấp nhiều cơ chế kiểm soát truy cập. Hiểu rõ từng cơ chế giúp bạn bảo vệ dữ liệu đúng cách và tránh lỗi bảo mật nghiêm trọng.

Tổng quan các cơ chế bảo mật

Cơ chế Phạm vi Định dạng Khuyến nghị
IAM Policy User/Role/Group JSON (gắn vào IAM entity) Ưu tiên
Bucket Policy Bucket level JSON (gắn vào bucket) Ưu tiên
ACL Bucket/Object level XML-based Không khuyến nghị
Access Points Endpoint riêng JSON policy per access point Cho multi-team
Block Public Access Account/Bucket 4 toggle settings Luôn bật

Bucket Policy — Ví dụ thực tế

1. Cho phép public read (static website)

bucket-policy-public-read.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-website-bucket/*"
    }
  ]
}

2. Chỉ cho phép truy cập từ VPC Endpoint

bucket-policy-vpc-only.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyNonVPCAccess",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::my-private-bucket",
        "arn:aws:s3:::my-private-bucket/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpce": "vpce-1a2b3c4d"
        }
      }
    }
  ]
}

3. Enforce HTTPS only

bucket-policy-https-only.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyHTTP",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

4. Cross-account access

bucket-policy-cross-account.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CrossAccountAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-shared-bucket",
        "arn:aws:s3:::my-shared-bucket/*"
      ]
    }
  ]
}

Block Public Access

AWS cung cấp 4 settings để chặn public access, có thể áp dụng ở cấp account hoặc bucket:

Setting Mô tả Khuyến nghị
BlockPublicAcls Chặn PUT bucket/object ACL nếu ACL là public ON
IgnorePublicAcls Bỏ qua tất cả public ACL đã có ON
BlockPublicPolicy Chặn PUT bucket policy nếu policy cho phép public ON
RestrictPublicBuckets Giới hạn truy cập public bucket chỉ cho AWS services ON
🚨 Bảo mật quan trọng
  • Luôn bật Block Public Access ở cấp account trừ khi có lý do cụ thể (static website)
  • AWS khuyến nghị không dùng ACL — bucket mới mặc định đã disable ACL (BucketOwnerEnforced)
  • Dùng IAM Policy + Bucket Policy thay vì ACL
  • Kiểm tra bucket public bằng: aws s3api get-public-access-block --bucket my-bucket

Quy trình đánh giá quyền truy cập

S3 Access Evaluation Flow Request GET /object Block Public Access Settings → DENY nếu public Bucket Policy + IAM Policy Union of policies ACL (nếu enabled) Bucket + Object ACL → ALLOW / DENY ✅ ALLOW ❌ DENY ⚠️ Explicit DENY luôn thắng. Nếu không có explicit ALLOW → implicit DENY. IAM Policy ALLOW + Bucket Policy ALLOW = ALLOW | Bất kỳ DENY = DENY
05 · Versioning

S3 Versioning

Versioning cho phép lưu giữ nhiều phiên bản của cùng một object trong bucket. Đây là tính năng quan trọng để bảo vệ dữ liệu khỏi bị ghi đè hoặc xóa nhầm.

Trạng thái Versioning

Trạng thái Mô tả Lưu ý
Unversioned Mặc định. Không lưu version cũ. Không thể quay lại trạng thái này sau khi enable
Enabled Mọi PUT đều tạo version mới. DELETE tạo delete marker. Tăng chi phí lưu trữ (giữ tất cả versions)
Suspended Ngừng tạo version mới. Versions cũ vẫn giữ. Object mới có versionId = null

Cách hoạt động

  • PUT object: Tạo version mới với VersionId unique. Version cũ vẫn tồn tại.
  • GET object: Trả về version mới nhất (current). Có thể GET version cụ thể bằng ?versionId=xxx.
  • DELETE object (không chỉ định versionId): Tạo delete marker — object "biến mất" nhưng versions cũ vẫn còn.
  • DELETE object (chỉ định versionId): Xóa vĩnh viễn version đó.
  • Khôi phục: Xóa delete marker hoặc copy version cũ thành version mới.
S3 Versioning — Vòng đời Object PUT v1 id: abc123 PUT v2 id: def456 DELETE → delete marker Xóa delete marker → v2 trở lại current 💰 Tất cả versions đều tính phí lưu trữ: v1 + v2 + delete marker Dùng Lifecycle Rule để tự động xóa old versions và giảm chi phí

MFA Delete

MFA Delete yêu cầu xác thực MFA khi:

  • Thay đổi trạng thái versioning của bucket
  • Xóa vĩnh viễn một object version
⚠️ MFA Delete
  • Chỉ root account mới có thể enable/disable MFA Delete
  • Chỉ có thể cấu hình qua CLI hoặc API, không qua Console
  • Versioning phải được enabled trước khi bật MFA Delete
Versioning Commands
# Enable versioning
aws s3api put-bucket-versioning \
  --bucket my-bucket \
  --versioning-configuration Status=Enabled

# Kiểm tra trạng thái versioning
aws s3api get-bucket-versioning --bucket my-bucket

# List tất cả versions của object
aws s3api list-object-versions \
  --bucket my-bucket \
  --prefix photos/beach.jpg

# GET version cụ thể
aws s3api get-object \
  --bucket my-bucket \
  --key photos/beach.jpg \
  --version-id "abc123" \
  output.jpg

# Xóa vĩnh viễn 1 version
aws s3api delete-object \
  --bucket my-bucket \
  --key photos/beach.jpg \
  --version-id "abc123"

# Enable MFA Delete (chỉ root account)
aws s3api put-bucket-versioning \
  --bucket my-bucket \
  --versioning-configuration Status=Enabled,MFADelete=Enabled \
  --mfa "arn:aws:iam::123456789012:mfa/root-mfa 123456"
06 · Mã hóa

S3 Encryption

S3 hỗ trợ mã hóa dữ liệu cả khi lưu trữ (at rest) và khi truyền tải (in transit). Từ tháng 1/2023, tất cả object mới đều được mã hóa mặc định bằng SSE-S3.

Các phương thức mã hóa at rest

Phương thức Key quản lý bởi Thuật toán Chi phí thêm Use case
SSE-S3 AWS (S3 managed) AES-256 Miễn phí Mặc định, đủ cho hầu hết trường hợp
SSE-KMS AWS KMS AES-256 KMS key + API calls Audit trail, key rotation, fine-grained control
DSSE-KMS AWS KMS Dual-layer AES-256 KMS key + API calls Compliance yêu cầu dual-layer encryption
SSE-C Khách hàng (bạn) AES-256 Miễn phí Bạn muốn tự quản lý key hoàn toàn
Client-side Khách hàng (bạn) Tùy chọn Miễn phí Mã hóa trước khi upload, end-to-end

SSE-S3 (Server-Side Encryption with S3 Managed Keys)

  • Mặc định cho tất cả bucket mới từ 01/2023
  • AWS quản lý key hoàn toàn — bạn không cần làm gì
  • Header: x-amz-server-side-encryption: AES256
  • Không có phí thêm, không giới hạn throughput

SSE-KMS (Server-Side Encryption with KMS Keys)

  • Dùng AWS KMS key (CMK) — có thể dùng AWS managed key hoặc customer managed key
  • Header: x-amz-server-side-encryption: aws:kms
  • Ưu điểm: audit trail qua CloudTrail, key rotation tự động, IAM control trên key
  • Nhược điểm: KMS quota — 5,500-30,000 requests/giây tùy region (có thể request tăng)
  • Phí: $1/tháng/key + $0.03/10,000 API calls
⚠️ KMS Throttling
Nếu bạn upload/download nhiều object với SSE-KMS, mỗi request đều gọi KMS API (GenerateDataKey / Decrypt). Với workload cao, bạn có thể bị throttle. Giải pháp: dùng S3 Bucket Key để giảm KMS calls tới 99%.

SSE-C (Server-Side Encryption with Customer-Provided Keys)

  • Bạn gửi encryption key trong mỗi request — S3 dùng key đó để encrypt/decrypt
  • S3 không lưu key — nếu mất key, mất dữ liệu
  • Bắt buộc dùng HTTPS
  • Phải gửi key trong header mỗi lần GET/PUT

Client-Side Encryption

  • Mã hóa dữ liệu trước khi gửi lên S3 bằng SDK (Amazon S3 Encryption Client)
  • S3 nhận dữ liệu đã mã hóa — không biết nội dung
  • Bạn chịu trách nhiệm hoàn toàn về key management

Default Encryption

Cấu hình Default Encryption
# Xem default encryption hiện tại
aws s3api get-bucket-encryption --bucket my-bucket

# Set default encryption = SSE-KMS với customer managed key
aws s3api put-bucket-encryption \
  --bucket my-bucket \
  --server-side-encryption-configuration '{
    "Rules": [{
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "aws:kms",
        "KMSMasterKeyID": "arn:aws:kms:ap-southeast-1:123456789012:key/abcd-1234"
      },
      "BucketKeyEnabled": true
    }]
  }'

# Enforce encryption bằng bucket policy (deny nếu không có encryption header)
# Lưu ý: từ 01/2023 S3 tự động encrypt SSE-S3, nên policy này
# chủ yếu dùng để enforce SSE-KMS cụ thể

Encryption in Transit

S3 hỗ trợ cả HTTP và HTTPS endpoint. Để enforce HTTPS:

  • Dùng bucket policy với condition aws:SecureTransport: false → Deny (xem ví dụ ở section 4)
  • S3 Transfer Acceleration luôn dùng HTTPS
  • VPC Endpoint (Gateway) traffic không đi qua internet nhưng vẫn nên dùng HTTPS
✅ Best Practice Encryption
  • Dùng SSE-S3 cho hầu hết workload (miễn phí, tự động)
  • Dùng SSE-KMS khi cần audit trail hoặc compliance yêu cầu
  • Luôn bật Bucket Key khi dùng SSE-KMS để giảm chi phí KMS
  • Enforce HTTPS bằng bucket policy
  • Dùng Client-side encryption cho dữ liệu cực nhạy cảm (PII, PHI)
07 · Quản lý dữ liệu

S3 Lifecycle Rules

Lifecycle rules tự động chuyển đổi storage class hoặc xóa objects dựa trên thời gian. Đây là công cụ quan trọng nhất để tối ưu chi phí S3.

Hai loại Lifecycle Action

🔄 Transition Actions
  • Chuyển object sang storage class khác sau N ngày
  • Ví dụ: Standard → Standard-IA sau 30 ngày
  • Có thể chain: Standard → IA → Glacier → Deep Archive
  • Áp dụng cho current version và/hoặc previous versions
🗑️ Expiration Actions
  • Xóa object sau N ngày
  • Xóa previous versions sau N ngày
  • Xóa incomplete multipart uploads sau N ngày
  • Xóa expired delete markers

Transition Waterfall (thứ tự hợp lệ)

Transition Waterfall — Chỉ chuyển xuống, không lên Standard Std-IA Int-Tiering Glacier Inst Glacier Flex Deep Archive One Zone-IA ⚠️ Không thể transition ngược lên (ví dụ: Glacier → Standard). Phải restore rồi copy.

Ví dụ Lifecycle Configuration

lifecycle-config.json
{
  "Rules": [
    {
      "ID": "MoveToIAThenGlacier",
      "Status": "Enabled",
      "Filter": { "Prefix": "logs/" },
      "Transitions": [
        {
          "Days": 30,
          "StorageClass": "STANDARD_IA"
        },
        {
          "Days": 90,
          "StorageClass": "GLACIER"
        },
        {
          "Days": 365,
          "StorageClass": "DEEP_ARCHIVE"
        }
      ],
      "Expiration": {
        "Days": 2555
      }
    },
    {
      "ID": "DeleteOldVersions",
      "Status": "Enabled",
      "Filter": {},
      "NoncurrentVersionTransitions": [
        {
          "NoncurrentDays": 30,
          "StorageClass": "STANDARD_IA"
        }
      ],
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 90
      }
    },
    {
      "ID": "CleanupIncompleteUploads",
      "Status": "Enabled",
      "Filter": {},
      "AbortIncompleteMultipartUpload": {
        "DaysAfterInitiation": 7
      }
    }
  ]
}
Áp dụng Lifecycle Rule
# Áp dụng lifecycle configuration
aws s3api put-bucket-lifecycle-configuration \
  --bucket my-bucket \
  --lifecycle-configuration file://lifecycle-config.json

# Xem lifecycle rules hiện tại
aws s3api get-bucket-lifecycle-configuration --bucket my-bucket
✅ Lifecycle Tips
  • Luôn tạo rule AbortIncompleteMultipartUpload (7 ngày) — incomplete uploads vẫn tính phí!
  • Dùng Filter với prefix/tag để áp dụng rule cho nhóm objects cụ thể
  • Kết hợp versioning: transition/expire noncurrent versions để tiết kiệm
  • Minimum 30 ngày trước khi transition từ Standard sang IA classes
  • Dùng S3 Storage Lens để phân tích access pattern trước khi tạo rules
08 · Replication

S3 Replication

S3 Replication tự động sao chép objects giữa các bucket. Hỗ trợ cả cross-region và same-region replication.

Hai loại Replication

🌍 Cross-Region Replication (CRR)
  • Sao chép giữa bucket ở khác region
  • Use case: compliance, lower latency, DR
  • Ví dụ: ap-southeast-1 → us-west-2
  • Có phí data transfer cross-region
🏠 Same-Region Replication (SRR)
  • Sao chép giữa bucket trong cùng region
  • Use case: log aggregation, cross-account copy
  • Ví dụ: prod-bucket → audit-bucket (cùng region)
  • Không phí data transfer

Yêu cầu & Lưu ý

  • Versioning phải enabled trên cả source và destination bucket
  • Cần IAM role cho phép S3 replicate
  • Hỗ trợ cross-account replication (destination bucket cần bucket policy cho phép)
  • Chỉ replicate objects mới sau khi enable rule (dùng S3 Batch Replication cho objects cũ)
  • Delete markers không được replicate mặc định (có thể bật DeleteMarkerReplication)
  • Permanent deletes (chỉ định versionId) không bao giờ được replicate (tránh cascading delete)
  • Không hỗ trợ chaining: nếu bucket A → B → C, object từ A chỉ đến B, không tự đến C
Cross-Region Replication (CRR) 📍 Region: ap-southeast-1 🪣 Source Bucket my-app-prod-apse1 Versioning: ✅ Enabled Replication Rule: prefix=data/ → dest async ~15 min SLA 📍 Region: us-west-2 🪣 Destination Bucket my-app-dr-usw2 Versioning: ✅ Enabled Có thể khác storage class

Cấu hình Replication

replication-config.json
{
  "Role": "arn:aws:iam::123456789012:role/S3ReplicationRole",
  "Rules": [
    {
      "ID": "ReplicateAll",
      "Status": "Enabled",
      "Priority": 1,
      "Filter": { "Prefix": "" },
      "Destination": {
        "Bucket": "arn:aws:s3:::my-app-dr-usw2",
        "StorageClass": "STANDARD_IA",
        "ReplicationTime": {
          "Status": "Enabled",
          "Time": { "Minutes": 15 }
        },
        "Metrics": {
          "Status": "Enabled",
          "EventThreshold": { "Minutes": 15 }
        }
      },
      "DeleteMarkerReplication": { "Status": "Enabled" }
    }
  ]
}
Áp dụng Replication
# Áp dụng replication configuration
aws s3api put-bucket-replication \
  --bucket my-app-prod-apse1 \
  --replication-configuration file://replication-config.json

# Replicate objects đã tồn tại (Batch Replication)
aws s3control create-job \
  --account-id 123456789012 \
  --operation '{"S3ReplicateObject":{}}' \
  --manifest-generator '...' \
  --priority 10 \
  --role-arn arn:aws:iam::123456789012:role/BatchReplicationRole
💡 S3 Replication Time Control (RTC)
Bật RTC để đảm bảo 99.99% objects được replicate trong 15 phút. Có phí thêm nhưng cần thiết cho DR compliance. Kết hợp với CloudWatch metrics để monitor replication lag.
09 · Compliance

S3 Object Lock & Compliance

S3 Object Lock cho phép lưu trữ objects theo mô hình WORM (Write Once Read Many) — ngăn chặn việc xóa hoặc ghi đè object trong khoảng thời gian xác định. Đáp ứng yêu cầu compliance của SEC, FINRA, HIPAA.

Yêu cầu

  • Object Lock chỉ có thể bật khi tạo bucket mới (không thể bật cho bucket đã tồn tại)
  • Versioning tự động enabled khi bật Object Lock
  • Áp dụng ở cấp object version

Hai chế độ Retention

Chế độ Ai có thể xóa/ghi đè? Có thể rút ngắn retention? Use case
Governance Mode User có permission s3:BypassGovernanceRetention Có (với permission đặc biệt) Test, internal compliance, linh hoạt hơn
Compliance Mode Không ai — kể cả root account Không Regulatory compliance (SEC 17a-4, HIPAA)

Legal Hold

  • Giống Object Lock nhưng không có thời hạn — giữ cho đến khi bạn tắt
  • Có thể bật/tắt bất kỳ lúc nào bởi user có permission s3:PutObjectLegalHold
  • Độc lập với retention period — object có thể có cả retention + legal hold
  • Use case: giữ evidence cho legal investigation
Object Lock Commands
# Tạo bucket với Object Lock enabled
aws s3api create-bucket \
  --bucket my-compliance-bucket \
  --region ap-southeast-1 \
  --create-bucket-configuration LocationConstraint=ap-southeast-1 \
  --object-lock-enabled-for-bucket

# Set default retention cho bucket (Compliance mode, 365 ngày)
aws s3api put-object-lock-configuration \
  --bucket my-compliance-bucket \
  --object-lock-configuration '{
    "ObjectLockEnabled": "Enabled",
    "Rule": {
      "DefaultRetention": {
        "Mode": "COMPLIANCE",
        "Days": 365
      }
    }
  }'

# Set retention cho object cụ thể
aws s3api put-object-retention \
  --bucket my-compliance-bucket \
  --key financial-report-2024.pdf \
  --retention '{"Mode":"GOVERNANCE","RetainUntilDate":"2027-12-31T00:00:00Z"}'

# Bật Legal Hold
aws s3api put-object-legal-hold \
  --bucket my-compliance-bucket \
  --key evidence-doc.pdf \
  --legal-hold '{"Status":"ON"}'

# Tắt Legal Hold
aws s3api put-object-legal-hold \
  --bucket my-compliance-bucket \
  --key evidence-doc.pdf \
  --legal-hold '{"Status":"OFF"}'
🚨 Cảnh báo Compliance Mode
Khi dùng Compliance Mode, không ai — kể cả AWS root account — có thể xóa object hoặc rút ngắn retention period. Nếu set sai retention period (ví dụ: 100 năm), bạn sẽ phải trả phí lưu trữ suốt thời gian đó. Hãy test với Governance Mode trước!
10 · Hiệu năng

S3 Performance Optimization

S3 tự động scale để xử lý hàng nghìn requests/giây. Tuy nhiên, hiểu các kỹ thuật tối ưu giúp bạn đạt throughput tối đa và giảm latency.

Baseline Performance

  • 3,500 PUT/COPY/POST/DELETE requests/giây/prefix
  • 5,500 GET/HEAD requests/giây/prefix
  • Không giới hạn số prefix trong bucket
  • Ví dụ: 10 prefix → 35,000 PUT + 55,000 GET/giây
💡 Prefix là gì?
Prefix là phần đường dẫn trước tên file. Ví dụ: object data/2024/report.csv có prefix data/2024/. Phân tán objects qua nhiều prefix giúp tăng throughput tổng.

Multipart Upload

  • Bắt buộc cho file > 5 GB, khuyến nghị cho file > 100 MB
  • Chia file thành nhiều parts, upload song song → tăng throughput
  • Nếu 1 part fail, chỉ cần retry part đó
  • Part size: 5 MB → 5 GB, tối đa 10,000 parts
Multipart Upload
# AWS CLI tự động dùng multipart cho file lớn
aws s3 cp large-file.zip s3://my-bucket/backups/ \
  --storage-class STANDARD_IA

# Cấu hình multipart threshold và chunk size
aws configure set default.s3.multipart_threshold 100MB
aws configure set default.s3.multipart_chunksize 50MB

# Manual multipart upload (low-level)
# 1. Initiate
aws s3api create-multipart-upload \
  --bucket my-bucket --key large-file.zip

# 2. Upload parts (song song)
aws s3api upload-part \
  --bucket my-bucket --key large-file.zip \
  --part-number 1 --upload-id "xxx" \
  --body part1.bin

# 3. Complete
aws s3api complete-multipart-upload \
  --bucket my-bucket --key large-file.zip \
  --upload-id "xxx" \
  --multipart-upload file://parts.json

# Liệt kê incomplete multipart uploads (tránh phí ẩn!)
aws s3api list-multipart-uploads --bucket my-bucket

S3 Transfer Acceleration

  • Sử dụng CloudFront Edge Locations để tăng tốc upload/download từ xa
  • Client upload đến edge location gần nhất → AWS backbone network → S3 bucket
  • Hiệu quả nhất khi client ở xa bucket region (ví dụ: user Việt Nam upload lên us-east-1)
  • Endpoint: my-bucket.s3-accelerate.amazonaws.com
  • Phí thêm: $0.04/GB (ngoài phí transfer thông thường)
Transfer Acceleration
# Enable Transfer Acceleration
aws s3api put-bucket-accelerate-configuration \
  --bucket my-bucket \
  --accelerate-configuration Status=Enabled

# Upload qua accelerated endpoint
aws s3 cp large-file.zip s3://my-bucket/ --endpoint-url https://s3-accelerate.amazonaws.com

# Test tốc độ: https://s3-accelerate-speedtest.s3-accelerate.amazonaws.com/en/accelerate-speed-comparsion.html

Byte-Range Fetches

  • Download một phần của object bằng HTTP Range header
  • Use case: download header của file, resume download, parallel download
  • Tăng tốc download file lớn bằng cách chia thành nhiều range requests song song
Byte-Range Fetch
# Download 1MB đầu tiên
aws s3api get-object \
  --bucket my-bucket \
  --key large-video.mp4 \
  --range "bytes=0-1048575" \
  first-1mb.bin

# Download từ byte 1MB đến 2MB
aws s3api get-object \
  --bucket my-bucket \
  --key large-video.mp4 \
  --range "bytes=1048576-2097151" \
  second-1mb.bin

S3 Select & Glacier Select

  • Truy vấn SQL trực tiếp trên object (CSV, JSON, Parquet) mà không cần download toàn bộ
  • Giảm data transfer tới 400%, giảm chi phí tới 80%
  • Ví dụ: file CSV 10 GB, chỉ cần 3 cột → S3 Select trả về ~500 MB
✅ Performance Checklist
  • File > 100 MB → dùng Multipart Upload
  • Client ở xa bucket → bật Transfer Acceleration
  • Download file lớn → dùng Byte-Range Fetches song song
  • Chỉ cần một phần data → dùng S3 Select
  • Phân tán key prefix để tối đa throughput
  • Đặt bucket ở region gần user nhất
11 · Tích hợp

S3 Event Notifications

S3 có thể gửi notification khi có sự kiện xảy ra trên bucket (upload, delete, restore...). Đây là nền tảng cho kiến trúc event-driven trên AWS.

Các loại sự kiện

Event Type Mô tả Ví dụ use case
s3:ObjectCreated:* Object được tạo (PUT, POST, COPY, CompleteMultipartUpload) Trigger Lambda resize ảnh
s3:ObjectRemoved:* Object bị xóa (Delete, DeleteMarkerCreated) Cleanup cache CDN
s3:ObjectRestore:* Object được restore từ Glacier Notify user khi restore xong
s3:Replication:* Replication events (completed, failed) Monitor replication health
s3:LifecycleTransition Object chuyển storage class Audit lifecycle changes
s3:ObjectTagging:* Tags được thêm/xóa Trigger workflow dựa trên tag

Destinations

AWS Lambda
Xử lý event real-time: resize ảnh, transcode video, index data, validate file.
📬
Amazon SQS
Queue events để xử lý async. Decouple producer/consumer. Retry tự động.
📢
Amazon SNS
Fan-out notification đến nhiều subscribers (email, SMS, HTTP, Lambda, SQS).
🌉
Amazon EventBridge
Advanced filtering, routing đến 18+ AWS services. Khuyến nghị cho kiến trúc mới.
S3 Event Notification Architecture 🪣 S3 Bucket ObjectCreated ObjectRemoved ObjectRestore ⚡ Lambda 📬 SQS Queue 📢 SNS Topic 🌉 EventBridge Advanced filtering → Lambda, SQS, SNS, Step Functions, Kinesis... ✨ Khuyến nghị cho kiến trúc mới

Cấu hình Event Notification → Lambda

S3 Event → Lambda
# Cấu hình notification
aws s3api put-bucket-notification-configuration \
  --bucket my-images-bucket \
  --notification-configuration '{
    "LambdaFunctionConfigurations": [
      {
        "Id": "ResizeImageOnUpload",
        "LambdaFunctionArn": "arn:aws:lambda:ap-southeast-1:123456789012:function:resize-image",
        "Events": ["s3:ObjectCreated:*"],
        "Filter": {
          "Key": {
            "FilterRules": [
              {"Name": "prefix", "Value": "uploads/"},
              {"Name": "suffix", "Value": ".jpg"}
            ]
          }
        }
      }
    ]
  }'

# Lưu ý: Lambda function cần resource-based policy cho phép S3 invoke
aws lambda add-permission \
  --function-name resize-image \
  --statement-id s3-trigger \
  --action lambda:InvokeFunction \
  --principal s3.amazonaws.com \
  --source-arn arn:aws:s3:::my-images-bucket
✅ EventBridge vs S3 Notification truyền thống
  • EventBridge hỗ trợ advanced filtering (filter theo metadata, object size, etc.)
  • EventBridge có thể route đến 18+ AWS services (Step Functions, Kinesis, ECS...)
  • EventBridge hỗ trợ archive & replay events
  • Không cần cấu hình resource policy trên destination
  • Chỉ cần bật 1 lần: aws s3api put-bucket-notification-configuration với EventBridgeConfiguration: {}
12 · Website Hosting

S3 Static Website Hosting

S3 có thể host website tĩnh (HTML, CSS, JS, images) trực tiếp từ bucket. Kết hợp với CloudFront để có HTTPS, caching, và custom domain.

Cấu hình cơ bản

  1. Tạo bucket với tên = domain (ví dụ: www.example.com)
  2. Enable Static Website Hosting
  3. Set index document và error document
  4. Tắt Block Public Access (cho bucket này)
  5. Thêm Bucket Policy cho phép public read
  6. Upload files
Cấu hình Static Website
# 1. Enable static website hosting
aws s3 website s3://my-website-bucket/ \
  --index-document index.html \
  --error-document error.html

# 2. Tắt Block Public Access
aws s3api put-public-access-block \
  --bucket my-website-bucket \
  --public-access-block-configuration \
    BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false

# 3. Thêm bucket policy cho public read
aws s3api put-bucket-policy --bucket my-website-bucket --policy '{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "PublicRead",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::my-website-bucket/*"
  }]
}'

# 4. Upload website files
aws s3 sync ./dist/ s3://my-website-bucket/ \
  --cache-control "max-age=86400"

# Website URL format:
# http://my-website-bucket.s3-website-ap-southeast-1.amazonaws.com
# hoặc http://my-website-bucket.s3-website.ap-southeast-1.amazonaws.com

Kết hợp CloudFront (khuyến nghị)

S3 website endpoint chỉ hỗ trợ HTTP. Để có HTTPS, custom domain, caching toàn cầu:

S3 Static Website + CloudFront 👤 User HTTPS example.com Route 53 DNS → CloudFront Alias record ☁️ CloudFront HTTPS + ACM cert Edge caching OAC (Origin Access) 🪣 S3 Bucket Private (không public) Chỉ CloudFront truy cập
💡 OAC vs OAI
  • OAC (Origin Access Control) — phương thức mới, khuyến nghị. Hỗ trợ SSE-KMS, tất cả regions.
  • OAI (Origin Access Identity) — legacy, vẫn hoạt động nhưng không nên dùng cho setup mới.
  • Với OAC, bucket không cần public — CloudFront dùng IAM role để truy cập S3.

CORS Configuration

Nếu website cần load resources từ S3 bucket khác (fonts, API), cần cấu hình CORS:

CORS Configuration
aws s3api put-bucket-cors --bucket my-assets-bucket --cors-configuration '{
  "CORSRules": [
    {
      "AllowedOrigins": ["https://www.example.com"],
      "AllowedMethods": ["GET", "HEAD"],
      "AllowedHeaders": ["*"],
      "ExposeHeaders": ["ETag"],
      "MaxAgeSeconds": 3600
    }
  ]
}'
13 · Access Points

S3 Access Points & VPC Endpoints

Access Points đơn giản hóa việc quản lý truy cập cho shared datasets. Thay vì 1 bucket policy phức tạp, mỗi team/application có access point riêng với policy riêng.

S3 Access Points

  • Mỗi access point có DNS name riêng, policy riêng, và có thể giới hạn VPC
  • Ví dụ: 1 data lake bucket, 3 access points cho analytics-team, ml-team, finance-team
  • Access point policy phải là subset của bucket policy (không thể grant nhiều hơn bucket cho phép)
  • Hỗ trợ Internet hoặc VPC-only access
S3 Access Points
# Tạo access point (Internet access)
aws s3control create-access-point \
  --account-id 123456789012 \
  --name analytics-ap \
  --bucket my-datalake-bucket

# Tạo access point (VPC only)
aws s3control create-access-point \
  --account-id 123456789012 \
  --name internal-ap \
  --bucket my-datalake-bucket \
  --vpc-configuration VpcId=vpc-1a2b3c4d

# Set access point policy
aws s3control put-access-point-policy \
  --account-id 123456789012 \
  --name analytics-ap \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::123456789012:role/AnalyticsRole"},
      "Action": ["s3:GetObject", "s3:ListBucket"],
      "Resource": [
        "arn:aws:s3:ap-southeast-1:123456789012:accesspoint/analytics-ap",
        "arn:aws:s3:ap-southeast-1:123456789012:accesspoint/analytics-ap/object/*"
      ]
    }]
  }'

# Truy cập qua access point
aws s3 ls s3://arn:aws:s3:ap-southeast-1:123456789012:accesspoint/analytics-ap/

S3 VPC Gateway Endpoint

  • Cho phép EC2 trong VPC truy cập S3 không qua Internet
  • Traffic đi qua AWS private network — bảo mật hơn, không tốn NAT Gateway cost
  • Loại Gateway Endpoint — miễn phí, thêm vào route table
  • Loại Interface Endpoint — có phí, dùng PrivateLink, cần cho on-premises access qua VPN/DX
VPC Gateway Endpoint cho S3
# Tạo VPC Gateway Endpoint cho S3
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-1a2b3c4d \
  --service-name com.amazonaws.ap-southeast-1.s3 \
  --route-table-ids rtb-11aa22bb

# Kiểm tra endpoint
aws ec2 describe-vpc-endpoints \
  --filters "Name=service-name,Values=com.amazonaws.ap-southeast-1.s3"
✅ Tiết kiệm chi phí với VPC Endpoint
Nếu EC2 trong private subnet truy cập S3 qua NAT Gateway, bạn trả phí NAT ($0.045/GB). Dùng S3 Gateway Endpoint (miễn phí) để tiết kiệm đáng kể — đặc biệt với workload data-intensive.
14 · Troubleshooting

Các lỗi thường gặp

Tổng hợp các lỗi phổ biến khi làm việc với S3 và cách khắc phục.

HTTP Error Codes

Error HTTP Code Nguyên nhân phổ biến Cách khắc phục
AccessDenied 403 Thiếu permission trong IAM/Bucket Policy, Block Public Access đang bật Kiểm tra IAM policy, bucket policy, Block Public Access settings, object ACL
NoSuchBucket 404 Bucket không tồn tại hoặc sai tên Kiểm tra tên bucket (case-sensitive), region
NoSuchKey 404 Object key không tồn tại Kiểm tra key chính xác, versioning (có thể bị delete marker)
SlowDown 503 Vượt quá request rate limit Implement exponential backoff, phân tán prefix
EntityTooLarge 400 Upload đơn vượt 5 GB Dùng multipart upload
InvalidBucketName 400 Tên bucket không hợp lệ 3-63 ký tự, lowercase, không dấu chấm, không bắt đầu bằng xn--
BucketAlreadyExists 409 Tên bucket đã được account khác sử dụng Chọn tên khác (bucket name globally unique)
InvalidObjectState 403 GET object đang ở Glacier (chưa restore) Initiate restore trước, đợi restore hoàn tất

Vấn đề thường gặp & Giải pháp

🐌 Upload chậm

Nguyên nhân & Giải pháp
  • File lớn upload đơn → Dùng multipart upload (song song nhiều parts)
  • Client ở xa bucket region → Bật Transfer Acceleration
  • Network bandwidth thấp → Dùng AWS Snowball cho data migration lớn (TB-PB)
  • Không tận dụng bandwidth → Tăng max_concurrent_requests trong AWS CLI config

💸 Chi phí bất ngờ (Cost Surprises)

🚨 Các "bẫy" chi phí S3
  • Incomplete multipart uploads: Parts đã upload nhưng chưa complete/abort vẫn tính phí → Tạo lifecycle rule abort sau 7 ngày
  • Old versions: Versioning giữ tất cả versions → Tạo lifecycle rule expire noncurrent versions
  • Delete markers: Hàng triệu delete markers vẫn tốn phí LIST → Tạo lifecycle rule xóa expired delete markers
  • Minimum storage duration: Xóa object IA trước 30 ngày vẫn tính đủ 30 ngày
  • Retrieval fees: Restore từ Glacier có phí per-GB, Expedited rất đắt
  • Data transfer out: Download từ S3 ra internet tính phí ($0.09/GB). Dùng CloudFront có thể rẻ hơn
  • Request fees: Hàng triệu LIST/GET requests cộng dồn đáng kể

🔐 403 AccessDenied — Checklist debug

Debug 403 AccessDenied
# 1. Kiểm tra IAM user/role hiện tại
aws sts get-caller-identity

# 2. Kiểm tra bucket policy
aws s3api get-bucket-policy --bucket my-bucket

# 3. Kiểm tra Block Public Access
aws s3api get-public-access-block --bucket my-bucket

# 4. Kiểm tra object ACL
aws s3api get-object-acl --bucket my-bucket --key my-file.txt

# 5. Kiểm tra bucket ACL
aws s3api get-bucket-acl --bucket my-bucket

# 6. Kiểm tra encryption (SSE-KMS cần kms:Decrypt permission)
aws s3api head-object --bucket my-bucket --key my-file.txt

# 7. Simulate IAM policy
aws iam simulate-principal-policy \
  --policy-source-arn arn:aws:iam::123456789012:user/myuser \
  --action-names s3:GetObject \
  --resource-arns arn:aws:s3:::my-bucket/my-file.txt

# 8. Kiểm tra VPC Endpoint policy (nếu truy cập từ VPC)
aws ec2 describe-vpc-endpoints --vpc-endpoint-ids vpce-xxx
15 · Best Practices

Tips & Best Practices

Tổng hợp các best practices cho S3 về bảo mật, chi phí, hiệu năng và vận hành.

🔒 Security Checklist

# Hạng mục Hành động Mức độ
1 Block Public Access Bật ở cấp account cho tất cả bucket Critical
2 Encryption Đảm bảo default encryption enabled (SSE-S3 hoặc SSE-KMS) Critical
3 HTTPS Enforce HTTPS bằng bucket policy (deny aws:SecureTransport=false) Critical
4 Versioning Enable cho bucket quan trọng (production data, backups) High
5 Access Logging Bật S3 Server Access Logging hoặc CloudTrail data events High
6 MFA Delete Bật cho bucket chứa dữ liệu critical Medium
7 VPC Endpoint Dùng Gateway Endpoint cho EC2 truy cập S3 Medium
8 Object Lock Dùng cho compliance data (WORM) Medium
9 Cross-account Dùng bucket policy + IAM role, không dùng ACL Medium
10 Presigned URLs Dùng presigned URL thay vì public bucket cho temporary access High

💰 Cost Optimization

♻️
Lifecycle Rules
Tự động chuyển data ít truy cập sang IA/Glacier. Xóa old versions và incomplete uploads.
🧠
Intelligent-Tiering
Cho data không rõ access pattern. Tự động tối ưu mà không cần quản lý.
📊
S3 Storage Lens
Dashboard phân tích usage, cost, activity. Tìm bucket tốn kém nhất.
🏷️
Cost Allocation Tags
Tag bucket theo team/project để track chi phí chính xác.
🚪
VPC Endpoint
Tránh phí NAT Gateway cho S3 traffic từ private subnet.
☁️
CloudFront
Cache S3 content ở edge. Giảm S3 requests và data transfer cost.

📛 Naming Convention

Bucket Naming Convention
# Pattern: {org}-{env}-{purpose}-{region-short}
acme-prod-assets-apse1          # Production assets, Singapore
acme-dev-logs-use1              # Dev logs, N. Virginia
acme-prod-backup-usw2           # Production backup, Oregon
acme-staging-datalake-apse1     # Staging data lake

# Object key convention
# Pattern: {category}/{year}/{month}/{day}/{filename}
logs/2024/03/15/access-log-001.gz
backups/database/2024/03/15/mydb-full.sql.gz
uploads/users/u-12345/avatar.jpg
raw-data/events/2024/03/15/events-001.parquet

⚡ Performance Best Practices

  • Prefix distribution: Phân tán objects qua nhiều prefix để tối đa throughput
  • Multipart upload: Luôn dùng cho file > 100 MB
  • Transfer Acceleration: Bật khi upload từ xa (cross-continent)
  • Byte-range fetches: Download song song nhiều ranges cho file lớn
  • S3 Select: Query trực tiếp trên CSV/JSON/Parquet thay vì download toàn bộ
  • CloudFront caching: Cache static content ở edge, giảm latency và S3 load
  • Bucket region: Đặt bucket ở region gần user/compute nhất
  • Connection pooling: Reuse HTTP connections trong SDK (mặc định đã bật)

🔄 Operational Best Practices

  • Bật S3 Server Access Logging hoặc CloudTrail Data Events cho audit
  • Dùng S3 Inventory để có danh sách objects hàng ngày/tuần (thay vì LIST API tốn kém)
  • Monitor với CloudWatch Metrics: BucketSizeBytes, NumberOfObjects, 4xxErrors, 5xxErrors
  • Set CloudWatch Alarms cho bất thường (spike requests, error rate cao)
  • Dùng AWS Config Rules để enforce compliance (encryption, public access, versioning)
  • Implement S3 Batch Operations cho bulk actions (copy, tag, restore, invoke Lambda)
✅ Presigned URLs — Chia sẻ an toàn
Thay vì public bucket, dùng presigned URL để chia sẻ object tạm thời:
Presigned URLs
# Tạo presigned URL cho download (hết hạn sau 1 giờ)
aws s3 presign s3://my-bucket/reports/q1-2024.pdf \
  --expires-in 3600

# Tạo presigned URL cho upload
aws s3 presign s3://my-bucket/uploads/user-file.pdf \
  --expires-in 3600

# Output: https://my-bucket.s3.amazonaws.com/reports/q1-2024.pdf?X-Amz-Algorithm=...
# Ai có URL này đều có thể download trong 1 giờ
16 · Cheat Sheet

AWS CLI Cheat Sheet cho S3

Tổng hợp các lệnh AWS CLI thường dùng nhất cho S3, chia theo nhóm chức năng.

📦 Bucket Operations

Bucket Management
# Tạo bucket
aws s3 mb s3://my-new-bucket --region ap-southeast-1

# Tạo bucket (s3api — chi tiết hơn)
aws s3api create-bucket \
  --bucket my-new-bucket \
  --region ap-southeast-1 \
  --create-bucket-configuration LocationConstraint=ap-southeast-1

# Liệt kê tất cả buckets
aws s3 ls

# Liệt kê objects trong bucket
aws s3 ls s3://my-bucket/
aws s3 ls s3://my-bucket/photos/ --recursive --human-readable --summarize

# Xóa bucket (phải rỗng)
aws s3 rb s3://my-bucket

# Xóa bucket + tất cả objects (NGUY HIỂM!)
aws s3 rb s3://my-bucket --force

# Xem thông tin bucket
aws s3api get-bucket-location --bucket my-bucket
aws s3api get-bucket-versioning --bucket my-bucket
aws s3api get-bucket-encryption --bucket my-bucket

📄 Object Operations

Object Upload / Download / Copy / Delete
# Upload file
aws s3 cp myfile.txt s3://my-bucket/
aws s3 cp myfile.txt s3://my-bucket/folder/renamed.txt

# Upload với storage class
aws s3 cp myfile.txt s3://my-bucket/ --storage-class STANDARD_IA

# Upload với metadata
aws s3 cp myfile.txt s3://my-bucket/ \
  --metadata '{"project":"alpha","team":"backend"}' \
  --content-type "text/plain"

# Upload thư mục (recursive)
aws s3 cp ./local-folder/ s3://my-bucket/remote-folder/ --recursive

# Sync (chỉ upload files thay đổi)
aws s3 sync ./local-folder/ s3://my-bucket/remote-folder/
aws s3 sync ./dist/ s3://my-website/ --delete  # --delete xóa files không còn ở source

# Download
aws s3 cp s3://my-bucket/myfile.txt ./
aws s3 cp s3://my-bucket/folder/ ./local/ --recursive

# Copy giữa buckets
aws s3 cp s3://source-bucket/file.txt s3://dest-bucket/file.txt

# Move (copy + delete source)
aws s3 mv s3://my-bucket/old-key.txt s3://my-bucket/new-key.txt

# Xóa object
aws s3 rm s3://my-bucket/myfile.txt
aws s3 rm s3://my-bucket/folder/ --recursive  # Xóa cả folder

# Xem metadata object
aws s3api head-object --bucket my-bucket --key myfile.txt

🔒 Security & Encryption

Security Commands
# Kiểm tra Block Public Access
aws s3api get-public-access-block --bucket my-bucket

# Bật Block Public Access
aws s3api put-public-access-block --bucket my-bucket \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

# Xem/Set bucket policy
aws s3api get-bucket-policy --bucket my-bucket
aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
aws s3api delete-bucket-policy --bucket my-bucket

# Xem/Set encryption
aws s3api get-bucket-encryption --bucket my-bucket
aws s3api put-bucket-encryption --bucket my-bucket \
  --server-side-encryption-configuration '{
    "Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]
  }'

# Upload với encryption cụ thể
aws s3 cp myfile.txt s3://my-bucket/ --sse aws:kms --sse-kms-key-id alias/my-key

# Tạo presigned URL
aws s3 presign s3://my-bucket/file.pdf --expires-in 3600

♻️ Versioning & Lifecycle

Versioning & Lifecycle
# Enable versioning
aws s3api put-bucket-versioning --bucket my-bucket \
  --versioning-configuration Status=Enabled

# List versions
aws s3api list-object-versions --bucket my-bucket --prefix myfile.txt

# Download version cụ thể
aws s3api get-object --bucket my-bucket --key myfile.txt \
  --version-id "abc123" output.txt

# Xóa version cụ thể
aws s3api delete-object --bucket my-bucket --key myfile.txt \
  --version-id "abc123"

# Set lifecycle rules
aws s3api put-bucket-lifecycle-configuration --bucket my-bucket \
  --lifecycle-configuration file://lifecycle.json

# Xem lifecycle rules
aws s3api get-bucket-lifecycle-configuration --bucket my-bucket

🌍 Replication & Advanced

Replication & Advanced Operations
# Set replication
aws s3api put-bucket-replication --bucket source-bucket \
  --replication-configuration file://replication.json

# Enable Transfer Acceleration
aws s3api put-bucket-accelerate-configuration --bucket my-bucket \
  --accelerate-configuration Status=Enabled

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

# Set CORS
aws s3api put-bucket-cors --bucket my-bucket --cors-configuration file://cors.json

# Enable access logging
aws s3api put-bucket-logging --bucket my-bucket --bucket-logging-status '{
  "LoggingEnabled": {
    "TargetBucket": "my-logs-bucket",
    "TargetPrefix": "s3-access-logs/my-bucket/"
  }
}'

# Restore object từ Glacier
aws s3api restore-object --bucket my-bucket --key archive/old-data.gz \
  --restore-request '{"Days":7,"GlacierJobParameters":{"Tier":"Standard"}}'

# Kiểm tra restore status
aws s3api head-object --bucket my-bucket --key archive/old-data.gz

# S3 Select (query CSV trực tiếp)
aws s3api select-object-content \
  --bucket my-bucket \
  --key data/sales.csv \
  --expression "SELECT s.product, s.revenue FROM s3object s WHERE s.revenue > '1000'" \
  --expression-type SQL \
  --input-serialization '{"CSV":{"FileHeaderInfo":"USE"}}' \
  --output-serialization '{"CSV":{}}' \
  output.csv

⚙️ AWS CLI S3 Configuration

CLI Performance Tuning
# Tăng concurrent requests (mặc định: 10)
aws configure set default.s3.max_concurrent_requests 20

# Set multipart threshold (mặc định: 8MB)
aws configure set default.s3.multipart_threshold 100MB

# Set multipart chunk size (mặc định: 8MB)
aws configure set default.s3.multipart_chunksize 50MB

# Set max queue size
aws configure set default.s3.max_queue_size 10000

# Xem cấu hình hiện tại
aws configure get default.s3.max_concurrent_requests

# Dùng profile cụ thể
aws s3 ls --profile production

# Dry run (xem sẽ làm gì mà không thực hiện)
aws s3 sync ./local/ s3://my-bucket/ --dryrun
💡 s3 vs s3api
  • aws s3 — high-level commands (cp, mv, sync, ls, mb, rb). Đơn giản, tự động multipart.
  • aws s3api — low-level API calls. Chi tiết hơn, 1:1 với S3 REST API. Dùng khi cần control chính xác.
  • Ví dụ: aws s3 cp tự động multipart, nhưng aws s3api put-object chỉ upload đơn (max 5GB).

Tổng hợp từ AWS S3 Official Documentation và các nguồn uy tín · Cập nhật tháng 4/2026