查詢 Application Load Balancer 日誌 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

查詢 Application Load Balancer 日誌

Application Load Balancer 是 Elastic Load Balancing 的一個負載平衡選項,可實施使用容器的微服務部署中的流量分配。查詢 Application Load Balancer 日誌可讓您查看流量來源、延遲,以及往返於 Elastic Load Balancing 執行個體與後端應用程式傳輸的位元組。如需詳細資訊,請參閱 Application Load Balancer 使用者指南中的 Application Load Balancer 的存取記錄和應用程式負載平衡器的連線記錄

必要條件

建立 ALB 存取記錄的資料表

  1. 將下列CREATE TABLE陳述式複製並貼到 Athena 主控台的查詢編輯器中,然後根據您自己的記錄項目需求進行修改。如需有關 Athena 主控台入門的資訊,請參閱開始使用。將LOCATION條款中的路徑取代為您的 Amazon S3 存取日誌資料夾位置。如需有關存取記錄檔位置的詳細資訊,請參閱《應用程式負載平衡器使用者指南》中的存取記錄檔。

    如需每個記錄檔欄位的相關資訊,請參閱《應用程式負載平衡器使用者指南》中的存取記錄項目

    注意

    下列範例CREATE TABLE陳述式包含最近新增的classificationclassification_reason、和 conn_trace_id (「可追蹤性 ID」或 TID) 欄。若要為不包含這些項目的「應 Application Load Balancer」存取日誌建立表格,請從CREATE TABLE陳述式中移除對應的資料欄,然後視情況修改一般表示式。

    CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_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, conn_trace_id 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/access-log-folder-path/'
  2. 在 Athena 主控台中執行查詢。查詢完成之後,Athena 會註冊 alb_access_logs 資料表,讓其中的資料可供您發出查詢。

使用分區投影在 Athena 中建立 ALB 存取記錄的資料表

由於 ALB 存取記錄具有已知的結構,您可以事先指定其分割配置,因此您可以使用 Athena 分割區投影功能,縮短查詢執行時間並自動化分割區管理。分割區投影會在新增資料時自動新增分割區。因此您無需使用 ALTER TABLE ADD PARTITION 手動新增分割區。

下列範例CREATE TABLE陳述式會自動在指定日期的 ALB 存取記錄上使用資料分割投影,直到單一 AWS 區域為止。該陳述式基於上一節中的範例,但新增了 PARTITIONED BYTBLPROPERTIES 子句以啟用分割區投影。在LOCATIONstorage.location.template子句中,將預留位置取代為識別 ALB 存取日誌之 Amazon S3 儲存貯體位置的值。如需有關存取記錄檔位置的詳細資訊,請參閱《應用程式負載平衡器使用者指南》中的存取記錄檔。對於 projection.day.range,請用您要使用的開始日期取代 2022/01/01。成功執行查詢之後,您可以查詢資料表。您無須執行 ALTER TABLE ADD PARTITION 就能載入分割區。如需有關每個記錄檔欄位的資訊,請參閱存取記錄項目

CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_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, conn_trace_id string ) PARTITIONED BY ( day 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-NUMBER>/elasticloadbalancing/<REGION>/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.day.type" = "date", "projection.day.range" = "2022/01/01,NOW", "projection.day.format" = "yyyy/MM/dd", "projection.day.interval" = "1", "projection.day.interval.unit" = "DAYS", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}" )

如需有關分割區投影的詳細資訊,請參閱使用 Amazon Athena 進行分割區投影

ALB 存取記錄的查詢範例

以下查詢會計算負載平衡器收到的 HTTP GET 請求,並依用戶端 IP 地址分組:

SELECT COUNT(request_verb) AS count, request_verb, client_ip FROM alb_access_logs GROUP BY request_verb, client_ip LIMIT 100;

另一個查詢顯示 Safari 瀏覽器使用者造訪的 URL:

SELECT request_url FROM alb_access_logs WHERE user_agent LIKE '%Safari%' LIMIT 10;

下列查詢顯示具有 ELB 狀態碼值大於或等於 500 的記錄。

SELECT * FROM alb_access_logs WHERE elb_status_code >= 500

下列範例說明如何以 datetime 剖析日誌:

SELECT client_ip, sum(received_bytes) FROM alb_access_logs WHERE parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') BETWEEN parse_datetime('2018-05-30-12:00:00','yyyy-MM-dd-HH:mm:ss') AND parse_datetime('2018-05-31-00:00:00','yyyy-MM-dd-HH:mm:ss') GROUP BY client_ip;

下列查詢會查詢針對指定日期的所有 ALB 存取記錄使用資料分割投影的資料表。

SELECT * FROM alb_access_logs WHERE day = '2022/02/12'

建立 ALB 連線記錄的資料表

  1. 將下列範例CREATE TABLE陳述式複製並貼到 Athena 主控台的查詢編輯器中,然後根據您自己的記錄項目需求進行修改。如需有關 Athena 主控台入門的資訊,請參閱開始使用。將LOCATION條款中的路徑取代為 Amazon S3 連線日誌資料夾位置。如需有關連線記錄檔位置的詳細資訊,請參閱《應用程式負載平衡器使用者指南》中的連線記錄檔。如需有關每個記錄檔欄位的資訊,請參閱連線記錄項目

    CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs ( time string, client_ip string, client_port int, listener_port int, tls_protocol string, tls_cipher string, tls_handshake_latency double, leaf_client_cert_subject string, leaf_client_cert_validity string, leaf_client_cert_serial_number string, tls_verify_status string, conn_trace_id string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?') LOCATION 's3://DOC-EXAMPLE-BUCKET/connection-log-folder-path/'
  2. 在 Athena 主控台中執行查詢。查詢完成之後,Athena 會註冊 alb_connection_logs 資料表,讓其中的資料可供您發出查詢。

使用分割區投影在 Athena 中建立 ALB 連線記錄的資料表

由於 ALB 連線記錄具有已知的結構,您可以事先指定其資料分割配置,因此您可以使用 Athena 分割區投影功能,縮短查詢執行階段並自動化磁碟分割管理。分割區投影會在新增資料時自動新增分割區。因此您無需使用 ALTER TABLE ADD PARTITION 手動新增分割區。

下列範例CREATE TABLE陳述式會自動在指定日期的 ALB 連線記錄上使用資料分割投影,直到單一 AWS 區域為止。該陳述式基於上一節中的範例,但新增了 PARTITIONED BYTBLPROPERTIES 子句以啟用分割區投影。在LOCATIONstorage.location.template子句中,將預留位置取代為識別 ALB 連線日誌之 Amazon S3 儲存貯體位置的值。如需有關連線記錄檔位置的詳細資訊,請參閱《應用程式負載平衡器使用者指南》中的連線記錄檔。對於projection.day.range,請將 2023/01/01 取代為您要使用的開始日期。成功執行查詢之後,您可以查詢資料表。您無須執行 ALTER TABLE ADD PARTITION 就能載入分割區。如需有關每個記錄檔欄位的資訊,請參閱連線記錄項目

CREATE EXTERNAL TABLE IF NOT EXISTS alb_connection_logs ( time string, client_ip string, client_port int, listener_port int, tls_protocol string, tls_cipher string, tls_handshake_latency double, leaf_client_cert_subject string, leaf_client_cert_validity string, leaf_client_cert_serial_number string, tls_verify_status string, conn_trace_id string ) PARTITIONED BY ( day STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1', 'input.regex' = '([^ ]*) ([^ ]*) ([0-9]*) ([0-9]*) ([A-Za-z0-9.-]*) ([^ ]*) ([-.0-9]*) \"([^\"]*)\" ([^ ]*) ([^ ]*) ([^ ]*) ?([^ ]*)?( .*)?') LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.day.type" = "date", "projection.day.range" = "2023/01/01,NOW", "projection.day.format" = "yyyy/MM/dd", "projection.day.interval" = "1", "projection.day.interval.unit" = "DAYS", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/AWSLogs/<ACCOUNT-NUMBER>/elasticloadbalancing/<REGION>/${day}" )

如需有關分割區投影的詳細資訊,請參閱使用 Amazon Athena 進行分割區投影

ALB 連線記錄的查詢範例

下列查詢會計數未發生的tls_verify_status'Success',依用戶端 IP 位址分組:

SELECT DISTINCT client_ip, count() AS count FROM alb_connection_logs WHERE tls_verify_status != 'Success' GROUP BY client_ip ORDER BY count() DESC;

下列查詢會搜尋在指定時間範圍內超過 2 秒的值:tls_handshake_latency

SELECT * FROM alb_connection_logs WHERE ( parse_datetime(time, 'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') BETWEEN parse_datetime('2024-01-01-00:00:00', 'yyyy-MM-dd-HH:mm:ss') AND parse_datetime('2024-03-20-00:00:00', 'yyyy-MM-dd-HH:mm:ss') ) AND (tls_handshake_latency >= 2.0);

其他資源