Como analiso meus logs de acesso do Application Load Balancer usando o Amazon Athena?

7 minuto de leitura
0

Quero analisar meus logs de acesso do Application Load Balancer com o Amazon Athena.

Quero analisar meus logs de acesso do Application Load Balancer com o Amazon Athena.

Breve descrição

O Elastic Load Balancing não ativa o registro em log de acesso por padrão. Ao ativar o registro em log de acesso, você especifica um bucket do Amazon Simple Storage Service (Amazon S3). Todos os logs de acesso do Application Load Balancer e do Classic Load Balancer são armazenados no bucket do Amazon S3. Para solucionar problemas ou analisar o desempenho do seu balanceador de carga, use o Athena para analisar os logs de acesso no Amazon S3.

Observação: embora você possa usar o Athena para analisar logs de acesso do Application Load Balancer e do Classic Load Balancer, essa resolução se aplica somente ao Application Load Balancer.

Resolução

Crie um banco de dados e uma tabela para os logs do Application Load Balancer

Para analisar os logs de acesso no Athena, crie um banco de dados e uma tabela seguindo estas etapas:

1.    Abra o console do Athena.

2.    Para criar um banco de dados, execute o comando a seguir no Editor de Consultas. É uma prática recomendada criar o banco de dados na mesma região da AWS que o bucket do S3.

create database alb_db

3.    No banco de dados criado na Etapa 2, crie uma tabela alb_logs para os logs do Application Load Balancer. Para obter mais informações, consulte Criar a tabela para logs do Application Load Balancer.

Observação: para melhorar o desempenho da consulta, é possível criar uma tabela com projeção de partições. Na projeção de partições, o Athena calcula valores e locais de partições a partir da configuração, em vez de ler de um repositório, como o Catálogo de Dados do AWS Glue. Para obter mais informações, consulte Projeção de partições com o Amazon Athena.

CREATE EXTERNAL TABLE IF NOT EXISTS 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
            )
            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://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing//'
            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://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing//${day}"
            )

Observação: substitua o nome da tabela e os locais do S3 de acordo com seu caso de uso.

Ou use a consulta a seguir para criar uma tabela com partições:

CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs_partitioned (
            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 string,
            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
            )
            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://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/'

Em seguida, use o comando ALTER TABLE ADD PARTITION para carregar as partições:

ALTER TABLE alb_logs_partitioned ADD
  PARTITION (day = '2022/05/21')
  LOCATION's3://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/2022/05/21/'

Observação: não é uma prática recomendada usar um crawler do AWS Glue nos logs do Application Load Balancer.

4.    Em Tabelas no painel de navegação, selecione Visualizar tabela no menu. Você pode visualizar os dados dos logs de acesso do Application Load Balancer na janela Resultados.

5.    Use o Editor de Consultas para executar instruções SQL na tabela. Você pode salvar consultas, visualizar consultas anteriores ou baixar os resultados de consultas no formato de arquivo.csv.

Exemplos de consultas

Nos exemplos a seguir, não se esqueça de modificar o nome da tabela, os valores das colunas e outras variáveis de acordo com sua consulta:

Visualizar as 100 primeiras entradas de log de acesso em ordem cronológica

Use essa consulta para análise e solução de problemas:

SELECT *  
FROM alb_logs  
ORDER by time ASC  
LIMIT 100

Listar todos os endereços IP do cliente que acessaram o Application Load Balancer e quantas vezes eles o acessaram

Use essa consulta para análise e solução de problemas:

SELECT distinct client_ip, count() as count from alb_logs  
GROUP by client_ip  
ORDER by count() DESC;

Listar a quantidade média de dados (em kilobytes) que estão passando pelo Application Load Balancer em pares de solicitação ou resposta

Use essa consulta para análise e solução de problemas:

SELECT (avg(sent_bytes)/1000.0 + avg(received_bytes)/1000.0)  
as prewarm_kilobytes from alb_logs;

Listar todos os destinos para os quais o Application Load Balancer roteia o tráfego e o número de solicitações roteadas por destino, por distribuição percentual   

Use essa consulta para identificar possíveis desequilíbrios de tráfego de destino:

SELECT target_ip, (Count(target_ip)* 100.0 / (Select Count(*) From alb_logs))  
as backend_traffic_percentage  
FROM alb_logs  
GROUP by target_ip<  
ORDER By count() DESC;

Listar as vezes em que um cliente enviou uma solicitação ao Application Load Balancer e fechou a conexão antes que o tempo limite de inatividade terminasse (erro HTTP 460)

Use essa consulta para solucionar erros HTTP 460:

SELECT * from alb_logs where elb_status_code = '460';

Listar as vezes em que uma solicitação do cliente não foi roteada porque a regra do receptor encaminhou a solicitação para um grupo de destino vazio (erro HTTP 503)

Use essa consulta para solucionar erros HTTP 503:

SELECT * from alb_logs where elb_status_code = '503';

Listar os clientes, em ordem decrescente, pelo número de vezes que cada cliente acessou um URL especificado

Use essa consulta para analisar padrões de tráfego:

SELECT client_ip, elb, request_url, count(*) as count from alb_logs  
GROUP by client_ip, elb, request_url  
ORDER by count DESC;

Listar os 10 URLs que os usuários do Firefox acessaram com mais frequência, em ordem decrescente

Use essa consulta para analisar padrões e distribuição de tráfego:

SELECT request_url, user_agent, count(*) as count  
FROM alb_logs  
WHERE user_agent LIKE '%Firefox%'  
GROUP by request_url, user_agent  
ORDER by count(*) DESC  
LIMIT 10;

Listar os clientes, em ordem decrescente, pela quantidade de dados (em megabytes) que cada cliente enviou em suas solicitações ao Application Load Balancer

Use essa consulta para analisar padrões e distribuição de tráfego:

SELECT client_ip, sum(received_bytes/1000000.0) as client_datareceived_megabytes  
FROM alb_logs  
GROUP by client_ip  
ORDER by client_datareceived_megabytes DESC;

Listar cada vez em um intervalo de datas especificado em que o tempo de processamento do destino foi superior a 5 segundos

Use essa consulta para solucionar problemas de latência em um período especificado:

SELECT * from alb_logs  
WHERE (parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')  
    BETWEEN parse_datetime('2018-08-08-00:00:00','yyyy-MM-dd-HH:mm:ss')  
    AND parse_datetime('2018-08-08-02:00:00','yyyy-MM-dd-HH:mm:ss'))  
AND (target_processing_time >= 5.0);

Contar o número de solicitações HTTP GET recebidas pelo balanceador de carga agrupadas pelo endereço IP do cliente

Use essa consulta para analisar a distribuição do tráfego de entrada:

SELECT COUNT(request_verb)   
AS count, request_verb, client_ip   
FROM alb_logs_partitioned   
WHERE day = '2022/05/21'   
GROUP by request_verb, client_ip;
AWS OFICIAL
AWS OFICIALAtualizada há um ano