Como usar Amazon Athena para analisar logs de acesso ao servidor do Amazon S3?

6 minuto de leitura
0

Quero consultar os logs de acesso ao servidor do Amazon Simple Storage Service (Amazon S3) no Amazon Athena.

Resolução

Amazon S3 armazena logs de acesso ao servidor como objetos em um bucket do S3. Siga estas etapas para usar o Athena para analisar logs de acesso ao servidor de consultas do S3.

  1. Ative o registro em log de acesso ao servidor para seu bucket do S3, caso ainda não tenha feito isso. Anote os valores do Bucket de destino e do Prefixo de destino. Você precisa de ambos para especificar a localização do Amazon S3 em uma consulta do Athena.
    **Observação:**para o formato da chave do objeto de log, escolha o particionamento baseado em data para acelerar aplicações de análise e consulta.

  2. Abra o console do Amazon Athena.
    **Observação:**antes de executar sua primeira consulta, talvez seja necessário configurar um local para o resultado da consulta no Amazon S3.

  3. No editor de consultas, execute uma instrução DDL para criar um banco de dados.
    Observação: é uma prática recomendada criar o banco de dados na mesma região da AWS que o bucket do S3.

    create database s3_access_logs_db
  4. Crie um esquema de tabela no banco de dados. No exemplo a seguir, os valores dos tipos de dado STRING e BIGINT são as propriedades do log de acesso. É possível consultar essas propriedades no Athena. Em LOCATION, insira o bucket do S3 e o caminho do prefixo da Etapa 1. Certifique-se de incluir uma barra (/) no final do prefixo (por exemplo, s3://doc-example-bucket/prefix/). Se não estiver usando um prefixo, inclua uma barra (/) no final do nome do bucket (por exemplo, s3://doc-example-bucket/).

    CREATE EXTERNAL TABLE s3_access_logs_db.mybucket_logs(
     `bucketowner` STRING,
     `bucket_name` STRING,
     `requestdatetime` STRING,
     `remoteip` STRING,
     `requester` STRING,
     `requestid` STRING,
     `operation` STRING,
     `key` STRING,
     `request_uri` STRING,
     `httpstatus` STRING,
     `errorcode` STRING,
     `bytessent` BIGINT,
     `objectsize` BIGINT,
     `totaltime` STRING,
     `turnaroundtime` STRING,
     `referrer` STRING,
     `useragent` STRING,
     `versionid` STRING,
     `hostid` STRING,
     `sigv` STRING,
     `ciphersuite` STRING,
     `authtype` STRING,
     `endpoint` STRING,
     `tlsversion` STRING,
     `accesspointarn` STRING,
     `aclrequired` STRING)
     PARTITIONED BY (
       `timestamp` string)
    ROW FORMAT SERDE
     'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
     'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$')
    STORED AS INPUTFORMAT
     'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION
     's3://bucket-name/prefix-name/account-id/region/source-bucket-name/'
     TBLPROPERTIES (
      'projection.enabled'='true',
      'projection.timestamp.format'='yyyy/MM/dd',
      'projection.timestamp.interval'='1',
      'projection.timestamp.interval.unit'='DAYS',
      'projection.timestamp.range'='2024/01/01,NOW',
      'projection.timestamp.type'='date',
      'storage.location.template'='s3://bucket-name/prefix-name/account-id/region/source-bucket-name/${timestamp}')
  5. No painel esquerdo, em Tabelas, escolha as reticências ao lado do nome da tabela e escolha Visualizar tabela. Se você vir dados dos logs de acesso ao servidor na janela Resultados, significa que criou a tabela do Athena com êxito. Os dados parecem valores como bucketowner, bucket\ _name e requestdatetime.

Agora será possível consultar os logs de acesso ao servidor do Amazon S3.

Exemplos de consultas

Para encontrar a solicitação de um objeto excluído, use a seguinte consulta:

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';

Para mostrar IDs de solicitação do Amazon S3 para solicitações que resultaram em erros 403 Acesso Negado, use a seguinte consulta:

SELECT requestdatetime, requester, operation, requestid, hostid FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus = '403';

Para encontrar IDs de solicitação do Amazon S3 para erros HTTP 5xx em um período específico com a chave e o código do erro, execute a seguinte consulta:

SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid FROM s3_access_logs_db.mybucket_logs WHERE httpstatus like '5%'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para mostrar quem excluiu um objeto e quando, com o carimbo de data e hora, endereço IP e função do AWS Identity and Access Management (IAM), use a seguinte consulta:

SELECT requestdatetime, remoteip, requester, key FROM s3_access_logs_db.mybucket_logs
WHERE key = 'images/picture.jpg'
AND operation like '%DELETE%';

Para mostrar todas as operações que foram realizadas por uma função do IAM, use a seguinte consulta:

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE requester='arn:aws:iam::123456789123:user/user_name';

Para mostrar todas as operações que foram realizadas em um objeto em um período específico, use a seguinte consulta:

SELECT *FROM s3_access_logs_db.mybucket_logs WHERE Key='prefix/images/picture.jpg'  AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para mostrar quantos dados são transferidos para um endereço IP durante um período específico, use a seguinte consulta:

SELECT coalesce(SUM(bytessent), 0) AS bytessentTOTAL
FROM s3_access_logs_db.mybucket_logs
WHERE RemoteIP='1.2.3.4'AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para mostrar todas as operações de expiração que foram executadas pelas regras de ciclo de vida em um período específico, use a consulta a seguir:

SELECT * FROM s3_access_logs_db.mybucket_logs WHERE operation = 'S3.EXPIRE.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para contar o número de objetos que expiraram em um período específico, use a seguinte consulta:

SELECT count(*) as ExpireCount FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para mostrar todas as operações de transição que foram realizadas por regras de ciclo de vida em um período específico, use a consulta a seguir:

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE operation like 'S3.TRANSITION%'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para mostrar todos os solicitantes agrupados por Signature Version, use a seguinte consulta:

SELECT requester, Sigv, Count(Sigv) as SigCount
FROM s3_access_logs_db.mybucket_logs
GROUP BY requester, Sigv;

Para mostrar todos os solicitantes anônimos que fizeram solicitações em um período específico, use a seguinte consulta:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE requester IS NULL AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para mostrar todos os solicitantes que enviaram solicitações de objetos PUT em um período específico, use a seguinte consulta:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.PUT.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para mostrar todos os solicitantes que enviaram solicitações de objetos GET em um período específico, use a seguinte consulta:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.GET.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

Para mostrar todos os solicitantes, ordenados pelo maior tempo de resposta em um período específico, use a seguinte consulta:

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE NOT turnaroundtime='-'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'
ORDER BY CAST(turnaroundtime AS INT) DESC;

Observação: como o número de objetos nos buckets do S3 aumenta com o tempo, as consultas processarão mais dados. É uma prática recomendada criar uma política do prazo de validade para o bucket de logs de acesso ao servidor. Configure a política do prazo de validade para remover periodicamente os arquivos de log. Essa ação reduz a quantidade de dados que o Athena analisa para cada consulta.

Informações relacionadas

Como analisar logs de acesso ao servidor do Amazon S3 usando o Amazon OpenSearch Service

Formato de log de acesso ao servidor do Amazon S3

Como consultar logs de serviços da AWS

AWS OFICIAL
AWS OFICIALAtualizada há 4 meses