Sync File ขึ้น S3 แบบทั้งยวง
อัพเดทล่าสุด 25 พ.ย. 66
ที่เก็บ static file สุดเจ๋ง
คำสั่ง sync s3

เริ่มจากติดตั้ง aws-cli ก่อนเลย ซึ่งมีทั้ง Windows , Linux , Mac สามารถดาวน์โหลดได้ ที่นี่

เรื่องการติดตั้งก็ไม่มีอะไรให้อธิบาย แต่หลังจากติดตั้ง มีเรื่องที่ต้องทำ ก่อนคือ การตั้งค่า ให้ใช้คำสั่ง aws configure เพื่อตั้งค่า AccessKey ตามนี้

# aws configure
AWS Access Key ID [*******************]: 
AWS Secret Access Key [*******************]:
Default region name [ap-southeast-1]:
Default output format [json]:

ตรง Access Key กับ Secret Access Key ก็ใส่ของท่านไป ตามที่สร้างเอาไว้ ส่วน region ผมใช้ของสิงค์โปร์ (ซึ่งใกล้ไทยสุด) ก็เลยใส่ว่า ap-southeast-1 ส่วน output ก็ใส่ว่า json ตามปกติ 

แค่นี้ก็เริ่มใช้งาน ขั้นถัดไปได้แล้ว

เริ่มการ Sync File

เอาง่ายเลย คำสั่งมันมีแค่

aws s3 sync [source] [destination]

ซึ่ง เราจะ Sync จาก S3 ลงมา รึจะเอาขึ้นไป ก็ได้ โดยการสลับ [source] กับ [destination] นั่นล่ะ

ทีนี้ถ้าเป็นเครื่องเรา ก็ใส่ absolute path เข้าไป เช่น d:/my-path/ ส่วน ถ้าเป็นฝั่ง s3 ก็ใส่ bucket กับ path ไป เช่น s3://my-bucket/my-path/ รวมๆ แล้วจะได้คำสั่งประมาณนี้ ก็เริ่ม sync ได้เลย

aws s3 sync d:/my-path/ s3://my-bucket/my-path/
คำสั่งอื่นๆ ที่น่าสนใจ ของ aws s3

เรียกดูรายการ bucket

aws s3api list-buckets

ลบ folder ทั้งยวง

aws s3 rm s3://my-bucket/my-path/ --recursive
ใช้กับเจ้าอื่นที่ รองรับ aws-cli

จริงๆ S3 นอกจาก AWS แล้ว ยังมีเจ้าอื่นๆ ที่ใช้เทคโนโลยีเดียวกันนี้ด้วย (เค้าเรียกว่า Object-Storage) เราสามารถใช้คำสั่ง ข้างบนได้ด้วย

เท่าที่ผมใช้งานจริง ลองแล้ว อยู่สองเจ้านะครับ คือ digitalocean กับ cloudflare ซึ่งจะมีรายละเอียด ย่อยๆ ตามนี้

digitalocean

ต้องไประบุ Default region name เป็น sgp1 (กรณีใช้กับสิงค์โปร) แล้วก็ใช้คำสั่ง ระบุ endpoint แบบนี้

aws s3 sync d:/my-path/ s3://my-bucket/my-path/ --endpoint=https://sgp1.digitaloceanspaces.com

 cloudflare 

เจ้านี้ต้องไประบุ Default region name เป็น auto ซะงั้น แต่ต้องไประบุ endpoint แยกตาม acc ที่ใช้งานแทน ซึ่งใช้ Account ID ตรงๆ เลย แบบนี้

aws s3 sync d:/my-path/ s3://my-bucket/my-path/ --endpoint=https://[account_id].r2.cloudflarestorage.com
เพิ่มเคล็ดลับอีกนิดนึง

โดยปกติผมใช้ s3 เพื่อเป็นที่เก็บ static file ที่เอาไปใช้แบบ public url

ปัญหาคือ พอเรา sync เข้าไปแบบที่ ทุกไฟล์ที่ส่งเข้าไป จะไม่ได้ public access ซึ่งวิธีแก้ ก็คือ ไปไล่เซ็ต permission มันใหม่

จากที่ค้นๆ ดูเจอวิธีแก้หลายวิธี แต่พบว่า แก้ด้วยการตั้ง  bucket policy ง่ายที่สุด (และดูเข้าท่าที่สุด)

โดยการใส่ policy ประมาณนี้ได้เลยครับ

{
  "Version":"2023-11-25",
  "Statement":[
    {
      "Sid":"public-url",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::[my-bucket]/[my-path]/*"]
      }
  ]
}
Beta Version v23.12.4 : ขออภัยเว็บกำลังก่อสร้าง (อีกแล้ว) แต่คราวนี้กำลังสร้างจริงจังละ