เริ่มจากติดตั้ง 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
ตามปกติ
แค่นี้ก็เริ่มใช้งาน ขั้นถัดไปได้แล้ว
เอาง่ายเลย คำสั่งมันมีแค่
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/
เรียกดูรายการ bucket
aws s3api list-buckets
ลบ folder ทั้งยวง
aws s3 rm s3://my-bucket/my-path/ --recursive
จริงๆ 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]/*"]
}
]
}