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.
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 |
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-1cho 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)
Cấu trúc URL của S3 Object
# 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
{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
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
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 |
- 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%
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)
{
"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
{
"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
{
"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
{
"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 |
- 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 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
VersionIdunique. 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.
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
- 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
# 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"
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
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
# 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
- 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)
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
- 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
- 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ệ)
Ví dụ Lifecycle Configuration
{
"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 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
- 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
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
- 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
- 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
Cấu hình Replication
{
"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 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 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
# 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"}'
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
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
# 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)
# 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
# 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
- 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
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
Cấu hình Event Notification → 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 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-configurationvớiEventBridgeConfiguration: {}
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
- Tạo bucket với tên = domain (ví dụ:
www.example.com) - Enable Static Website Hosting
- Set index document và error document
- Tắt Block Public Access (cho bucket này)
- Thêm Bucket Policy cho phép public read
- Upload files
# 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:
- 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:
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
}
]
}'
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
# 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
# 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"
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
- 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_requeststrong AWS CLI config
💸 Chi phí bất ngờ (Cost Surprises)
- 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
# 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
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
📛 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)
# 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ờ
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
# 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
# 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
# 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
# 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
# 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
# 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
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 cptự động multipart, nhưngaws s3api put-objectchỉ upload đơn (max 5GB).