Lab 5: Private S3 Bucket Baseline
Lab นี้สร้าง private S3 Bucket ที่มี Versioning, Encryption, Lifecycle, Pre-signed URL และ IAM Role access baseline สำหรับใช้ใน Phase ถัดไป
Goal
สร้าง private S3 bucket baseline
Bucket ต้องไม่ public, มี versioning, encryption, lifecycle และ least privilege access
Safety
Object versions อยู่จนกว่าจะ cleanup
ลบ object ธรรมดาอาจเหลือ delete marker/noncurrent versions และยังคิด storage cost
Output
Private bucket, presigned URL, role access, restore test
สุดท้ายต้องพิสูจน์ว่าแชร์ชั่วคราวได้โดยไม่เปิด public และกู้ version เดิมได้
Run order
- Create private bucket พร้อม Block Public Access และ tags
- Enable Versioning และ default encryption
- Upload object หลาย versions แล้ว list object versions
- Create lifecycle rule และ generate pre-signed URL
- Attach least-privilege read policy ให้ EC2 role แล้ว cleanup versions/bucket เมื่อไม่ใช้ต่อ
Learning objectives
- สร้าง private S3 bucket พร้อม Block Public Access
- เปิด Versioning และ Server-side Encryption
- สร้าง Lifecycle Policy สำหรับ noncurrent versions และ log/archive prefix
- สร้างและทดสอบ Pre-signed URL
- ให้ EC2 role อ่าน object จาก bucket ตาม least privilege
- กู้คืน object version ก่อนหน้า
Prerequisites
- ผ่าน Phase 2 IAM และมี role/user ที่สร้าง S3 bucket/policy ได้
- ผ่าน Phase 4 ถ้าต้องการทดสอบ access จาก EC2 role
- ตั้ง Budget และ Tagging convention แล้ว
Step 1: Create private bucket
aws s3api create-bucket \
--bucket your-unique-learning-bucket-name \
--region ap-southeast-1 \
--create-bucket-configuration LocationConstraint=ap-southeast-1
- เปิด Block Public Access ทั้งหมด
- ตั้ง Tags:
Environment=learning,Project=aws-infra-learning,Owner=your-name - ยืนยันว่า bucket ไม่ public
Step 2: Enable Versioning and Encryption
aws s3api put-bucket-versioning \
--bucket your-unique-learning-bucket-name \
--versioning-configuration Status=Enabled
aws s3api put-bucket-encryption \
--bucket your-unique-learning-bucket-name \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}
}]
}'
Step 3: Upload and version an object
echo "version 1" > demo.txt
aws s3 cp demo.txt s3://your-unique-learning-bucket-name/demo.txt
echo "version 2" > demo.txt
aws s3 cp demo.txt s3://your-unique-learning-bucket-name/demo.txt
aws s3api list-object-versions --bucket your-unique-learning-bucket-name --prefix demo.txt
Step 4: Create lifecycle rule
ตั้ง rule ให้ลบ noncurrent versions หลังเวลาที่เหมาะสมสำหรับ Lab เช่น 7 วัน และ transition prefix archive/ ถ้าต้องการทดลอง
Step 5: Generate Pre-signed URL
aws s3 presign s3://your-unique-learning-bucket-name/demo.txt --expires-in 300
เปิด URL ภายใน 5 นาทีเพื่อยืนยัน temporary access โดยไม่เปิด bucket public
Step 6: EC2 role read access
Attach policy ให้ EC2 role อ่านเฉพาะ bucket/prefix ที่ต้องใช้:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::your-unique-learning-bucket-name",
"arn:aws:s3:::your-unique-learning-bucket-name/*"
]
}]
}
Expected results
Definition of done
- Bucket private และ Block Public Access เปิดอยู่
- Object มีมากกว่าหนึ่ง version
- Default encryption เปิดอยู่
- Pre-signed URL ใช้งานได้เฉพาะช่วงเวลาที่กำหนด
- EC2 role อ่าน object ได้โดยไม่ใช้ long-term Access Key
- Object versions, delete markers และ bucket ถูก cleanup ถ้าไม่ใช้ต่อ
Troubleshooting
| อาการ | แนวทางแก้ |
|---|---|
| Bucket name already exists | ใช้ชื่อ bucket ที่ unique กว่า เช่นเติม account id/date |
| AccessDenied | ตรวจ IAM policy, bucket policy, KMS permission ถ้าใช้ SSE-KMS และ Block Public Access |
| Pre-signed URL ใช้ไม่ได้ | ตรวจ expiration, object key, credential ของผู้สร้าง URL และ system time |
| ลบ object แล้วแต่ยังเห็น version | ตรวจ delete marker และ list object versions |
Cleanup procedures
- ลบ object versions และ delete markers ทั้งหมด
- ลบ lifecycle rule ถ้าไม่ใช้
- Detach policy จาก EC2 role ถ้าเป็น policy เฉพาะ Lab
- ลบ bucket เมื่อแน่ใจว่าไม่ใช้ต่อ
- ตรวจ Cost Explorer สำหรับ storage และ request cost
Mini quiz
- ทำไม bucket private + pre-signed URL ปลอดภัยกว่าเปิด public สำหรับ sharing ชั่วคราว?
- Versioning เพิ่ม cost ได้อย่างไร?
- ถ้าใช้ SSE-KMS application role ต้องมี permission เพิ่มอะไร?