# 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 မှာပဲ ထားဖို့ အကြံပေးချင်ပါတယ်။
        

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707288956482/e6e2520d-f418-4526-ad9f-16495cb1d102.png align="center")

### **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 ကိုရွေးပေးလိုက်ပါ။
        
        ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707290410827/0f73b5be-324c-4795-ac6d-e6a1c5e0a079.png align="center")
        
    * 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](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/enable-access-logging.html)
        
    * ```json
              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 ကို ထည့်ပေးရမှာဖြစ်ပါတယ်။
        
    * ```json
             {
               "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 ကို အောက်ပါအတိုင်းရေးပေးရမှာဖြစ်ပါတယ်။
        
    * ```json
        {
          "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 အလိုက် အောက်မှာ ဖေါ်ပြပေးထားပါတယ်။
        
    * ```yaml
        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" ပြန်နှိပ်လို့ရသွားပါပြီ။
        
        ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707290737515/8ec245f0-41e1-48ed-b0ee-33b901007fa6.png align="center")
        
    * Save ပြီးသွားရင် ပုံပါအတိုင်း Monitoring &gt; 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 လုပ်လိုက်ပါ။
        
        ```sql
        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 ကို ထည့်ပေးရမှာပါ။

```sql
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 လုပ်ပြီးသွားပါပြီ။
    
* ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1710324610627/60e43e78-97b5-4144-92b3-fc35fd7afae4.png align="center")
    
    ကျွန်တော်တို့ query run ပြီး log တွေကို ဖတ်ဖို့ အဆင်သင့်ဖြစ်နေပါပြီ။ ဒီတော့ query run ကြည့်လိုက်ကြရအောင်။
    

### **Step 5: Run Queries**

1. **Query ALB Logs:**
    
    * Athena Query Editor   ထဲမှာ ဒီ query လေးအရင် run ကြည့်ပါမယ်။
        
    * ```sql
        SELECT * FROM alb_database.alb_logs LIMIT 1;
        ```
        
    * အောက်က ပုံထဲကလို result  လေးထွက်လာတယ်ဆိုရင် ကျွန်တော်တို့ db + table လေးက အဆင်ပြေနေပါပြီ။
        
    * ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1710325133802/0d607316-1f8c-4af1-9e35-6b4941c72acd.png align="center")
        
    * ဒါဆိုရင်တော့ လိုချင်တဲ့ data ကို SQL query ရေးပြီး ကြိုက်သလို ဆွဲထုတ်လို့ရပါပြီ။
        
    * အောက်က ဥပမာ ပေးထားတဲ့ query လေးကတော့ URL 50  အတွက် URL တစ်ခုခြင်းဆီကို client တွေက request လုပ်တဲ့ အရေအတွက်ကို ဆွဲထုတ်ကြည့်ထားတာပါ။ ထွက်လာတဲ့ result တွေကိုသိမ်းထားချင်ရင်လည်း download result ဆိုတာကိုနှိပ်ပြီး csv file အနေနဲ့ သိမ်းထားလို့ရပါတယ်။
        
        ```sql
        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;
        ```
        

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