Hands-on LabStores data until cleanup

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
  1. Create private bucket พร้อม Block Public Access และ tags
  2. Enable Versioning และ default encryption
  3. Upload object หลาย versions แล้ว list object versions
  4. Create lifecycle rule และ generate pre-signed URL
  5. 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
  1. เปิด Block Public Access ทั้งหมด
  2. ตั้ง Tags: Environment=learning, Project=aws-infra-learning, Owner=your-name
  3. ยืนยันว่า 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
  1. Bucket private และ Block Public Access เปิดอยู่
  2. Object มีมากกว่าหนึ่ง version
  3. Default encryption เปิดอยู่
  4. Pre-signed URL ใช้งานได้เฉพาะช่วงเวลาที่กำหนด
  5. EC2 role อ่าน object ได้โดยไม่ใช้ long-term Access Key
  6. 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

  1. ลบ object versions และ delete markers ทั้งหมด
  2. ลบ lifecycle rule ถ้าไม่ใช้
  3. Detach policy จาก EC2 role ถ้าเป็น policy เฉพาะ Lab
  4. ลบ bucket เมื่อแน่ใจว่าไม่ใช้ต่อ
  5. ตรวจ Cost Explorer สำหรับ storage และ request cost

Mini quiz

  1. ทำไม bucket private + pre-signed URL ปลอดภัยกว่าเปิด public สำหรับ sharing ชั่วคราว?
  2. Versioning เพิ่ม cost ได้อย่างไร?
  3. ถ้าใช้ SSE-KMS application role ต้องมี permission เพิ่มอะไร?