วิธีการใช้ S3 จาก EC2 และการใช้ AWS CLI S3

เราสามารถใช้ AWS CLI S3 ทำการ Upload และ Download ข้อมูลได้โดยไม่ต้องใช้ AWS ACCESS KEY จาก EC2 เพื่อเพิ่มความปลอดภัยให้กับการใช้งานของเราได้เป็นอย่างดีครับ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

สวัสดีครับ วันนี้ผมจะมาอธิบายเกี่ยวกับ วิธีการใช้ S3 จาก EC2 และการใช้ AWS CLI S3 ครับ

เมื่อเราต้องทำการเข้าถึง S3 จาก AWS CLI ผมคิดว่าเราต้องใช้ AWS ACCESS KEY บ่อยมาก อย่างไรก็ตาม ถ้าหาก AWS ACCESS KEY ของเรารั่วไหลโดยไม่รู้ตัว ก็จะเกิดความเสี่ยงในการใช้งานเป็นอย่างมาก ดังนั้น ขอแนะนำให้คุณหลีกเลี่ยงการใช้ AWS ACCESS KEY ให้มากที่สุด ในบทความนี้ ผมจะสาธิตวิธีเข้าการถึง S3 จาก AWS CLI โดยไม่ต้องใช้ AWS ACCESS KEY จาก EC2 ครับ

เป้าหมายในการทำ

Service ที่ใช้ในบทความนี้คือ:

  • Amazon S3
    • Buckets
  • AWS Identity and Access Management (IAM)
    • Roles
  • Amazon EC2
    • Key Pairs
    • Instance
    • Security Groups

โปรแกรมที่ใช้ในบทความนี้คือ:

  • PuTTY

การสร้าง Buckets ใน Amazon S3

ค้นหา ?︎S3คลิกS3

เลือกBuckets

คลิกCreate bucket

การตั้งค่า General configuration:
» Bucket name:tinnakorn-test-s3(ชื่ออะไรก็ได้)
» AWS Region:Asia Pacific (Singapore) ap-southeast-1(ตรวจสอบและเลือกใช้รีเจี้ยนที่ใกล้กลับประเทศที่เราอาศัยอยู่ให้มากที่สุด)

เลื่อนลงมาด้านล่างสุด คลิกปุ่มCreate bucket

การสร้าง Role ใน IAM

เข้ามาที่ Service IAM โดยค้นหา ?︎IAM» เลือกIAM

มาที่เมนูด้านซ้าย เลือกRoles

คลิกCreate role

Step 1 - Select trusted entity:
Trusted entity type
» เลือกAWS service
Use case
» เลือก ◉ EC2
» คลิกNext

Step 2 - Add permissions:
» ค้นหา Permissions policies:AmazonS3FullAccess
» ติ๊กAmazonS3FullAccess
» คลิกNext

Step 3 - Name, review, and create:
» Name:tinnakorn-test-ec2-role(ชื่ออะไรก็ได้)

เลื่อนลงมาด้านล่างสุด คลิกCreate role

การ Create Key Pair

ดูตัวอย่างที่นี่: การ Create Key Pair

รายละเอียดการ Create Key Pair ในบทความนี้คือ:
Name:tinnakorn-test
Private key file format:.ppk

การ Launch Instance

ค้นหา?︎ EC2เลือกEC2

เลือกInstances

คลิกLaunch instances

มาที่หัวข้อ Name and tags
» Name:tinnakorn-test(ชื่ออะไรก็ได้)

ถัดมาหัวข้อ Application and OS Images (Amazon Machine Image) นี้คือ Instance จะมีเซิร์ฟเวอร์ให้เลือกใช้มากมาย เช่น macOS, Red Hat, SUSE Linux, Ubuntu, Microsoft Windows, Debian เป็นต้น ซึ่งในบทความนี้จะใช้ Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type ในการติดตั้ง

» เลือกAmazon Linux
» เลือกAmazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type

ถัดมาหัวข้อ Instance type นี้คือ เราสามารถเลือก Type CPU Memory ที่จะนำไปใช้งานได้ตามความต้องการ ไม่ว่าเว็บไซต์จะมีขนาดเล็กหรือขนาดใหญ่ ก็สามารถเลือกขนาดความจุของ CPU Memory ได้ตามความเหมาะสม

ค้นหา?︎ t3a.nanoและเลือกt3a.nano
ก็จะได้สเปค Family:t3a | 2 vCPU | 0.5 GiB Memoryตามนี้

ถัดมาหัวข้อ Key pair (login)
เลือก Key pair name - required ที่สร้างไว้ก่อนหน้านี้ เช่นtinnakorn-test

ถัดมาหัวข้อ Network settings คลิกEdit

เลื่อนลงมาที่หัวข้อ Firewall (security groups)
เปลี่ยนชื่อ Security group name - required และ Description - required เช่นtinnakorn-test

ถัดมาหัวข้อ Inbound security groups rules นี้คือ การตั้งค่า My IP เพื่อจำกัดการเชื่อมต่อ SSH จากทุกตำแหน่ง ซึ่งในส่วนนี้จะทำให้สามารถเชื่อมต่อ SSH จาก My IP (ที่อยู่ IP ปัจจุบันของคุณ) ได้เท่านั้น และในกรณีที่ใช้ HTTP จะเป็นการแสดงผลหน้าเว็บไซต์นั่นเอง

» เปลี่ยน Source type ของ ssh ให้เป็น Source type:My IP

ถัดมาหัวข้อ Configure storage นี้คือ เราสามารถเพิ่ม Storage ในส่วนของ Size (GiB) ได้ โดยค่าเริ่มต้นจะเป็น 8 GB
ในตัวอย่างนี้จะใช้เป็นค่าเริ่มต้น ก็จะไม่ทำการตั้งค่าใดๆ

ถัดมาหัวข้อ Advanced details
» คลิกที่Advanced detailsแล้วหน้าต่างจะขยายลงมา
» เลือก IAM instance profile ที่สร้างไว้ก่อนหน้านี้ เช่นtinnakorn-test-ec2-role

มาที่หัวข้อ Summary ด้านขวาแล้วตรวจสอบรายละเอียด และคลิกLaunch instance

คลิกView all instances

เมื่อสร้าง Instance เสร็จแล้ว Status Checks จะเป็น? Initializingคือ Instance กำลังทำการสตาร์ทระบบขึ้นมา
ให้รอจนกว่า Status Checks เป็น✅ 2/2 checks passedเพียงเท่านี้การเริ่มต้นระบบก็เสร็จสมบูรณ์แล้วครับ

การ Connect to EC2 by PuTTY

เมื่อสร้าง EC2 Instance เสร็จแล้ว ต่อไปจะทำการเชื่อมต่อ EC2 ด้วย PuTTY โดยดูขั้นตอนการทำที่ลิงก์ด้านล่างนี้เลยครับ

ทดสอบการใช้ S3 จาก EC2 และการใช้ AWS CLI S3

การ Upload ไฟล์ไปยัง S3 ผ่าน Console

  • ตรวจสอบข้อมูล S3 ใน Server Amazon Linux 2

ก่อนที่จะทำการอัปโหลดไฟล์ เรามาตรวจสอบข้อมูลของ S3 ใน Amazon Linux 2 กันก่อนครับ
มาที่หน้า 「 Amazon S3 » Buckets 」 แล้วทำการ Copy Bucket เตรียมไว้

กลับมาที่หน้า PuTTY ที่ Login ไว้เมื่อสักครู่นี้
แล้วรันคำสั่งนี้เพื่อตรวจสอบข้อมูลใน S3 โดยมีการใช้งานคำสั่งaws s3 ls s3://+bucket_name

aws s3 ls s3://tinnakorn-test-s3

Output ↓↓↓
เมื่อรันคำสั่งแล้วจะเห็นว่าไม่มีข้อมูลอะไรแสดงขึ้นมา

[root@ip-172-31-23-163 ~]# aws s3 ls s3://tinnakorn-test-s3    // คำสั่งที่รันไป
[root@ip-172-31-23-163 ~]#

ทีนี้ให้กลับไปที่หน้า「 Amazon S3 » Buckets 」 แล้วดูในส่วนของที่เก็บข้อมูล จะเห็นว่ายังไม่มีการ Upload ข้อมูล ก็เลยไม่แสดงใน PuTTY เมื่อสักครู่นี้นั่นเอง

  • Upload ไฟล์ไปยัง S3 ผ่าน Console

ทีนี้ผมจะลอง Upload ไฟล์ลง S3 ดูครับ แล้วทำการเข้าไปตรวจสอบที่ Server Amazon Linux 2 อีกครั้ง

ผมจะทำการ Upload ไฟล์test.txtไปยัง S3 ผ่าน Console AWS
ซึ่งการอัปโหลดไฟล์มีหลายวิธี สามารถดูตัวอย่างที่ลิงก์หรือรูปภาพด้านล่างนี้ได้เลยครับ


  • ตรวจสอบข้อมูล S3 ใน Server Amazon Linux 2 อีกครั้ง

เมื่ออัปโหลดข้อมูลเสร็จแล้ว รันคำสั่งนี้เพื่อตรวจสอบข้อมูลใน S3

aws s3 ls s3://tinnakorn-test-s3

Output ↓↓↓
เมื่อรันคำสั่งแล้วจะเห็นว่ามีไฟล์test.txtแสดงขึ้นมา

[root@ip-172-31-23-163 ~]# aws s3 ls s3://tinnakorn-test-s3    // คำสั่งที่รันไป
2022-06-09 09:22:40         11 test.txt    // ไฟล์ที่ Upload ลง S3 เมื่อสักครู่นี้
[root@ip-172-31-23-163 ~]#

การสร้างไฟล์ใน root และ Upload ไปยัง S3 ผ่าน Amazon Linux 2

  • การสร้างไฟล์ใน Amazon Linux 2 [/root]

ขั้นตอนนี้ผมจะลองสร้างไฟล์test2.txtใน Server Amazon Linux 2 [/root] แล้วทำการ Copy ไฟล์ไปที่ S3 ครับ

รันคำสั่งตามนี้เพื่อเข้าไปยังหน้าสร้างไฟล์test2.txtโดยใช้vi+ ชื่อไฟล์

vi test2.txt
[root@ip-172-31-23-163 ~]# vi test2.txt    // คำสั่งที่รัน

Output ↓↓↓
เมื่อเข้ามาแล้วให้กดปุ่มiที่แป้นพิมพ์ ให้"test2.txt" [New]เปลี่ยนเป็น--INSERT--
แล้วพิมพ์ข้อความที่ต้องการ เช่นtest file

test file    // พิมพ์ข้อความที่ต้องการ
~
~
~
~
~
~
~
~
~
~
-- INSERT --                                         1,10          All    // กดปุ่ม i ที่แป้นพิมพ์

เมื่อพิมพ์ข้อความเรียบร้อยแล้ว กดปุ่มEscให้--INSERT--หายไป
จากนั้นพิมพ์:wqหรือ:xเพื่อทำการ Save

test file
~
~
~
~
~
~
~
~
~
~
:x    // กดปุ่ม Esc และพิมพ์ :wq หรือ :x เพื่อ Save


  • ตรวจสอบไฟล์test2.txtที่เราสร้างเมื่อสักครู่นี้

รันคำสั่งตามนี้เพื่อดูข้อมูลในไฟล์test2.txt(เปลี่ยนชื่อไฟล์ test2.txt ให้เป็นชื่อไฟล์ที่คุณสร้างขึ้นมา)

less test2.txt
[root@ip-172-31-23-163 ~]# less test2.txt    // คำสั่งที่รัน

Output ↓↓↓
เมื่อเข้ามาหน้านี้แล้วจะเห็นว่ามีข้อความ "test file" ที่ผมได้พิมพ์ไปเมื่อสักครู่นี้แสดงขึ้นมา
จากนั้นออกจากหน้านี้โดยกดปุ่มq

test file    // ข้อความที่พิมพ์ลงไปเมื่อสักครู่นี้
test2.txt (END)


  • การ Upload ไฟล์ไปยัง S3 ผ่าน Amazon Linux 2

เมื่อสร้างไฟล์เสร็จเรียบร้อยแล้ว เรามาลอง Upload ไฟล์test2.txtโดยการ Copy ไปยัง s3 กันครับ

รันคำสั่งนี้เพื่อ Copy ไฟล์test2.txtไปยัง s3

# คำสั่งของ AWS CLI S3    => "aws s3 cp"
# ไฟล์ที่เราสร้างใน root     => "test2.txt"
# ที่เก็บข้อมูลปลายทางของ S3 => "s3://tinnakorn-test-s3"
# ↓↓↓
aws s3 cp test2.txt s3://tinnakorn-test-s3

Output ↓↓↓
ถ้ารันคำสั่งถูกต้องจะไม่เกิด Error และแสดงหน้าจอแบบนี้

[root@ip-172-31-23-163 ~]# aws s3 cp test2.txt s3://tinnakorn-test-s3    // คำสั่งที่รันไป
upload: ./test2.txt to s3://tinnakorn-test-s3/test2.txt
[root@ip-172-31-23-163 ~]#


  • ตรวจสอบไฟล์test2.txtที่หน้า Console s3

เข้ามาที่หน้า 「 Amazon S3 » Buckets 」 Reload หน้า Console 1 ครั้ง
จะเห็นว่ามีไฟล์test2.txtถูกอัปโหลดเข้ามาแล้ว

การ Upload โฟลเดอร์ไปยัง S3 ผ่าน Amazon Linux 2

  • Upload โฟลเดอร์และไฟล์ไปยัง S3

รันคำสั่งนี้เพื่อ Copy ไฟล์test2.txtพร้อมกับสร้างโฟลเดอร์test_folderให้ไปอยู่ในโฟลเดอร์ที่เก็บข้อมูล S3

# คำสั่งของ AWS CLI S3        => "aws s3 cp"
# ไฟล์ที่เราสร้างใน root         => "test2.txt"
# ที่เก็บข้อมูลปลายทางของ S3     => "s3://tinnakorn-test-s3"
# ชื่อโฟลเดอร์ที่ต้องการสร้าง       => "/test_folder"
# ไฟล์ใหม่ที่ Copy จาก test2.txt => "/test3.txt"
# ↓↓↓
aws s3 cp test2.txt s3://tinnakorn-test-s3/test_folder/test3.txt

Output ↓↓↓
ถ้ารันคำสั่งถูกต้องจะไม่เกิด Error และแสดงหน้าจอแบบนี้

[root@ip-172-31-23-163 ~]# aws s3 cp test2.txt s3://tinnakorn-test-s3/test_folder/test3.txt    // คำสั่งที่รันไป
upload: ./test2.txt to s3://tinnakorn-test-s3/test_folder/test3.txt
[root@ip-172-31-23-163 ~]#


  • ตรวจสอบโฟลเดอร์test_folder/ที่หน้า Console S3

เข้ามาที่หน้า 「 Amazon S3 » Buckets 」 Reload หน้า Console 1 ครั้ง
จะเห็นว่ามีโฟลเดอร์test_folder/ถูกอัปโหลดเข้ามาแล้ว

เมื่อคลิกเข้ามาที่ test_folder/ ก็จะเจอไฟล์test3.txt

การดาวน์โหลดไฟล์จาก S3 มายัง Amazon Linux 2

การดาวน์โหลดไฟล์นี้ ผมจะทดสอบดาวน์โหลดไฟล์test.txtที่ได้ Upload ลง S3 ผ่าน Console AWS ในตอนแรก

กลับมาที่หน้า Objects ที่เป็นหน้าหลัก
จากนั้นติ๊กtest.txt และคลิก❐ Copy S3 URI

กลับมาที่ PuTTY แล้วรันคำสั่งตามนี้เพื่อดาวน์โหลดไฟล์

# คำสั่งของ AWS CLI S3        => "aws s3 cp"
# S3 URI ที่ Copy มาเมื่อสักครู่   => "s3://tinnakorn-test-s3/test.txt"
# ที่เก็บข้อมูลปลายทางของ root  => "./"
# ↓↓↓
aws s3 cp s3://tinnakorn-test-s3/test.txt ./

Output ↓↓↓
ถ้ารันคำสั่งถูกต้องจะไม่เกิด Error และแสดงหน้าจอแบบนี้

[root@ip-172-31-23-163 ~]# aws s3 cp s3://tinnakorn-test-s3/test.txt ./    // คำสั่งที่รันไป
download: s3://tinnakorn-test-s3/test.txt to ./test.txt
[root@ip-172-31-23-163 ~]#


  • ตรวจสอบไฟล์test.txtที่ดาวน์โหลดมาจาก S3 ใน Amazon Linux 2

รันคำสั่งllเพื่อตรวจสอบข้อมูล
Output ↓↓↓
จะเห็นว่ามีไฟล์test.txtที่ดาวน์โหลดมาเมื่อสักครู่นี้ปรากฏขึ้นมาแล้ว

[root@ip-172-31-23-163 ~]# ll    // รันคำสั่งนี้เพื่อตรวจสอบข้อมูล
total 8
-rw-r--r-- 1 root root 10 Jun  9 10:46 test2.txt
-rw-r--r-- 1 root root 11 Jun  9 09:22 test.txt    // ไฟล์ที่ดาวน์โหลดมาจาก S3 เมื่อสักครู่นี้
[root@ip-172-31-23-163 ~]#

ทีนี้มาลองเข้าไปดูข้อมูลข้างในtest.txtกันบ้างครับ
รันคำสั่งตามนี้เพื่อดูข้อมูลในไฟล์test.txt(เปลี่ยนชื่อไฟล์ test.txt ให้เป็นชื่อไฟล์ที่คุณดาวน์โหลดมา)

less test.txt

Output ↓↓↓
เมื่อเข้ามาหน้านี้แล้วจะเห็นว่ามีข้อความ "test file" ที่ผมได้พิมพ์ลงไปตอนอัปโหลดลง S3 ผ่าน Console
จากนั้นออกจากหน้านี้โดยกดปุ่มq

test file    // ข้อความที่พิมพ์ลงไปตอนอัปโหลดลง S3 ผ่าน Console
test.txt (END)

การลบฟังก์ชันใน Service ต่างๆ ที่ได้สร้างขึ้น

การลบฟังก์ชันใน Service ต่างๆ ถ้าเราไม่รู้ลำดับของการลบฟังก์ชันก็จะทำให้เกิด Error ในขณะลบ หรือไม่สามารถลบได้นั่นเอง เช่น ถ้าทำการลบ Security Group ที่กำลังเชื่อมต่ออยู่กับ EC2 โดยที่ไม่ Terminate EC2 ก่อน ก็จะไม่สามารถลบ Security Group ได้ เป็นต้น ดังนั้นแนะนำให้ลบตามขั้นตอนที่ผมเรียงไว้ได้เลยครับ

การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2

เข้ามาที่ 「 Service EC2 」 แล้วทำการลบ

Terminate Instance (ต้องรอจนกว่า Instance state เป็นTerminatedจึงจะเสร็จสมบูรณ์)

ลบ Key Pairs

ลบ Security Group (ต้องรอจนกว่า Instance state เป็นTerminatedจึงจะสามารถลบ Security Group ได้)

การลบ Buckets ใน Amazon S3

เข้ามาที่ 「 Service S3 » Buckets 」 แล้วทำการลบ

Empty Bucket (ต้องทำให้ Bucket เป็น Empty ก่อน จึงจะสามารถลบได้)

Delete Bucket

การลบ Role และ Policies ใน IAM

เข้ามาที่ 「 Service IAM » Roles 」 แล้วทำการลบ

เข้ามาที่ 「 Service IAM » Policies 」 แล้วทำการลบ

สรุป

การสาธิตนี้เป็นการใช้งาน S3 จาก EC2 และใช้ AWS CLI S3 ในการ Upload และ Download ข้อมูลเพื่อหลีกเลี่ยงการใช้ AWS ACCESS KEY จาก EC2

ซึ่งวิธีนี้ 「 ช่วยลดปัญหาในเรื่องการรั่วไหลของ AWS ACCESS KEY ที่จะทำให้เกิดความเสี่ยงในการใช้งาน 」 ได้เป็นอย่างดี นอกจากนี้ยังทำให้การใช้งานของเราปลอดภัยมากขึ้นอีกด้วย

บทความที่เกี่ยวข้อง