การวิเคราะห์ Log ของ ELB ด้วย SQL ใน Amazon Athena

ผมได้มีโอกาสทำการวิเคราะห์ Log ของ ELB ที่ได้รวบรวมไว้ใน S3 จึงจะมาแนะนำขั้นตอนการวิเคราะห์ Log ของ ELB ด้วย SQL ในบทความนี้ครับ

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

Pop จากบริษัท Classmethod (Thailand) ครับ

ครั้งนี้ ผมจะมาแนะนำวิธีการวิเคราะห์ Log ของ ELB ด้วย SQL ใน Amazon Athena โดยทำตามขั้นตอนที่อธิบายไว้ในบทความนี้ได้เลยครับ

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

※ มี Log ของ ELB อยู่ใน S3 แล้ว (สามารถดูตัวอย่างได้ที่บทความด้านล่างนี้ หรือถ้ามี Log ดังกล่าวแล้วข้ามขั้นตอนนี้ไปได้เลย)

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

ก่อนตั้งค่า Query result and encryption settings ในขั้นตอนถัดไป เราต้องมี S3 Bucket ที่ใช้สำหรับบันทึกข้อมูลการรันคำสั่งของ Athena ก่อน จึงจะสามารถรันคำสั่งใน Athena ได้ ให้ทำตามขั้นตอนด้านล่างนี้ได้เลยครับ

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

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

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

การตั้งค่า Query result and encryption settings

ผมจะตั้งค่า Query result เพื่อให้สามารถรันคำสั่ง SQL ใน Athena ได้ครับ (ถ้ามีการตั้งค่าไว้แล้วให้ข้ามขั้นตอนนี้ไปได้เลย)

เข้ามาที่ Service [Amazon Athena] แล้วเลือกQuery editorจากเมนูด้านซ้าย แล้วจะแสดงหน้าจอแบบนี้

เลือกหัวข้อSettingsและคลิกManage

คลิกBrowse S3

ค้นหา S3 Bucket ที่ใช้บันทึก Access Log ของ ELB ของเรา
แล้วเลือก S3 Bucket ของเรา เช่นtinnakorn-test-athena-resultและคลิกปุ่มChoose

คลิกSave

สร้าง Database ใน Athena

ขั้นตอนการสร้าง Database ใน Athena จะแตกต่างกับ AWS Glue ที่ผมได้เขียนไว้ในลิงก์ด้านล่างนี้ แต่ผลลัพธ์ที่ได้จะเหมือนกัน สำหรับผู้ที่สนใจเรียนรู้เพิ่มเติมเกี่ยวกับ AWS Glue คลิกที่ลิงก์บทความด้านล่างนี้ได้เลยครับ

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

ก่อนอื่นผมจะสร้าง Database ด้วยคำสั่ง SQL ใน Athena

เลือกหัวข้อEditorแล้ว Copy คำสั่งด้านล่างนี้วางใน Query 1 และคลิกปุ่มRun(elb_log คือชื่อ Database ที่ใช้สาธิตเท่านั้น)

CREATE DATABASE elb_log;

ตรวจสอบที่ Query results:✅ Completedและดูที่ Database ด้านซ้าย จะเห็นว่ามีelb_logเพิ่มขึ้นมา
จากนั้นเลือก Database:elb_logเตรียมไว้ครับ

สร้าง Table ใน Athena

ต่อไปคือการสร้าง Table ใน Database: elb_log ที่สร้างจากขั้นตอนที่แล้ว

ก่อนอื่นให้เข้าไปยัง S3 Bucket ที่ใช้บันทึก Access Log ของ ELB แล้ว Copy S3 URI เตรียมไว้เพื่อนำไปใช้ในการสร้าง Table โดยทำการ Copy S3 URI ดังนี้:
» เข้าไปยัง Path ตามรูปภาพด้านล่าง
» ติ๊กap-southeast-1/ (ap-southeast-1 คือชื่อ Region: Singapore เช่นถ้าใช้ Region: Tokyo ก็จะเป็น ap-northeast-1 เป็นต้น)
» คลิกCopy S3 URIแล้วบันทึกเตรียมไว้ เช่น

s3://[bucket-name]/AWSLogs/[aws-account-id]/elasticloadbalancing/[region-name]/

กลับมาที่ Athena แล้วสร้าง Table ดังนี้:
» Copy คำสั่งด้านล่างนี้วางใน Query 1 (alb_logs คือชื่อ Table ที่ใช้สาธิตเท่านั้น)
» เปลี่ยน LOCATION ที่บรรทัด 41 ให้เป็นของคุณโดยวาง URI ที่ Copy มาจาก S3 จากขั้นตอนที่แล้วลงไป เช่น
[LOCATION 's3://[bucket-name]/AWSLogs/[aws-account-id]/elasticloadbalancing/[region-name]/']
» คลิกปุ่มRun

CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code int,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            target_port_list string,
            target_status_code_list string,
            classification string,
            classification_reason string
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
        '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\s]+?)\" \"([^\s]+)\" \"([^ ]*)\" \"([^ ]*)\"')
            LOCATION 's3://[bucket-name]/AWSLogs/[aws-account-id]/elasticloadbalancing/[region-name]/'

ตรวจสอบที่ Query results:✅ Completedและให้ดูที่ด้านซ้ายตรง Tables จะเห็นว่ามี Table:alb_logsเพิ่มขึ้นมาแล้ว

รันคำสั่ง SQL ใน Athena

ทีนี้มาทดสอบเรียกดูข้อมูล Log ใน Table ที่สร้างจากขั้นตอนที่แล้วโดยรันคำสั่งนี้ และคลิกปุ่มRun

SELECT * FROM elb_log.alb_logs ORDER BY time DESC LIMIT 10;

เลื่อนลงมาด้านล่างที่หัวข้อ Query results จะเห็นข้อมูลแสดงขึ้นมาแบบนี้

สามารถค้นหาข้อมูลของไฟล์ Log ได้อย่างยืดหยุ่น โดยเขียน SQL QUERY เช่น การนับจำนวนโดยใช้คำสั่ง GROUP BY และการกรองข้อมูลโดยใช้ WHERE เป็นต้น

เสร็จแล้วครับ !

สรุป

แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการ Log ของ AWS คือการเก็บไว้ใน S3 ยิ่งไปกว่านั้นด้วยการปรากฎตัวของ Athena จึงทำให้เราสามารถจัดการข้อมูลใน S3 ได้อย่างสะดวกและอิสระมากยิ่งขึ้น เพียงแค่มีข้อมูล S3 ก็สามารถใช้งาน Athena ได้อย่างง่ายดาย สำหรับผู้ที่ยังไม่เคยสัมผัสกับการใช้งาน Amazon Athena แนะนำให้ลองใช้งานดู แล้วคุณจะพบกับความสะดวกในการใช้งานนี้อย่างแน่นอนครับ

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

Pop จากบริษัท Classmethod (Thailand) ครับ !

Link อ้างอิง