什么是传统负载均衡器的Access Logs

Elastic Load Balancing 提供了Access Logs(访问日志),Access Logs可记录下发送到负载均衡器的请求的详细信息。每个日志都包含固定格式的信息 (例如,收到请求的时间、客户端的 IP 地址、延迟、请求路径和服务器响应)。可以使用这些日志分析流量模式和进行Debug。

Access Logs是ELB的一项可选功能,默认情况下是Disable的。启用后,ELB会将logs存储到指定的某个S3 Bucket中。

收费

ELB的Access Logs本身是不需要额外的费用的,从ELB传输到S3的流量是免费的,但是S3的存储费用是需要支付的。

可靠性

关于可靠性,官网文档中原话是”Elastic Load Balancing 将尽力记录请求。我们建议您使用访问日志来了解请求性质,而不是作为所有请求的完整描述”。

说明Access Logs不保证记录全部的请求,只能是作为流量分析的一个参考数据。

如何设置

首先需要一个S3 Bucket,并且配置为允许Elastic Load Balancing 的账户ID对Bucket进行写操作。其次配置ELB开启Access Logs并写入设置好的S3 Bucket中

设置S3

  1. 选择或创建一个S3 Bucket,切换到”Permission”的tab,选择”Bucket Policy”
    elb_access_log_s3_bucket_setting.png

  2. 添加Bucket Policy,此处测试用的Bucket carl-elb-logs是ap-northease-2(首尔)的Region,因此对应的ELB账户ID应该设置为600734575887

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Action": [
    "s3:PutObject"
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::carl-elb-logs/*",
    "Principal": {
    "AWS": [
    "600734575887"
    ]
    }
    }
    ]
    }
  3. 每个Region的ELB账户ID是不一样的,如果是中国北京区,那就应该是638102146993,每个Region的ELB账户ID如下:
    elb_access_log_elb_account_id_per_region.png

设置ELB Access Logs

  1. 在EC2 Console中,在左侧栏中找到Load Balancer, 然后选中要设置的ELB名字,此处为ELB-carl,切换到Description Tab。
    elb_access_log_description_tab.png

  2. 在Attributes的Access logs下,点击Configure Access Logs
    elb_access_log_elb_attributes_access_logs.png

  3. 在弹出的Configure Access Logs页面中

    • 选中Enable access logs
    • Interval可选60 minutes或5 minutes
      • 一般生产环境中选择60 minutes,减少S3中Access log文件的数量。
      • 测试的时候选择5 minutes, 可以更快的查看到最新的access日志。
    • S3 location中选择需要保存的S3 Bucket和prefix路径,此处因为是测试,就直接保存在S3 carl-elb-logs的根目录下。
    • 如果prefix还没有创建,可以选择”Create this location for me”来自动让ELB创建对应的prefix
      elb_access_log_elb_configure_access_logs.png
  4. 如果设置正确,就可以在步骤3中设置的S3 Bucket和prefix下看到一个名为AWSLogs/account_id/ELBAccessLogTestFile的测试文件,如果有这个文件,说明ELB和S3的设置正确了。
    elb_access_log_s3_test_file.png

  5. 请求ELB的DNS,5分钟后,就可以在S3中看到access log了。

  6. ELB的access log在S3中的文件名采用以下的格式

    1
    bucket[/prefix]/AWSLogs/aws-account-id/elasticloadbalancing/region/yyyy/mm/dd/aws-account-id_elasticloadbalancing_region_load-balancer-name_end-time_ip-address_random-string.log
  7. access logs的文件内容采用如下的格式,包含了用户访问的数据和服务端响应的数据,可以根据某些字段来制作自己想要的数据报告。比如可以统计各个链接的访问数量,每个时间段内的访问数,统计各个HTTP Code的相应百分比,筛选5XX错误等

    1
    timestamp elb client:port backend:port request_processing_time backend_processing_time response_processing_time elb_status_code backend_status_code received_bytes sent_bytes "request" "user_agent" ssl_cipher ssl_protocol

access log日志格式解析

Access log有TCP和HTTP,此处详细说明一下HTTP类别的日志格式

某条日志内容如下:

2017-12-24T09:13:07.059734Z ELB-carl 117.81.114.77:7169 172.31.13.115:80 0.000045 0.01808 0.000028 200 200 0 71015 “GET http://elb-carl-861166859.ap-northeast-2.elb.amazonaws.com:80/test.php HTTP/1.10” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36” - -

按照官网中文件格式的解析说明,每个字段分别的意思如下:

  • 2017-12-24T09:13:07.059734Z 代表的是timestamp
  • ELB-carl 代表的是elb,就是elb的名字
  • 117.81.114.77代表的是client,就是客户端IP
  • 7169代表的是client的port,就是客户端源端口
  • 172.31.13.115代表的是backend,就是后端EC2的内网IP
  • 80代表的是backend的port,就是后端EC2的端口
  • 0.000045代表的是request_processing_time, 代表的是从ELB收到请求一直到将请求发送到后端EC2所用的总时间
  • 0.01808代表的是backend_processing_time,代表的是从ELB将请求发送到后端EC2到该EC2开始发送响应标头所用的总时间
  • 0.000028代表的是response_processing_time, 代表的是从ELB收到来自后端EC2的响应标头到开始向client发送响应所用的总时间。此时间包括在ELB上的排队时间以及从ELB到client的连接获取时间
  • 第一个200代表的是elb_status_code, 表示来自ELB的响应的状态代码
  • 第二个200代表的是backend_status_code, 表示来自后端EC2的响应的状态代码
  • 0 代表的是received_bytes,表示从client (申请方) 接收的请求大小 (以字节为单位), 对于HTTP来说,包含请求正文,但不包括Header
  • 71015 代表的是sent_bytes, 表示发送到client (申请方) 的响应的大小 (以字节为单位), 对于HTTP来说,包含响应正文,但不包括Header。
  • “GET http://elb-carl-861166859.ap-northeast-2.elb.amazonaws.com:80/test.php HTTP/1.10”代表的是request,表示来自client的请求
  • “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36”代表的是user_agent,就是浏览器的agent信息。
  • 第一个“-”代表的是ssl_cipher,是ssl的cipher,如果是HTTP请求,就是“-”,如果是HTTPS的,那可能就是ECDHE-RSA-AES128-SHA
  • 第二个“-”代表的是ssl_protocol,是ssl的协议。如果是HTTP请求,就是“-”,如果是HTTPS的,那可能是TLSv1或者TLSv1.2等。

延伸阅读

Reference

留言