การแชร์ข้อมูลบน Amazon S3 ผ่าน Presigned URL
Tags: aws, awsthai, s3, presigned
Published: 2021-09-28 04:55:28

## สารบัญ (Table of Content)
1. [บทนำ](#intro)
2. [การประเมินราคาเบื้องต้น](#cost)
3. [ขั้นตอนที่ 1: ทำการสร้าง IAM User](#step1)
4. [ขั้นตอนที่ 2: กำหนด Amazon S3 Bucket Policy](#step2)
5. [ขั้นตอนที่ 3: สร้าง presigned URL ของ Amazon S3 ผ่าน AWS CLI](#step3)
6. [บทสรุป](#conclusion)

<a name="intro"></a>
## บทนำ
โดยปกติแล้ว ทุก ๆ object ใน Amazon S3 จะเป็นลักษณะ private คือไม่สามารถแชร์ให้กับผู้ที่ไม่มีสิทธิเข้าถึงได้ แต่ในบางกรณี ผู้ใช้งานต้องการที่จะแชร์ข้อมูลใน Amazon S3 Bucket ให้ผู้ใช้งานทั่วไปสามารถเข้าถึงได้แบบ public ในช่วงระยะเวลาหนึ่ง ๆ แบบจำกัด

ทาง Amazon S3 มีความสามารถที่ให้ผู้ใช้งานสามารถสร้าง URL พิเศษ ที่มีสิทธิในการเข้าถึงข้อมูล Amazon S3 Bucket แบบ public เป็นการชั่วคราว เรียกว่า presigned URL โดยผู้ใช้งาน สามารถระบุเวลาที่จะให้หมดอายุได้อีกด้วย

<a name="cost"></a>
## การประเมินราคาเบื้องต้น (Cost Estimation)
* ราคาการเรียกใช้งาน Amazon S3 - [Amazon S3 Pricing](https://aws.amazon.com/s3/pricing/)

<a name="step1"></a>
## ขั้นตอนที่ 1: ทำการสร้าง IAM User
* ทำการสร้าง IAM User โดยไม่ต้องกำหนด permission ใด ๆ ให้เลย
![IAM User](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lxs18p38pzgjfdc2x6fl.png)

<a name="step2"></a>
## ขั้นตอนที่ 2: กำหนด Amazon S3 Bucket Policy
* หากผู้ใช้งานยังไม่มี Amazon S3 Bucket ให้ทำการสร้างก่อน
* ทำการกำหนดให้ IAM User ที่ต้องการให้สามารถอ่านข้อมูล object ใน Amazon S3 บน bucket ที่ระบุไว้ผ่าน Bucket Policy (อย่าลืมเปลี่ยน AWS_ACCOUNT_ID กับชื่อของ bucket
* ผู้ใช้งานยังสามารถกำหนด policy เฉพาะส่วนของ prefix ที่ต้องการได้ เพื่อความปลอดภัยที่มากขึ้นได้
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "s3-presigned-read-only",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:user/presigned"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::nutchanon-thailand-shared/*"
        }
    ]
}
```

<a name="step3"></a>
## ขั้นตอนที่ 3: สร้าง presigned URL ของ Amazon S3 ผ่าน AWS CLI
* ทำการติดตั้ง AWS CLI และสร้าง configuration profile ให้เรียบร้อย
* จากนั้นสร้าง presigned URL ด้วย command ดังต่อไปนี้
    * โดยผู้ใช้งานสามารถเลือก option "--expires-in" ในการกำหนดเวลาที่จะให้ presigned URL หมดอายุในหลักวินาทีได้อีกด้วย
```bash
aws s3 presign s3://${S3_BUCKET}/${S3_OBJECT} --expires-in ${S3_EXPIRE} --profile default
```

* ผู้ใช้งานจะได้รับ presigned URL เป็น response ที่สามารถนำไปแชร์ให้กับผู้อื่นได้ 
* นอกจากวิธีการสร้าง presigned URL ผ่าน AWS CLI แล้ว ผู้ใช้งานยังสามารถสร้างจาก AWS SDK ในภาษาต่าง ๆ ได้อีกด้วย

<a name="conclusion"></a>
## บทสรุป
ผู้ใช้งานสามารถเลือกที่จะแชร์ข้อมูลบน Amazon S3 ผ่าน Presigned URL ที่สามารถกำหนดให้ผู้อื่นเข้าถึงข้อมูลแบบชั่วคราวได้ โดยจะเป็นการเพิ่มความปลอดภัยให้กับข้อมูล และยังช่วยให้ผู้ใช้งานไม่ต้องจดจำสิทธิหรือ configuration ต่าง ๆ

นอกจากนี้การทำ presigned URL บน Amazon S3 ยังสามารถนำไปประยุกต์ใช้กับระบบ automation ได้หลากหลาย ทั้งการติดต่อกับ Amazon API Gateway ในกรณีที่ต้องการ upload/download ข้อมูลขนาดใหญ่ผ่าน API ได้อีกด้วย[3]

## แหล่งอ้างอิงอื่น ๆ
[1] https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html
[2] https://github.com/nutchanon-l/s3-presigned-url
[3] https://aws.amazon.com/blogs/compute/uploading-to-amazon-s3-directly-from-a-web-or-mobile-application/

![CastleArm](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u3pp3cc9du87hqg20ugb.jpg)