Skip to main content

Analyzing ALB logs with Athena

Updated 5 min readMarkdown
Part of seriesAWS
Analyzing ALB logs with Athena

AWS မှာ Application Load Blanacer ကနေ log တွေကို Amazon Athena သုံးပြီး ဘယ်လို ကြည့်လို့ရမလဲဆိုတာလေး ဒီနေ့ မျှဝေချင်ပါတယ်။

Step 1: Set Up an S3 Bucket for ALB Logs

ပထဆုံးအနေနဲ့ ALB logs တွေသိမ်းဖို့အတွက် S3 bucket တစ်ခု create လုပ်ပါမယ်

  1. Navigate to S3 Console:

    • Amazon S3 Console ကိုဖွင့်လိုက်ပါ
  2. Create a Bucket:

    • ပြီးရင်တော့ "Create bucket" ဆိုတာလေးကိုနှိပ်ပြီး S3 bucket အသစ်လေးလုပ်ပါမယ်။

    • Bucket name က unique ဖြစ်ဖို့လိုပါတယ်၊ ပြီးရင် ထားချင်တဲ့ region ကိုရွေးပြီး create လုပ်လိုက်ပါ။ region က ALB ရှိနေတဲ့ region မှာပဲ ထားဖို့ အကြံပေးချင်ပါတယ်။

EStep 2: Enable ALB Logging to S3

နောက်တစ်ဆင့်အနေနဲ့ ALB ထဲက log တွေ S3 မှာသိမ်းဖို့ enable လုပ်ဖို့လိုပါတယ်။

  1. Navigate to ALB Console:

    • Amazon EC2 Console ကိုဖွင့်ပါ။
  2. Select Your Load Balancer:

    • ဘယ်ဘက်က navigation pane ထဲမှာရှိတဲ့ "Load Balancers" ဆိုတာလေးကိုနှိပ်လိုက်ပါ။

    • logging enable လုပ်ချင်တဲ့ ALB ကိုနှိပ်လိုက်ပါ။

  3. 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 ပိုင်းကို သွားပါမယ်။

Step 3: Set Up an Amazon Athena Database

  1. Navigate to Athena Console:

    • Amazon Athena Console ကို ဖွင့်ပါ။
  2. Create a Database:

    • Database create လုပ်ဖို့ "Query Editor" tab ထဲသွားပါ။

    • ပြီးရင် အောက်က SQL command လေးကို run ပြီး database create လုပ်လိုက်ပါ။

        CREATE DATABASE IF NOT EXISTS alb_database;
      
    • alb_database ဆိုတဲ့နေရာမှာ ကိုယ်ကြိုက်တဲ့ name ပေးလို့ရပါတယ်။

Step 4: Define the ALB Log Table (Revised)

  1. Create a Table:

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 ကြည့်လိုက်ကြရအောင်။

Step 5: Run Queries

  1. 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;
      

အချိန်ပေးပြီး ဖတ်ရှုပေးတဲ့တွက် ကျေးဇူးတင်ပါတယ်။

About the author

No comments yet. Be the first to comment.

More from this blog