Analyzing ALB logs with Athena

Search for a command to run...

No comments yet. Be the first to comment.
ဒီ post လေးထဲမှာတော့ Regional NAT Gateway နဲ့ Zonal NAT Gateway ကွာခြားချက်တွေကို နှိုင်းယှဉ်ပြသွားမှာဘဲ ဖြစ်ပါတယ်။ ပထဆုံးအနေနဲ့ NAT Gateway ဆိုတာ ဘာလဲ ဘာအတွက် လိုအပ်တာလဲဆိုတာကို အရင်ပြောပြပေးပါမယ်။ P

High Level ရေးထားတာပါ ဒါပေမဲ့ လွယ်ပါတယ် ကိုယ့်မှာ AWS Infra တွေရှိတယ်ဆို တွေ့သမျှ metric တွေကို alarms တွေလုပ်ပြီး notification ယူမနေဘဲ တကယ် effective ဖြစ်တဲ့ metric တွေကိုမှ CloudWatch ရဲ့ alarm feature တွေနဲ့ ပေါင်းပြီး ပို့စေချင်ပါတယ်။ ဥပမာ prod...

ကိုယ့်ရဲ့ data center (on-prem) network နဲ့ AWS ချိတ်ဆက်ဖို့ လိုလာပြီဆိုရင် ဘယ်လို ချိတ်ဆက်ကြမလဲ? အပိုင်း (၂) မှာ တော့ Direct connect အကြောင်းကို ဆွေးနွေး သွားမှာ ဖြစ်ပါတယ်။ အပိုင်း (၁) Site-to-site VPN အကြောင်းကို လေ့လာချင်ရင်တော့ အောက်ပါ link မှာ ...

ကိုယ့်ရဲ့ data center (on-prem) network နဲ့ AWS ချိတ်ဆက်ဖို့ လိုလာပြီဆိုရင် ချိတ်ဆက်နိုင်တဲ့ နည်း (၂) နည်း ရှိပါတယ်။ 1. Site-to-Site VPN (Virtual Private Network) 2. Direct connect Site-to-Site VPN - On-prem network နဲ့ AWS resources တွေ ချိတ်ဆက်တဲ့...

လွန်ခဲ့တဲ့အပတ်က ရုံးက Designer တွေနဲ့ တော်ကီပွားရင်း Accessibility နဲ့ပတ်သတ်တာတွေ သူတို့ကို ရှင်းပြဖြစ်တယ်။ ကိုယ်တိုင်ကလည်း အရင်ကတည်းက ဒီ topic ကိုစိတ်ဝင်စားလို့ လေ့လာနေတာဆိုတော့ အခွင့်အရေးရရင် ရသလို sharing လုပ်ဖြစ်တယ်။ အဓိကက Accessibility နဲ့ပတ်သတ်...

AWS မှာ Application Load Blanacer ကနေ log တွေကို Amazon Athena သုံးပြီး ဘယ်လို ကြည့်လို့ရမလဲဆိုတာလေး ဒီနေ့ မျှဝေချင်ပါတယ်။
ပထဆုံးအနေနဲ့ ALB logs တွေသိမ်းဖို့အတွက် S3 bucket တစ်ခု create လုပ်ပါမယ်
Navigate to S3 Console:
Create a Bucket:
ပြီးရင်တော့ "Create bucket" ဆိုတာလေးကိုနှိပ်ပြီး S3 bucket အသစ်လေးလုပ်ပါမယ်။
Bucket name က unique ဖြစ်ဖို့လိုပါတယ်၊ ပြီးရင် ထားချင်တဲ့ region ကိုရွေးပြီး create လုပ်လိုက်ပါ။ region က ALB ရှိနေတဲ့ region မှာပဲ ထားဖို့ အကြံပေးချင်ပါတယ်။

နောက်တစ်ဆင့်အနေနဲ့ ALB ထဲက log တွေ S3 မှာသိမ်းဖို့ enable လုပ်ဖို့လိုပါတယ်။
Navigate to ALB Console:
Select Your Load Balancer:
ဘယ်ဘက်က navigation pane ထဲမှာရှိတဲ့ "Load Balancers" ဆိုတာလေးကိုနှိပ်လိုက်ပါ။
logging enable လုပ်ချင်တဲ့ ALB ကိုနှိပ်လိုက်ပါ။
Configure Access Logs:
"Description" tab ကိုနှိပ်ပြီး "Attributes" section အထိရောက်တဲ့အထိ အောက်ကိုသွားလိုက်ပါ။
ပြီးရင် "edit" ဆိုတာလေးကို နှိပ်လိုက်ပါ။
"Access logs" ဆိုတာလေးကို ဖွင့်ပေးလိုက်ပါ၊
ပြီးရင် Browse S3 bucket ဆိုတာကိုနှိပ်ပြီး logs တွေသိမ်းမဲ့ S3 bucket ကိုရွေးပေးလိုက်ပါ။

Save Change ကို နှိပ်လိုက်မယ်ဆိုရင် Access Denied ဆိုပြီး error alert တက်လာမှာဖြစ်ပါတယ်။ ဘာလို့လဲဆိုတော့ ကျွန်တော်တို့ S3 ဘက်ကနေ permission ဖွင့်မပေးထားသေးလို့ပါ။
Load balancer ကနေ S3 မှာ Log လာရေးဖို့အတွက် policy သွားရေးပေးဖို့လိုပါတယ်။ Load balancer ကိုထားတဲ့ region ပေါ်မူတည်ပြီး policy ရေးဖို့ကမူတဲ့အတွက် ကိုယ့် region အလိုက် ဘယ်လိုရေးရမလဲဆိုတာ ဒီ AWS documentation မှာ သွားကြည့်စေချင်ပါတယ်။ https://docs.aws.amazon.com/elasticloadbalancing/latest/application/enable-access-logging.html
Asia Pacific (Hyderabad)
Asia Pacific (Melbourne)
Canada West (Calgary)
Europe (Spain)
Europe (Zurich)
Israel (Tel Aviv)
Middle East (UAE)
ကိုယ့်ရဲ့ ALB ထားထားတဲ့ Region က အပေါ်က region တွေမှာပါတယ်ဆိုရင်တော့ S3 policy က အောက်ပါအတိုင်း ရေးပေးရမှာဖြစ်ပါတယ်။ အဲ့ထဲက bucket-name ဆိုတဲ့နေရာမှာ ကိုယ့်ရဲ့ log သိမ်းမဲ့ bucket name ကို ထည့်ပေးရမှာဖြစ်ပြီး aws-account-id ဆိုတဲ့နေရာမှာတော့ ကိုယ့်ရဲ့ aws account id ကို ထည့်ပေးရမှာဖြစ်ပါတယ်။
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logdelivery.elasticloadbalancing.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket-name/AWSLogs/aws-account-id/*"
}
]
}
```
ကိုယ့်ရဲ့ ALB ထားထားတဲ့ Region က အပေါ်က region တွေမှာ မပါဘူးဆိုရင်တော့ s3 မှာ policy ကို အောက်ပါအတိုင်းရေးပေးရမှာဖြစ်ပါတယ်။
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::elb-account-id:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket-name/AWSLogs/aws-account-id/*"
}
]
}
ဒီနေရာမှာ သတိထားရမှာက elb-account-id နဲ့ aws-account-id ဆိုတဲ့ နေရာတွေမှာ account id တွေထည့်ပေးဖို့လိုပါတယ်။ aws-account-id ဆိုတဲ့နေရာမှာက ကိုယ့် AWS account ရဲ့ ID ကို ထည့်ပေးရမှာဖြစ်ပြီး၊ elb-account-id ဆိုတဲ့နေရာမှာ elb ရဲ့ regional account id ကိုထည့်ပေးရမှာပါ။
elb-account-id တွေကို region အလိုက် အောက်မှာ ဖေါ်ပြပေးထားပါတယ်။
US East (N. Virginia) – 127311923021
US East (Ohio) – 033677994240
US West (N. California) – 027434742980
US West (Oregon) – 797873946194
Africa (Cape Town) – 098369216593
Asia Pacific (Hong Kong) – 754344448648
Asia Pacific (Jakarta) – 589379963580
Asia Pacific (Mumbai) – 718504428378
Asia Pacific (Osaka) – 383597477331
Asia Pacific (Seoul) – 600734575887
Asia Pacific (Singapore) – 114774131450
Asia Pacific (Sydney) – 783225319266
Asia Pacific (Tokyo) – 582318560864
Canada (Central) – 985666609251
Europe (Frankfurt) – 054676820928
Europe (Ireland) – 156460612806
Europe (London) – 652711504416
Europe (Milan) – 635631232127
Europe (Paris) – 009996457667
Europe (Stockholm) – 897822967062
Middle East (Bahrain) – 076674570225
South America (São Paulo) – 507241528517
S3 မှာလည်း policy ရေးပေးပြီးသွားပြီဆိုရင်တော့တော့ ကျွန်တော်တို့ ALB မှာ "Save Change" ပြန်နှိပ်လို့ရသွားပါပြီ။

Save ပြီးသွားရင် ပုံပါအတိုင်း Monitoring > access logs အောက်မှာ ကိုယ့်ရဲ့ bucket name လေးပေါ်နေပါလိမ့်မယ်။
ဒါဆိုရင်တော့ ကျွန်တော်တို့ရဲ့ ALB logs တွေကို S3 ပေါ်မှာ သိမ်းခိုင်းတဲ့အပိုင်းကပြီးသွားပါပြီ။ Traffice ဝင်လာသမျှ Access logs တွေအကုန်လုံး S3 ပေါ်မှာ သွားသိမ်းနေပါပြီ။
နောက်တစ်ဆင့်အနေနဲ့ log တွေကို ပြန်ဖတ်ဖို့ Athena DB ပိုင်းကို သွားပါမယ်။
Navigate to Athena Console:
Create a Database:
Database create လုပ်ဖို့ "Query Editor" tab ထဲသွားပါ။
ပြီးရင် အောက်က SQL command လေးကို run ပြီး database create လုပ်လိုက်ပါ။
CREATE DATABASE IF NOT EXISTS alb_database;
alb_database ဆိုတဲ့နေရာမှာ ကိုယ်ကြိုက်တဲ့ name ပေးလို့ရပါတယ်။
DB ဆောက်ပြီးပြီဆိုရင်တော့ alb logs table လေးဆောက်ဖို့အတွက် Query Editor ထဲမှာ အောက်က SQL command လေးကို run ပေးရပါမယ် . မ run ခင်မှာ အောက်ဆုံး LOCATION ဆိုတဲ့ အကြောင်းက ဒီ value လေး သုံးခု ( DOC-EXAMPLE-BUCKET , <ACCOUNT-ID> , <REGION> ) ကိုတော့ ပြင်ပေးဖို့လိုပါတယ်။ နဲ့ အပေါ်ဆုံး အကြောင်းက alb_database ဆိုတဲ့နေရာမှာ ကိုယ်မပေါ်မှာ ဆောက်ခဲ့တဲ့ db name ကို ထည့်ပေးရပါမယ်။
DOC-EXAMPLE-BUCKET နေရာမှာ ကိုယ့်ရဲ့ s3 bucket name
<ACCOUNT-ID> နေရာမှာ ကိုယ့် AWS account ရဲ့ ID နဲ့
<REGION> နေရာမှာ ALB ရှိတဲ့ region ကို ထည့်ပေးရမှာပါ။
CREATE EXTERNAL TABLE IF NOT EXISTS alb_database.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://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<REGION>/';
ပြင်စရာရှိတာပြင်ပြီး command လေး run လိုက် လို့ အောက်က ပုံထဲကလို ပေါ်လာရင်တော့ လိုအပ်တဲ့ table create လုပ်ပြီးသွားပါပြီ။

ကျွန်တော်တို့ query run ပြီး log တွေကို ဖတ်ဖို့ အဆင်သင့်ဖြစ်နေပါပြီ။ ဒီတော့ query run ကြည့်လိုက်ကြရအောင်။
Query ALB Logs:
Athena Query Editor ထဲမှာ ဒီ query လေးအရင် run ကြည့်ပါမယ်။
SELECT * FROM alb_database.alb_logs LIMIT 1;
အောက်က ပုံထဲကလို result လေးထွက်လာတယ်ဆိုရင် ကျွန်တော်တို့ db + table လေးက အဆင်ပြေနေပါပြီ။

ဒါဆိုရင်တော့ လိုချင်တဲ့ data ကို SQL query ရေးပြီး ကြိုက်သလို ဆွဲထုတ်လို့ရပါပြီ။
အောက်က ဥပမာ ပေးထားတဲ့ query လေးကတော့ URL 50 အတွက် URL တစ်ခုခြင်းဆီကို client တွေက request လုပ်တဲ့ အရေအတွက်ကို ဆွဲထုတ်ကြည့်ထားတာပါ။ ထွက်လာတဲ့ result တွေကိုသိမ်းထားချင်ရင်လည်း download result ဆိုတာကိုနှိပ်ပြီး csv file အနေနဲ့ သိမ်းထားလို့ရပါတယ်။
SELECT
domain_name,
request_url,
COUNT(*) as request_count
FROM alb_database.alb_logs
GROUP BY domain_name, request_url
ORDER BY domain_name, request_count DESC
LIMIT 50;