Consultar logs do Application Load Balancer - Amazon Athena

Consultar logs do Application Load Balancer

O Application Load Balancer é uma opção de balanceamento de carga do Elastic Load Balancing que habilita a distribuição de tráfego em uma implantação de microsserviços usando contêineres. Consultar logs do Application Load Balancer permite consultar a origem do tráfego, a latência e os bytes transferidos de e para instâncias do Elastic Load Balancing e aplicativos de backend. Para obter mais informações, consulte Logs de acesso para seu Application Load Balancer e Logs de conexão para seu Application Load Balancer no Guia do usuário para Application Load Balancers.

Pré-requisitos

Como criar a tabela para logs de acesso do ALB

  1. Copie e cole a declaração CREATE TABLE a seguir em um editor de consulta no console do Athena e modifique-a conforme necessário para seus próprios requisitos de entrada de log. Para obter mais informações sobre os conceitos básicos do Athena, consulte Conceitos básicos. Substitua o caminho na cláusula LOCATION pela localização da pasta de log de acesso do Amazon S3. Para obter mais informações sobre o local do arquivo de log de acesso, consulte Arquivos de log de acesso no Guia do usuário para Application Load Balancers.

    Para obter informações sobre cada campo do arquivo de log, consulte Entradas do log de acesso no Guia do usuário para Application Load Balancers.

    nota

    A declaração de exemplo CREATE TABLE a seguir inclui as colunas classification, classification_reason e conn_trace_id (“ID de rastreabilidade” ou TID) adicionadas recentemente. Para criar uma tabela dos logs de acesso do Application Load Balancer que não contenham essas entradas, remova as colunas correspondentes da instrução CREATE TABLE e modifique a expressão regex de acordo.

    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. Execute a consulta no console do Athena. Depois que a consulta for concluída, o Athena registrará a tabela alb_access_logs, preparando os dados dela para você fazer as consultas.

Como criar a tabela para logs de acesso do ALB no Athena usando a projeção de partições

Como os logs de acesso do ALB têm uma estrutura conhecida com um esquema de partição que você pode especificar antecipadamente, é possível reduzir o runtime das consultas e automatizar o gerenciamento de partições usando o atributo de projeção de partições do Athena. A projeção de partições adiciona automaticamente novas partições à medida que os dados são adicionados. Isso elimina a necessidade de adicionar manualmente as partições usando ALTER TABLE ADD PARTITION.

O exemplo de instrução CREATE TABLE a seguir usa automaticamente a projeção de partições com base em logs de acesso do ALB a partir de uma data especificada até o dia atual para uma única região da AWS. A instrução é baseada no exemplo da seção anterior, mas adiciona as cláusulas PARTITIONED BY e TBLPROPERTIES para habilitar a projeção de partições. Nas cláusulas LOCATION e storage.location.template, substitua os espaços reservados pelos valores que identificam o local do bucket do Amazon S3 dos seus logs de acesso do ABL. Para obter mais informações sobre o local do arquivo de log de acesso, consulte Arquivos de log de acesso no Guia do usuário para Application Load Balancers. Em projection.day.range, substitua 2022/01/01 pela data de início desejada. Depois que você executar a consulta com êxito, poderá consultar a tabela. Você não precisa executar ALTER TABLE ADD PARTITION para carregar as partições. Para obter informações sobre cada campo do arquivo de log, consulte Entradas de log de acesso.

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}" )

Para obter mais informações sobre projeção de partições, consulte Projeção de partições com o Amazon Athena.

Exemplos de consultas para logs de acesso do ALB

A consulta a seguir conta o número de solicitações HTTP GET recebidas pelo load balancer agrupadas pelo endereço IP do cliente:

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

Outra consulta mostra os URLs visitados por usuários do navegador Safari:

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

A consulta a seguir mostra registros que têm valores de código de status ELB maiores ou iguais a 500.

SELECT * FROM alb_access_logs WHERE elb_status_code >= 500

O exemplo a seguir mostra como analisar os registros por 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;

O exemplo a seguir consulta a tabela que usa projeção de partição para todos os logs de acesso do ALB a partir do dia especificado.

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

Como criar a tabela para logs de conexão do ALB

  1. Copie e cole o exemplo de declaração CREATE TABLE a seguir em um editor de consulta no console do Athena e modifique-a conforme necessário para seus próprios requisitos de entrada de log. Para obter mais informações sobre os conceitos básicos do Athena, consulte Conceitos básicos. Substitua o caminho na cláusula LOCATION pela localização da pasta de log de conexão do Amazon S3. Para obter mais informações sobre o local do arquivo de log de conexão, consulte Arquivos de log de conexão no Guia do usuário para Application Load Balancers. Para obter informações sobre cada campo do arquivo de log, consulte Entradas de log de conexão.

    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. Execute a consulta no console do Athena. Depois que a consulta for concluída, o Athena registrará a tabela alb_connection_logs, preparando os dados dela para você fazer as consultas.

Como criar a tabela para logs de conexão do ALB no Athena usando a projeção de partições

Como os logs de conexão do ALB têm uma estrutura conhecida com um esquema de partição que você pode especificar antecipadamente, é possível reduzir o runtime das consultas e automatizar o gerenciamento de partições usando o atributo de projeção de partições do Athena. A projeção de partições adiciona automaticamente novas partições à medida que os dados são adicionados. Isso elimina a necessidade de adicionar manualmente as partições usando ALTER TABLE ADD PARTITION.

O exemplo de instrução CREATE TABLE a seguir usa automaticamente a projeção de partições com base em logs de conexão do ALB a partir de uma data especificada até o dia atual para uma única região da AWS. A instrução é baseada no exemplo da seção anterior, mas adiciona as cláusulas PARTITIONED BY e TBLPROPERTIES para habilitar a projeção de partições. Nas cláusulas LOCATION e storage.location.template, substitua os espaços reservados pelos valores que identificam o local do bucket do Amazon S3 dos seus logs de conexão do ABL. Para obter mais informações sobre o local do arquivo de log de conexão, consulte Arquivos de log de conexão no Guia do usuário para Application Load Balancers. Em projection.day.range, substitua 2023/01/01 pela data de início que deseja usar. Depois que você executar a consulta com êxito, poderá consultar a tabela. Você não precisa executar ALTER TABLE ADD PARTITION para carregar as partições. Para obter informações sobre cada campo do arquivo de log, consulte Entradas de log de conexão.

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}" )

Para obter mais informações sobre projeção de partições, consulte Projeção de partições com o Amazon Athena.

Exemplo de consultas para logs de conexão do ALB

A consulta a seguir conta as ocorrências nas quais o valor de tls_verify_status não foi 'Success', agrupadas por endereço IP do cliente:

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

A consulta a seguir pesquisa ocorrências nas quais o valor de tls_handshake_latency foi superior a 2 segundos no intervalo de tempo especificado:

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);

Recursos adicionais