วิธีการบันทึก Access Log ของ ELB ใน Elastic Beanstalk ไปยัง S3
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
การตั้งค่า 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)...จบครับ (`・ω・´)