การรัน SQL ไปยังไฟล์ใน S3 ด้วย Glue กับ Athena

สวัสดีครับ ครั้งนี้ผมจะมาอธิบายเกี่ยวกับการรัน SQL ไฟล์ S3 ด้วย Glue กับ Athena ต่อจากบทความ วิธีการใช้ S3 จาก EC2 และการใช้ AWS CLI S3 เพื่อใช้ในการตรวจสอบข้อมูลที่มีการอัปโหลดเข้ามาใน S3 ครับ ก่อนอื่นเรามาดูภาพรวมของขั้นตอนการทำทั้งหมดในบทความนี้กันครับ

  • ภาพรวมของขั้นตอนการทำทั้งหมด
  1. ตั้งค่าการสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 ทุกๆ 1 นาทีโดยอัตโนมัติ
    นี่คือการเตรียม EC2 สำหรับการอัปโหลดไฟล์ไปยัง S3 และเรียกใช้ python 1 ครั้งโดยใช้ cron ทุกๆ 1 นาทีเช่นกัน ซึ่ง python จะทำการสร้างไฟล์ JSON แบบสุ่มโดยอัตโนมัติ

  2. เตรียมพร้อมการเรียกใช้ SQL ไปยังไฟล์ที่มีอยู่ใน S3 (AWS Glue)
    เรียกใช้ Glue สำหรับไฟล์ที่มีอยู่ใน S3 และสร้าง Database กับ Table เพื่อให้สามารถ Call ด้วย SQL ได้

  3. รัน SQL สำหรับ Table (Amazon Athena)
    เตรียมพร้อมที่จะเริ่มใช้ Athena หลังจากนั้นให้รัน SQL ด้วย Query Editor ของ Athena

  4. ทำวิธีการลบ AWS Resource ที่สร้างขึ้นในบทความนี้

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

  • Amazon S3
    • Buckets (2)
  • AWS Identity and Access Management (IAM)
    • Roles (2)
  • Amazon EC2
    • Key Pairs
    • Instance
    • Security Groups
  • AWS Glue
    • Databases
      • Tables
    • Crawlers
  • Amazon Athena
    • Workgroups

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

  • PuTTY

สิ่งที่ต้องมี

ขั้นตอนอาจจะซับซ้อนนิดนึง แนะนำให้เพื่อนๆ ลองอ่านรายละเอียดให้ดีก่อนลงมือทำในแต่ละขั้นตอน เพื่อป้องกันความผิดพลาดนะครับ

ขั้นแรกให้สร้าง S3 ขึ้นมา จากนั้นสร้าง EC2 ที่เชื่อมต่อกับ Role และสามารถเข้าถึง S3 ได้เตรียมไว้ โดยผมจะระบุรายละเอียดขั้นตอนการสร้างและแปะลิงก์ที่ด้านล่างนี้ครับ

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

รันคำสั่งของ AWS CLI S3 เพื่อดูข้อมูลใน S3 โดยใช้คำสั่งaws s3 ls s3://+bucket_nameของคุณ

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

Output↓↓↓
ถ้าไม่ขึ้น Error และแสดงหน้าจอเหมือนด้านล่างนี้ก็ทำขั้นตอนถัดไปได้เลยครับ

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# aws s3 ls s3://tinnakorn-test-s3
[root@ip-172-31-30-143 ~]#

รันคำสั่งนี้เพื่อตรวจสอบเวลาปัจจุบัน

date

Output↓↓↓

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# date
Mon Jun 13 08:03:51 UTC 2022

รันคำสั่งนี้เพื่อเปลี่ยนเวลาจาก UTC ให้เป็น +07

ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime
date

Output↓↓↓
จะเห็นว่าเวลาปัจจุบันเป็น +07 เรียบร้อยแล้วครับ

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime
[root@ip-172-31-30-143 ~]# date
Mon Jun 13 15:05:46 +07 2022
[root@ip-172-31-30-143 ~]#

เพียงเท่านี้การเตรียม S3 และ EC2 ก็เสร็จเรียบร้อยครับ

1. ตั้งค่าการสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 ทุกๆ 1 นาทีโดยอัตโนมัติ

การสร้างไฟล์ Python

ขั้นตอนนี้เป็นการสร้าง Python โดยให้ไฟล์ที่จะสร้างนี้อัปโหลดไปยัง S3 ตามเวลาที่เรากำหนดโดยอัตโนมัติ ! เมื่อพร้อมแล้วมาเริ่มกันเลยครับ

รันคำสั่งนี้เพื่อตรวจสอบเวอร์ชัน Python ที่อยู่ใน EC2

python3 --version

Output↓↓↓
โดยปกติแล้ว python จะมีอยู่ใน EC2 ให้อยู่แล้วครับ

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# python3 --version
Python 3.7.10
[root@ip-172-31-30-143 ~]#

สำหรับผู้ใช้งานที่ตรวจสอบเวอร์ชันแล้ว กรณีที่ไม่มี python ตามที่กล่าวไว้ ให้รันคำสั่งด้านล่างนี้เพื่อติดตั้งได้เลยครับ
ผู้ใช้งานที่มีอยู่แล้ว ให้ข้ามขั้นตอนนี้ไปได้เลยครับ

yum install python3 -y

รันคำสั่งนี้เพื่อดาวน์โหลดไฟล์ Python

wget https://raw.githubusercontent.com/classmethod-thailand/cmth_seminar/develop/s3_athena_material/create_sample_json_upload_s3.py

Output↓↓↓

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# wget https://raw.githubusercontent.com/classmethod-thailand/cmth_seminar/develop/s3_athena_material/create_sample_json_upload_s3.py
--2022-06-13 15:46:25--  https://raw.githubusercontent.com/classmethod-thailand/cmth_seminar/develop/s3_athena_material/create_sample_json_upload_s3.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 669 
Saving to: ‘create_sample_json_upload_s3.py’

100%[==========================================================================================>] 669         --.-K/s   in 0s

2022-06-13 15:46:25 (36.7 MB/s) - ‘create_sample_json_upload_s3.py’ saved [669/669]

[root@ip-172-31-30-143 ~]#

รันคำสั่งนี้เพื่อเข้ามาที่ไฟล์create_sample_json_upload_s3.pyและเปลี่ยนชื่อ s3_bucket_name ในขั้นตอนถัดไป

vi create_sample_json_upload_s3.py

เมื่อเข้ามาที่ตัวไฟล์แล้วทำการเปลี่ยนชื่อ s3_bucket_name ให้เป็นชื่อ Bucket ของเรา
ดูตัวอย่าง Code ที่นี่: create_sample_json_upload_s3.py

  • วิธีเปลี่ยนชื่อ s3_bucket_name
    • กดปุ่มiที่แป้นพิมพ์ ให้"create_sample_json_upload_s3.py" 26L, 669Bที่อยู่ด้านล่างซ้ายเปลี่ยนเป็น--INSERT--
    • หาคำว่าs3_bucket_nameแล้วคัดลอก Bucket ของเราที่สร้างไว้ก่อนหน้านี้มาใส่แทนชื่อเก่า เช่น ในบทความนี้คือชื่อtinnakorn-test-s3เป็นต้น

  • เมื่อเปลี่ยนชื่อ s3_bucket_name เสร็จแล้วทำการ Save ตามนี้
    • กดปุ่มEscให้--INSERT--หายไป
    • จากนั้นพิมพ์:xหรือ:wq+ Enter

รันคำสั่งนี้เพื่ออัปโหลดไฟล์ JSON ไปยัง S3

python3 create_sample_json_upload_s3.py

Output↓↓↓
เมื่อรันคำสั่งนี้ไปแล้ว ตัวไฟล์ JSON จะถูกอัปโหลดขึ้นไปที่ S3 ครับ

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# python3 create_sample_json_upload_s3.py
upload: ./20220614_140411.json to s3://tinnakorn-test-s3/20220614/20220614_140411.json
[root@ip-172-31-30-143 ~]#

เข้ามาที่ S3 Bucket ของเรา แล้วทำการ Reload จะเห็นว่ามีไฟล์เพิ่มขึ้นมา คลิกเข้ามาที่โฟลเดอร์ตามวันที่ปัจจุบัน
ทีนี้ให้ทำการดาวน์โหลดไฟล์ JSON โดยติ๊กไฟล์ที่ต้องการดาวน์โหลด แล้วกดปุ่มDownloadได้เลยครับ

เปิดดูไฟล์ด้วยโปรแกรม Notepad ของ Windows ได้เลย ซึ่งข้อมูลจะแสดงตามรูปภาพด้านล่างครับ

รันคำสั่งนี้เพื่ออัปโหลดไฟล์ JSON ไปยัง S3 อีกครั้ง

python3 create_sample_json_upload_s3.py

Output↓↓↓
เมื่อรันคำสั่งนี้ไปแล้ว ตัวไฟล์ Python จะสร้างและอัปโหลดไฟล์ JSON ขึ้นไปที่ S3 ครับ

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# python3 create_sample_json_upload_s3.py
upload: ./20220614_140605.json to s3://tinnakorn-test-s3/20220614/20220614_140605.json
[root@ip-172-31-30-143 ~]#

เข้ามาที่ S3 Bucket ของเราอีกครั้ง แล้วทำการ Reload จะเห็นว่ามีไฟล์ JSON อันที่ 2 เพิ่มขึ้นมา แล้วทำการดาวน์โหลดไฟล์ JSON อีกครั้งครับ

เปิดดูไฟล์ด้วยโปรแกรม Notepad ของ Windows อีกครั้ง ทีนี้ลองเปิดเทียบกันดู จะเห็นว่าเวลาจะต่างกันตามระยะเวลาที่เราทำการอัปโหลดไป และ distance ก็จะได้ตัวเลขที่สุ่มออกมาแบบนี้ครับ

ขั้นตอนต่อไปจะเป็นการแก้ไขไฟล์ crontab เพื่อที่จะทำให้สามารถอัปโหลดไฟล์ JSON ไปยัง S3 ได้โดยอัตโนมัติ

รันคำสั่งนี้เพื่อเข้ามาที่ไฟล์ crontab และทำการเพิ่ม Code ในขั้นตอนถัดไป

vi /etc/crontab

ทีนี้เรามาแก้ไขไฟล์ crontab โดยการเพิ่ม Code ตามนี้
» กดปุ่มiให้คำว่า"/etc/crontab" 15L, 451Bที่อยู่ด้านล่างซ้ายเปลี่ยนเป็น-- INSERT --
» Copy Code ด้านล่างนี้ และนำไปวางที่บรรทัดถัดไปของ# * * * * * user-name command to be executed

* * * * * root /usr/bin/python3 /root/create_sample_json_upload_s3.py

root@ip-172-31-30-143:~

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * root /usr/bin/python3 /root/create_sample_json_upload_s3.py    // วาง Code ที่นี่
~
~
~
~
~
-- INSERT --                                                                      15,70         All

เมื่อเพิ่ม Code เสร็จแล้วทำการ Save ตามนี้
» กดปุ่มEscให้คำว่า-- INSERT --ที่อยู่ด้านล่างซ้ายหายไป
» พิมพ์:xหรือ:wq+ Enter

root@ip-172-31-30-143:~

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * root /usr/bin/python3 /root/create_sample_json_upload_s3.py
~
~
~
~
~
:x

เมื่อเสร็จสิ้นจากการเพิ่ม Code แล้ว หลังจากนี้ตัวไฟล์ Python จะทำการสร้างและอัปโหลดไฟล์ JSON ขึ้นไปที่ S3 โดยอัตโนมัติทุกๆ 1 นาทีครับ

ต่อไปรันคำสั่งนี้ทันทีเพื่อตรวจสอบการทำงานของไฟล์ crontab

tail -f /var/log/cron

Output↓↓↓
เมื่อได้หน้าจอแบบนี้แล้วรอ 1 นาที

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# tail -f /var/log/cron
Jun 14 14:01:01 ip-172-31-30-143 run-parts(/etc/cron.hourly)[5372]: finished 0anacron
Jun 14 14:10:01 ip-172-31-30-143 CROND[5411]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:18:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:18:01 ip-172-31-30-143 CROND[5430]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:19:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:20:01 ip-172-31-30-143 CROND[5451]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:23:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:23:01 ip-172-31-30-143 CROND[5464]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:24:01 ip-172-31-30-143 CROND[5481]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:25:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)

เมื่อครบ 1 นาทีแล้ว จะเปลี่ยนเป็นแบบนี้โดยให้สังเกตเวลาปัจจุบัน เช่นJun 14 14:29:01

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# tail -f /var/log/cron
Jun 14 14:01:01 ip-172-31-30-143 run-parts(/etc/cron.hourly)[5372]: finished 0anacron
Jun 14 14:10:01 ip-172-31-30-143 CROND[5411]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:18:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:18:01 ip-172-31-30-143 CROND[5430]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:19:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:20:01 ip-172-31-30-143 CROND[5451]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:23:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:23:01 ip-172-31-30-143 CROND[5464]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:24:01 ip-172-31-30-143 CROND[5481]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:25:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:29:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:29:01 ip-172-31-30-143 CROND[5554]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)

เข้ามาที่ S3 Bucket จะเห็นว่ามีไฟล์ JSON อันที่ 3 เพิ่มขึ้นมาโดยอัตโนมัติ

และหลังจากนี้ไฟล์ JSON ก็จะถูกสร้างและอัปโหลดไปที่ S3 เรื่อยๆ ทุกๆ 1 นาที สมมุติเวลาผ่านไปแล้ว 5 นาที ไฟล์ก็จะถูกอัปโหลดไป 5 ไฟล์ตามเวลาตัวอย่างด้านล่างนี้ครับ

Jun 14 14:30:01
Jun 14 14:31:01
Jun 14 14:32:01
Jun 14 14:33:01
Jun 14 14:34:01

root@ip-172-31-30-143:~

[root@ip-172-31-30-143 ~]# tail -f /var/log/cron
Jun 14 14:01:01 ip-172-31-30-143 run-parts(/etc/cron.hourly)[5372]: finished 0anacron
Jun 14 14:10:01 ip-172-31-30-143 CROND[5411]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:18:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:18:01 ip-172-31-30-143 CROND[5430]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:19:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:20:01 ip-172-31-30-143 CROND[5451]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:23:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:23:01 ip-172-31-30-143 CROND[5464]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:24:01 ip-172-31-30-143 CROND[5481]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:25:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:29:01 ip-172-31-30-143 crond[2254]: (*system*) RELOAD (/etc/crontab)
Jun 14 14:29:01 ip-172-31-30-143 CROND[5554]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:30:01 ip-172-31-30-143 CROND[5574]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jun 14 14:30:01 ip-172-31-30-143 CROND[5575]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:31:01 ip-172-31-30-143 CROND[5594]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:32:01 ip-172-31-30-143 CROND[5608]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:33:01 ip-172-31-30-143 CROND[5622]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)
Jun 14 14:34:01 ip-172-31-30-143 CROND[5636]: (root) CMD (/usr/bin/python3 /root/create_sample_json_upload_s3.py)

เข้ามาที่ S3 Bucket อีกครั้ง จะเห็นว่ามีไฟล์ JSON เพิ่มขึ้นมาใหม่ 5 ไฟล์โดยอัตโนมัติ

ในส่วนของหัวข้อ 1. ตั้งค่าการสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 ทุกๆ 1 นาทีโดยอัตโนมัติ นี้ก็เสร็จเรียบร้อยแล้ว ผมจะทบทวนสิ่งที่ได้ทำมาจนถึงตอนนี้อีกครั้งครับ

เมื่อเข้าใจวิธีการจัดการไฟล์ Python เพื่อสร้างและอัปโหลดไฟล์ JSON ไปยัง S3 โดยอัตโนมัติแล้ว ให้เริ่มทำหัวข้อถัดไปได้เลยครับ

2. เตรียมพร้อมการเรียกใช้ SQL ไปยังไฟล์ที่มีอยู่ใน S3 (AWS Glue)

ขั้นตอนนี้ผมจะสร้าง Database กับ Table เพื่อรันคำสั่ง SQL จาก Athena โดยใช้ฟังก์ชัน Crawler ของ AWS Glue ครับ ! เรามาเริ่มกันเลย

ค้นหา 🔍︎AWS GlueคลิกAWS Glue

การสร้าง Databases

เลือกDatabases

คลิกAdd database

Database name:tinnakorn-testคลิกCreate

เมื่อสร้างเสร็จจะได้ Database ตามชื่อของเรา

การสร้าง Crawlers

เลือกCrawlers

คลิกAdd Crawler

  • Crawler info:

Crawler name:tinnakorn-test(ชื่ออะไรก็ได้) คลิกNext

  • Crawler source type:

ไม่ต้องตั้งค่า คลิกNextได้เลยครับ

  • Data store:

Choose a data store:S3
Include path: คลิกที่ไอคอนโฟลเดอร์

เลือก S3 Bucket ที่อัปโหลดข้อมูลจาก EC2 เช่น +tinnakorn-test-s3 และคลิกSelect

คลิกNext

คลิกNext

  • IAM Role:

IAM Role: AWSGlueServiceRole-tinnakorn-test(ชื่ออะไรก็ได้) คลิกNext

  • Schedule:

คลิกNext

  • Output:

เลือก Database:tinnakorn-testที่สร้างขึ้นเมื่อสักครู่นี้ และคลิกNext

  • Review all steps:

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

เมื่อคลิกปุ่ม Finish แล้วจะแสดงหน้าจอแบบนี้

การ Run crawler

ขั้นตอนนี้ผมจะทำการ Run crawler เพื่อสร้าง Table ไปยัง Database

ติ๊กและคลิกปุ่มRun crawlers

จากนั้นรอการสร้าง Table สักครู่ จนกว่า Status:Startingเปลี่ยนเป็น Status:Readyครับ

เมื่อเปลี่ยนเป็น Status:Readyแล้ว ให้เข้าไปดู Table ของเราในขั้นตอนถัดไปครับ

เลือกTables

เมื่อเข้ามาแล้วก็จะเห็น Table ของเรา ซึ่ง Table นี้ถูกสร้างมาจากตอนที่เราทำการ Run crawler นั่นเอง

เปลี่ยน datetime ให้เป็น timestamp ใน Schema

ขั้นตอนนี้ผมจะทำการเปลี่ยน datetime:stringให้เป็น datetime:timestampครับ

เลื่อนลงมาด้านล่างสุดที่หัวข้อ Schema
จะเห็นว่า datetime เป็นstringซึ่งเราต้องแก้ไขในส่วนนี้ให้เป็นtimestampครับ

มาที่มุมขวาบน คลิกปุ่มEdit schema

คลิกที่ datetime:string

เลือก Column type:timestampและคลิกUpdate

คลิกที่3 partition_0

คลิกSave

ตรวจสอบที่หัวข้อ Schema อีกครั้ง จะเห็นว่า datetime เปลี่ยนเป็นtimestampเรียบร้อยแล้ว

ในส่วนของ Schema นี้คือ เวลาที่ไฟล์ JSON ถูกอัปโหลดไปที่ S3
ไฟล์ JSON จะถูกอ่านข้อมูลดังนี้

Column name Data type JSON Description
distance double 1.2209623484355958 ข้อมูลประเภทตัวเลขทศนิยม
datetime timestamp 2022-06-14 14:06:05 ข้อมูลวันที่และเวลา

เวลาที่ไฟล์ JSON ถูกอัปโหลดไปที่ S3 ตัวฟังก์ชัน Crawlers จะทำการตรวจสอบไฟล์ที่มีอยู่ใน S3 ว่าเป็นไฟล์แบบไหน จะต้องสร้าง Table ยังไง จากนั้น Crawlers จะทำการรวบรวมข้อมูลเพื่อตัดสินใจและสร้าง Table มาให้โดยอัตโนมัติ ซึ่งฟังก์ชัน Crawlers นี้คือการทำงานของ AWS Glue นั่นเอง

ทีนี้ผมจะเทียบ Schema กับไฟล์ JSON ให้เห็นตำแหน่งของข้อมูลได้ชัดเจนมากขึ้นโดยดูจากรูปด้านล่างได้เลยครับ

ในส่วนของหัวข้อ 2. เตรียมพร้อมการเรียกใช้ SQL ไปยังไฟล์ที่มีอยู่ใน S3 (AWS Glue) นี้ก็เสร็จเรียบร้อยแล้ว ผมจะทบทวนสิ่งที่ได้ทำในหัวข้อนี้อีกครั้งครับ

เมื่อสร้างทุกอย่างตามที่ระบุไว้แล้ว ให้เริ่มทำหัวข้อถัดไปได้เลยครับ

3. รัน SQL สำหรับ Table (Amazon Athena)

Amazon Athena คืออะไร

Amazon Athena เป็นบริการการสืบค้นแบบโต้ตอบที่ช่วยให้ง่ายต่อการวิเคราะห์ข้อมูลใน Amazon S3 โดยใช้ SQL มาตรฐาน Athena ไร้เซิร์ฟเวอร์ จึงไม่มีโครงสร้างพื้นฐานในการจัดการ และคุณจ่ายเฉพาะการสืบค้นที่คุณใช้งานเท่านั้น

การสร้าง S3 Bucket เพื่อบันทึกข้อมูลการรันคำสั่งของ Athena

ผมจะสร้าง S3 Bucket อันที่ 2 ขึ้นมาเพื่อบันทึกข้อมูลการรันคำสั่งของ Athena

ดูตัวอย่างที่นี่: การสร้าง Buckets ใน Amazon S3

รายละเอียดการสร้าง S3 Bucket อันที่ 2 ในบทความนี้คือ:
Bucket name:tinnakorn-test-athena-result

เมื่อสร้างเสร็จแล้วผมก็จะมี S3 Bucket ทั้งหมด 2 อัน ซึ่ง S3 Bucket ที่ใช้สำหรับ Athena จะอธิบายในภายหลังครับ

การสร้าง Workgroups

ขั้นตอนนี้ผมจะทำการสร้าง Workgroups ขึ้นมาเชื่อมต่อกับ S3 Bucket ที่ใช้สำหรับ Athena และตั้งค่า Query editor เพื่อใช้ในการรันคำสั่ง SQL ครับ

ค้นหา 🔍︎AthenaคลิกAthena

เลือกCreate workgroups

คลิกCreate workgroup

Workgroup name:tinnakorn-test(ชื่ออะไรก็ได้)

มาที่หัวข้อ Query result configuration คลิกBrowse S3

เลือก Bucket ของ Athena ที่สร้างไปเมื่อสักครู่นี้ ในบทความนี้คือtinnakorn-test-athena-resultและคลิกChoose

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

การตั้งค่า Query editor

เลือกQuery editor

มาที่มุมขวาบน เลือก Workgroup:tinnakorn-test

มาที่หัวข้อ Editor ดูที่ช่อง Data ด้านซ้าย แล้วทำการตั้งค่าพื้นฐานดังนี้
เลือก Database:tinnakorn-test
ดูที่ Table แล้วคลิก+ที่ชื่อของเรา คือต้องมี distance และ datatime แสดงอยู่ที่นี่ ก็ถือว่าขั้นตอนทั้งหมดถูกต้อง

ทดสอบการใช้งาน SQL ใน Query editor

ขั้นตอนนี้ผมลองใช้งาน Query editor ในการรันคำสั่ง SQL เพื่อจัดการ Database ที่รวบรวมข้อมูลมาจาก S3 Bucket ที่เชื่อมต่อกับ EC2 ครับ

มาที่ช่อง Query1 ด้านขวา
รันคำสั่งด้านล่างนี้และคลิกปุ่มRunเพื่อเรียกดูข้อมูลใน S3

select * from "tinnakorn_test_s3"

เลื่อนลงมาด้านล่างที่หัวข้อ Results จะเห็นข้อมูล JSON แสดงขึ้นมา
ให้สังเกตที่ datetime ซึ่งเวลาจะไม่เรียงให้

รันคำสั่งด้านล่างนี้และคลิกปุ่มRunเพื่อเรียกดูข้อมูลใน S3 โดยเรียง datetime จากมากไปน้อย

select * from "tinnakorn_test_s3" order by datetime desc

เลื่อนลงมาด้านล่างที่หัวข้อ Results จะเห็นข้อมูล JSON แสดงขึ้นมา
ให้สังเกตที่ datetime ซึ่งเวลาจะเรียงให้จากมากไปน้อย

รันคำสั่งด้านล่างนี้และคลิกปุ่มRunเพื่อตรวจสอบข้อมูล distance ที่ใหญ่ที่สุด

select max(distance) from "tinnakorn_test_s3"

เลื่อนลงมาด้านล่างที่หัวข้อ Results จะเห็นข้อมูล JSON แสดงขึ้นมา
ซึ่งจะแสดงข้อมูลที่ใหญ่ที่สุดของ distance

รันคำสั่งด้านล่างนี้และคลิกปุ่มRunเพื่อดูข้อมูลของ S3 ทั้งหมดโดยการนับออกมาเป็นตัวเลข

select count(*) from "tinnakorn_test_s3"

เลื่อนลงมาด้านล่างที่หัวข้อ Results จะเห็นข้อมูล JSON แสดงขึ้นมา
ซึ่งเลข 22 นี้คือจำนวนไฟล์ที่นับได้ทั้งหมดในขณะที่ทำการตรวจสอบ

การทำงาน S3 Bucket สำหรับ Athena

เข้ามาที่ S3 Bucket ที่ใช้สำหรับ Athena ในตัวอย่างนี้คือtinnakorn-test-athena-result
จะเห็นว่ามีไฟล์.csvและ.csv.metadataอยู่ครับ

ขั้นตอนนี้ผมจะลองดาวน์โหลดไฟล์.csvมาดูข้อมูลข้างในครับ ซึ่งก่อนดาวน์โหลดแนะนำให้คลิกที่Last modified ▽จนเป็นสัญลักษณ์Last modified ▼แบบนี้ แล้ว datetime ก็จะเรียงให้เรา จากนั้นให้เลือกดาวน์โหลดในเวลาล่าสุดที่มีการรันคำสั่ง "count" ใน Athena ไปเมื่อสักครู่นี้ครับ

วิธีการดาวโหลดง่ายๆ เลยครับ ติ๊กไฟล์ที่ต้องการดาวน์โหลด และคลิกปุ่มDownload

ลองเปิดไฟล์.csvขึ้นมา จะเห็นว่าเป็นผลลัพธ์ของการรันคำสั่ง count ไปเมื่อสักครู่นี้ครับ

ไฟล์ต่อไปที่จะดาวน์โหลดคือไฟล์.csv.metadataให้ดาวน์โหลดเหมือนขั้นตอนที่แล้วโดยติ๊กไฟล์ที่ต้องการดาวน์โหลด และคลิกปุ่มDownloadได้เลยครับ

ลองเปิดไฟล์.csv.metadataขึ้นมา จะเห็นว่าเป็น Log ที่เก็บข้อมูลของการรันคำสั่ง count ไปเมื่อสักครู่นี้ครับ

หมายเหตุ: ถ้าเปิดไฟล์.csv.metadataใน Notepad ของ Windows ตัวหนังสืออาจเป็นภาษาต่างดาว แนะนำให้โหลดโปรแกรม Downloads | Notepad++ นี้มาเปิดดูครับ

ในส่วนของหัวข้อ 3. รัน SQL สำหรับ Table (Amazon Athena) นี้ก็เสร็จเรียบร้อยแล้ว ผมจะทบทวนสิ่งที่ได้ทำในหัวข้อนี้อีกครั้งครับ

  • สิ่งที่ได้ทำไปแล้วในหัวข้อ 3. รัน SQL สำหรับ Table (Amazon Athena)
    • สร้าง S3 Bucket เพื่อบันทึกข้อมูลการรันคำสั่งของ Athena
    • สร้าง Workgroups ขึ้นมาเชื่อมต่อกับ S3 Bucket ที่ใช้สำหรับ Athena
    • ตั้งค่า Query editor เพื่อเตรียมการรัน SQL สำหรับ Table
    • ทดสอบการใช้งาน SQL ใน Query editor

ขั้นตอนการทำทั้งหมดของบทความนี้คือ การรัน SQL ไปยังไฟล์ใน S3 ด้วย Glue กับ Athena ก็ได้สิ้นสุดลงที่หัวข้อนี้ครับ

หมายเหตุ: สำหรับคนที่ต้องการนำวิธีนี้ไปใช้งานต่อในบทความอื่นก็ไม่ต้องทำการลบ AWS Resource !
แต่ถ้าไม่ต้องการใช้งานแล้วให้ทำการลบโดยทำตามหัวข้อถัดไปได้เลยครับ

4. ทำวิธีการลบ AWS Resource ที่สร้างขึ้นในบทความนี้

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

ลบตามขั้นตอนดังนี้:

  • Amazon EC2
    • Key Pairs
    • Instance
    • Security Groups
  • Amazon Athena
    • Workgroups
  • AWS Glue
    • Databases
      • Tables
    • Crawlers
  • Amazon S3
    • Buckets (2)
  • AWS Identity and Access Management (IAM)
    • Roles (2)

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

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

ดูตัวอย่างการลบที่นี่: การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2

การลบ Workgroups ใน Amazon Athena

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

การลบ Crawlers และ Databases ใน AWS Glue

  • Crawlers

เข้ามาที่ 「 Service AWS Glue » Crawlers 」 แล้วทำการลบ


  • Databases

เข้ามาที่ 「 Service AWS Glue » Databases 」 แล้วทำการลบ (เมื่อลบเสร็จแล้ว Tables ก็จะถูกลบออกเองโดยอัตโนมัติ)

การลบ Buckets ใน Amazon S3

การลบ Buckets นี้ต้องลบออกทั้งหมด 2 อัน ซึ่งจะมี Bucket ที่ใช้กับ EC2 และ Athena ครับ

ดูตัวอย่างการลบที่นี่: การลบ Buckets ใน Amazon S3

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

การลบ Role นี้ต้องลบออกทั้งหมด 2 อัน ซึ่งจะมี Role ที่ใช้กับ EC2 และ AWS Glue ครับ

ดูตัวอย่างการลบที่นี่: การลบ Role และ Policies ใน IAM

สรุป

การสาธิตครั้งนี้เป็นการอธิบายโดยจะเน้นมาที่การใช้งาน Service AWS Glue และ Athena เป็นหลัก

AWS Glue มีหน้าที่ในการค้นหา จัดเตรียม และรวมข้อมูลสำหรับการวิเคราะห์ โดยการผสานรวมข้อมูลที่เรียบง่าย ปรับขนาดได้ และไร้เซิร์ฟเวอร์ ซึ่งผมได้นำมาใช้กับ Service Athena และ S3 ในครั้งนี้ครับ

Amazon Athena มีหน้าที่ในการสืบค้นแบบโต้ตอบที่ช่วยให้ง่ายต่อการวิเคราะห์ข้อมูลใน Amazon S3 โดยใช้ SQL มาตรฐาน Athena ไร้เซิร์ฟเวอร์ ซึ่งผมได้นำมาใช้งานกับ Service AWS Glue และ S3 โดยการรันคำสั่ง SQL เพื่อเรียกดูข้อมูลใน S3 ครับ

การใช้งานโดยรวมคือ AWS Glue สามารถค้นหา วิเคราะห์ข้อมูลใน S3 เพื่อตัดสินใจในการผสานรวมข้อมูลหรือสร้างตารางออกมาตามรูปแบบของฐานข้อมูลของ S3 อย่างรวดเร็ว และ Athena ก็สามารถจัดการฐานข้อมูลโดยการรันคำสั่ง SQL ที่ได้รับการผสานรวมข้อมูลมาจาก AWS Glue ได้อย่างรวดเร็วเช่นเดียวกันครับ

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

ดูรายละเอียดเพิ่มเติมได้ที่นี่ สอบถามเพิ่มเติมเกี่ยวกับ AWS คลิกที่นี่