วิธีการบันทึก Access Log ของ ELB ใน Elastic Beanstalk ไปยัง S3

ทำการบันทึก Access Log ของ ALB ใน S3 และอ่านทำความเข้าใจเนื้อหาในไฟล์ Log (สำหรับผู้เริ่มต้น)

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

นี่เป็นครั้งแรกที่ผมได้ทำการบันทึก Access Log ของ ALB ไปยัง S3 ดังนั้นผมก็เลยต้องการที่จะบันทึกขั้นตอนและอ่านเนื้อหาใน Log ครับ (`・ω・´)

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

※มีการสร้าง Application, Environment ใน Elastic Beanstalk

※ถ้าเป็น Laravel แนะนำให้สร้าง Environment ตามลิงก์บทความนี้ครับ

หมายเหตุ: ถ้ามีขั้นตอนที่ซ้ำกันให้ข้ามไปได้เลยครับ

ตัวอย่างในบทความนี้ สมมติว่าผมสร้างสภาพแวดล้อมใน Elastic Beanstalk โดยใช้ชื่อดังนี้
Application:tinnakorn
Environment:tinnakorn-elb-log

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

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

คลิกCreate bucket

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

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


ตั้งค่า Bucket policy

เมื่อสร้าง bucket เสร็จแล้ว ให้ค้นหาชื่อ bucket ของเรา และคลิกเข้ามาได้เลย จากนั้นเลือกPermissions

ถัดมาคลิกEditที่หัวข้อ Bucket policy

Copy Code ด้านล่างนี้วางใน Policy ของเราโดยผมจะอธิบายและแนะนำส่วนที่ต้องเปลี่ยนแปลงข้อมูลดังนี้
» Principal: 114774131450 คือ ELB account ID ของรีเจี้ยน Singapore (กรณีที่ใช้รีเจี้ยนอื่นให้ดูที่ ELB account ID)
» Resource: "arn:aws:s3:::bucket-name/AWSLogs/your-aws-account-id/*" (ต้องเปลี่ยน bucket-name และ your-aws-account-id ให้เป็นของคุณ)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::114774131450:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket-name/AWSLogs/your-aws-account-id/*"
        }
    ]
}

เมื่อเปลี่ยนแปลงข้อมูลเป็นของคุณเสร็จแล้ว เลื่องลงมาด้านล่างสุด และคลิกSave changes


สำหรับผู้ใช้งานที่ต้องการศึกษาเกี่ยวกับ Bucket permissions เพิ่มเติม สามารถดูได้ที่ลิงก์ด้านล่างนี้ครับ

การสร้าง Environment

ก่อนอื่นผมจะสร้าง Environment เพื่อใช้ในการบันทึก Access Log ของ ELB ใน Elastic Beanstalk ไปยัง S3

ตัวอย่างในบทความนี้ ผมจะสร้าง Environment โดยใช้ชื่อดังนี้
Environment:tinnakorn-elb-log

สามารถดูตัวอย่างวิธี Copy การตั้งค่า Environment ก็สามารถทำได้ตามลิงก์ด้านล่างนี้ครับ (สำหรับผู้ใช้งานที่รู้วิธีการ Copy การตั้งค่า Environment อยู่แล้วข้ามไปที่ขั้นตอน การตั้งค่าใน Configure more options ได้เลยครับ)

ตัวอย่างการสร้าง Environment

※Environment information
Environment name:tinnakorn-elb-log(ชื่ออะไรก็ได้)
Domain:tinnakorn-elb-log(ชื่ออะไรก็ได้)

※Platform
Platform:PHP

※Application code
เลือกวิธีอัปโหลดไฟล์ตามที่คุณต้องการ

คลิกปุ่มConfigure more options

การตั้งค่าใน Configure more options

ต่อไปคือการตั้งค่าในConfigure more optionsโดยทำตามหัวข้อดังต่อไปนี้
※Capacity
※Load balancer

※หัวข้อ Capacity
คลิกปุ่มEditที่หัวข้อ Capacity แล้วตั้งค่าดังนี้:
» Environment type:Load balanced
» Instances: Min2, Max2(ครั้งนี้ เราจะทำการล็อกจำนวน Instance อยู่ที่ 2 ตัว)

เลื่อนลงมาด้านล่างสุดที่หัวข้อ Scaling triggers แล้วตั้งค่าดังนี้:
» Lower threshold:0(หากไม่ตั้งค่านี้เป็น 0 ก็จะเกิด Error Message)
» คลิกปุ่มSave

การตั้งค่า Access log files ใน Load balancer

※หัวข้อ Load balancer
คลิกปุ่มEditที่หัวข้อ Load balancer แล้วตั้งค่าดังนี้:
Load balancer type
» Load balancer type: ◉ Application Load Balancer

Access log files
» Store logs:Enabled
» S3 bucket:tinnakorn-elb-log(เลือก S3 bucket ที่สร้างไว้ในตอนแรก)
» คลิกSave

เมื่อตั้งค่าตามขั้นตอนด้านบนนี้ทุกอย่างเสร็จแล้ว ให้เลื่อนลงมาด้านล่างสุดและคลิกปุ่มCreate environmentจากนั้นรอระบบเริ่มต้นสักครู่ครับ

ตรวจสอบ Log ใน S3

เปิดหน้าเว็บไซต์โดยคลิกที่ URL จากหน้า Environment ของเรา เช่น

http://tinnakorn-elb-log.ap-southeast-1.elasticbeanstalk.com/

แล้วทำการ Reload ประมาณ 5-6 ครั้งเพื่อรวบรวม Access Log ไปยัง S3

ถัดมาให้เข้ามาที่ S3 bucket ของเราที่สร้างไว้ก่อนหน้านี้ เช่นtinnakorn-elb-log
จากนั้นให้ระประมาณ 1-2 นาที แล้วจะเห็นโฟลเดอร์AWSLogs/แสดงขึ้นมาแบบนี้ (ถ้าไม่แสดงแบบนี้ให้กลับไป Reload หน้าเว็บไซต์อีกหลายๆครั้ง และกลับมาที่หน้านี้อีกครั้ง ตามด้วยคลิกปุ่มReloadที่นี่ แล้วรออีกสักครู่ครับ)

ทำการ Download ไฟล์ Log ดังนี้:
» เข้าไปยัง Path ตามรูปภาพด้านล่างนี้ (โฟลเดอร์2022/ > 08/ > 15/จะเปลี่ยนไปตามวันที่ปัจจุบัน)
» เลือกไฟล์ Log และคลิกDownload

แตกไฟล์ gz ที่ดาวน์โหลดมา และเปิดไฟล์ Log แล้วจะแสดงข้อมูลแบบนี้

http 2022-08-15T05:41:08.548468Z app/awseb-AWSEB-1WBWAC9NOPAXH/ae8d15f6d5ab5a2f xx.xxx.xx.xx:52540 xxx.xx.xx.xxx:80 0.000 0.011 0.000 200 200 229 18710 "GET http://xx.xx.xx.xxx:80/ HTTP/1.1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0" - - arn:aws:elasticloadbalancing:ap-southeast-1:[AWS Account ID]:targetgroup/awseb-AWSEB-11T74GL5FT0TS/d002c4ab841e9c6e "Root=1-62f9dc74-6d08274e1f630de25706f923" "-" "-" 0 2022-08-15T05:41:08.201000Z "forward" "-" "-" "xxx.xx.xx.xxx:80" "200" "-" "-"

เนื่องจากว่าถูกแบ่งหัวข้อโดยเครื่องหมาย space (ช่องว่าง) จึงได้ทำการตรวจสอบว่ามีหัวข้อใดบ้าง

http [Request type]
2022-08-15T05:41:08.548468Z [เวลาสร้าง Response]
app/awseb-AWSEB-1WBWAC9NOPAXH/ae8d15f6d5ab5a2f [Resource ID ของ Load balancer]
xx.xx.xx.xx:52540 [IP Address ของ Client : Port number]
xx.xx.xx.xx:80 [IP Address ของ Target ที่ประมวลผล Request นี้]
0.000 [ระยะเวลาทั้งหมดตั้งแต่ช่วงเวลาที่ Load Balancer ได้รับ Request จนถึงการส่งข้อมูลไปยัง Target]
0.011 [ระยะเวลาทั้งหมดตั้งแต่ช่วงเวลาที่ Load Balancer ส่ง Request ไปยัง Target จนถึงช่วงเวลาที่ Target นั้นเริ่มส่ง Header ตอบกลับมา]
0.000 [ระยะเวลาทั้งหมดตั้งแต่ช่วงเวลาที่ Load Balancer ได้รับ Header ตอบกลับมาจาก Target จนถึงช่วงเวลาที่เริ่มส่งการตอบกลับไปยัง Client]
200 [Status code ของการตอบสนองจาก Load Balancer]
200 [Status code ของการตอบสนองจาก Target]
229 [ขนาดของ Request ที่ได้รับจาก Client (หน่วย Bytes)]
18710 [ขนาดของการตอบกลับที่ถูกส่งคืนไปยัง Client (หน่วย Bytes)]
"GET http://xx.xx.xx.xx:80/ HTTP/1.1" [Request จาก Client]
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0" [String User-Agent ที่ระบุ Client ของ Request]
- [การเข้ารหัส SSL ของ HTTPS Listener (ครั้งนี้ไม่มีเพราะว่าเป็น HTTP เท่านั้น)]
- [Protocol SSL ของ HTTPS Listener (ครั้งนี้ไม่มีเพราะว่าเป็น HTTP เท่านั้น)]
arn:aws:elasticloadbalancing:ap-southeast-1:[AWS Account ID]:targetgroup/awseb-AWSEB-11T74GL5FT0TS/d002c4ab841e9c6e [Amazon Resource Name ของ Target Group (ARN)]
"Root=1-62f9dc74-6d08274e1f630de25706f923" [Trace ID]
"-" [SNI Domain ที่ได้รับจาก Client ใน TLS Handshake (HTTPS Listener เท่านั้น)]
"-" [ARN ของใบรับรองที่แสดงใน Client (HTTPS Listener)]
0 [ค่าระดับความสำคัญของ Rule ที่ตรงกับ Request]
2022-08-15T05:41:08.201000Z [เวลาที่ Load Balancer ได้รับ Request จาก Client]
"forward" [Action ที่ได้ดำเนินการเมื่อประมวลผลตาม Request]
"-" [URL ของ Redirect Target ใน Location Header ของ HTTP Response]
"-" [Error Code]
"xx.xx.xx.xx:80" [IP Address และ Port ของ Target ที่ประมวลผล Request นี้]
"200" [Status code จากการตอบกลับของ Target]

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

สุดท้ายนี้

ผมได้ทำการบันทึก Access Log ของ ALB ใน S3 และอ่านทำความเข้าใจเนื้อหาในไฟล์ Log
เป็นการใช้งานที่สนุกมากเลยเพราะเป็นครั้งแรกที่ได้ทำการจัดการไฟล์ Log ของ Load Balancer และผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

Pop จากบริษัท Classmethod (Thailand)...จบครับ (`・ω・´)

เว็บไซต์อ้างอิง

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