Como solucionar problemas de tempo limite ao consultar dados do CloudTrail usando o Athena?

5 minuto de leitura
0

Quando uso o Amazon Athena para consultar meus dados do AWS CloudTrail, minhas consultas demoram muito para serem executadas ou atingem o tempo limite.

Resolução

Os logs do CloudTrail podem aumentar de tamanho com o tempo, mesmo se você particionar a tabela do CloudTrail para reduzir o tempo de execução das consultas. Consultas em uma tabela altamente particionada têm um tempo de planejamento maior e não são concluídas rapidamente.

Para resolver o problema de tempo limite, você pode criar manualmente uma tabela do CloudTrail usando a projeção de partição. Isso permite que o Athena calcule dinamicamente o valor das tabelas do CloudTrail em vez de examinar uma lista grande de partições. Com a projeção de partições, você não precisa gerenciar partições, pois os valores e as localizações das partições são calculados a partir da configuração.

Para criar uma tabela do CloudTrail particionada por data e hora com projeção de partição, consulte Criar a tabela para logs do CloudTrail no Athena usando projeção de partição.

Para criar uma tabela do CloudTrail para várias contas particionadas por ano, mês e dia com a projeção de partição, use um comando semelhante ao seguinte:

CREATE EXTERNAL TABLE ctrail_pp_ymd (
eventversion STRING,
useridentity STRUCT<
               type:STRING,
               principalid:STRING,
               arn:STRING,
               accountid:STRING,
               invokedby:STRING,
               accesskeyid:STRING,
               userName:STRING,
sessioncontext:STRUCT<
attributes:STRUCT<
               mfaauthenticated:STRING,
               creationdate:STRING>,
sessionissuer:STRUCT<
               type:STRING,
               principalId:STRING,
               arn:STRING,
               accountId:STRING,
               userName:STRING>>>,
eventtime STRING,
eventsource STRING,
eventname STRING,
awsregion STRING,
sourceipaddress STRING,
useragent STRING,
errorcode STRING,
errormessage STRING,
requestparameters STRING,
responseelements STRING,
additionaleventdata STRING,
requestid STRING,
eventid STRING,
resources ARRAY<STRUCT<
               ARN:STRING,
               accountId:STRING,
               type:STRING>>,
eventtype STRING,
apiversion STRING,
readonly STRING,
recipientaccountid STRING,
serviceeventdetails STRING,
sharedeventid STRING,
vpcendpointid STRING
)
PARTITIONED BY (account string, region string, year string, month string, day string)
ROW FORMAT SERDE
  'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT
  'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://doc_example_bucket/AWSLogs/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.day.type'='integer',
  'projection.day.range'='01,31',
  'projection.day.digits'='2',
  'projection.month.type'='integer',
  'projection.month.range'='01,12',
  'projection.month.digits'='2',
  'projection.region.type'='enum',
  'projection.region.values'='us-east-1,us-east-2,us-west-2',
  'projection.year.type'='integer',
  'projection.year.range'='2015,2021',
  'projection.account.type'='enum',
  'projection.account.values'='111122223334444,5555666677778888',  
  'storage.location.template'='s3://doc_example_bucket/AWSLogs/${account}/CloudTrail/${region}/${year}/${month}/${day}'
)

Certifique-se de substituir o seguinte na consulta anterior:

  • ctrail_pp_ymd pelo nome da tabela do CloudTrail
  • doc_example_bucket pelo nome do bucket do Amazon Simple Storage Service (Amazon S3) em que você deseja criar a tabela do CloudTrail
  • 1111222233334444 e 5555666677778888 pelos IDs das contas para as quais você deseja criar a tabela do CloudTrail
  • us-east-1,us-east-2,us-west-2 pela região para a qual você deseja criar a tabela do CloudTrail
  • Atributos e propriedades da tabela com base no seu caso de uso
  • Intervalos de projeção com base no seu caso de uso (por exemplo, se os seus dados do CloudTrail estiverem disponíveis somente a partir do ano de 2018, substitua o intervalo de projeção da coluna de partição year por '2018,2021')

Para criar uma tabela do CloudTrail para várias contas na mesma organização, use um comando semelhante ao seguinte:

CREATE EXTERNAL TABLE ctrail_pp_ymd_org (
eventversion STRING,
useridentity STRUCT<
               type:STRING,
               principalid:STRING,
               arn:STRING,
               accountid:STRING,
               invokedby:STRING,
               accesskeyid:STRING,
               userName:STRING,
sessioncontext:STRUCT<
attributes:STRUCT<
               mfaauthenticated:STRING,
               creationdate:STRING>,
sessionissuer:STRUCT<
               type:STRING,
               principalId:STRING,
               arn:STRING,
               accountId:STRING,
               userName:STRING>>>,
eventtime STRING,
eventsource STRING,
eventname STRING,
awsregion STRING,
sourceipaddress STRING,
useragent STRING,
errorcode STRING,
errormessage STRING,
requestparameters STRING,
responseelements STRING,
additionaleventdata STRING,
requestid STRING,
eventid STRING,
resources ARRAY<STRUCT<
               ARN:STRING,
               accountId:STRING,
               type:STRING>>,
eventtype STRING,
apiversion STRING,
readonly STRING,
recipientaccountid STRING,
serviceeventdetails STRING,
sharedeventid STRING,
vpcendpointid STRING
)
PARTITIONED BY (account string, region string, year string, month string, day string)
ROW FORMAT SERDE
  'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT
  'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://doc_example_bucket/AWSLogs/doc_example_orgID/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.day.type'='integer',
  'projection.day.range'='01,31',
  'projection.day.digits'='2',
  'projection.month.type'='integer',
  'projection.month.range'='01,12',
  'projection.month.digits'='2',
  'projection.region.type'='enum',
  'projection.region.values'='us-east-1,us-east-2,us-west-2',
  'projection.year.type'='integer',
  'projection.year.range'='2010,2100',
  'projection.account.type'='enum',
  'projection.account.values'='111122223334444,5555666677778888',  
  'storage.location.template'='s3://doc_example_bucket/AWSLogs/doc_example_orgID/${account}/CloudTrail/${region}/${year}/${month}/${day}'
)

Observação: se você precisar consultar os dados do CloudTrail antes do ano 2010, certifique-se de atualizar o intervalo de anos em projection.year.range.

Certifique-se de substituir o seguinte na consulta acima:

  • ctrail_pp_ymd_org pelo nome da tabela do CloudTrail
  • doc_example_bucket pelo nome do bucket do Amazon S3 em que você deseja criar a tabela do CloudTrail
  • doc_example_orgID pelo ID da sua organização
  • 1111222233334444 e 5555666677778888 pelos IDs das contas para as quais você deseja criar a tabela do CloudTrail
  • us-east-1, us-east-2 e us-west-2 pelas regiões nas quais você deseja criar a tabela do CloudTrail
  • Atributos e propriedades da tabela com base no seu caso de uso
  • Intervalos de projeção com base no seu caso de uso (por exemplo, se os seus dados do CloudTrail estiverem disponíveis somente a partir do ano de 2018, substitua o intervalo de projeção da coluna de partição year por '2018,2021')

Ao executar suas consultas, certifique-se de incluir condições restritivas nas colunas de partição nas suas consultas. Isso permite que o Athena verifique menos dados e acelere o processamento de consultas.

Por exemplo, você pode executar um comando semelhante ao seguinte para descobrir qual usuário fez a solicitação GetObject para o bucket do S3. A tabela nessa consulta usa a estratégia de particionamento de ano, mês e dia.

Observação: certifique-se de ter o log de eventos ativado para o Amazon S3 no CloudTrail.

SELECT useridentity.arn, eventtime  FROM "ctrail_pp_ymd"
where eventname = 'GetObject'
and year = '2021'
and month = '05'
and region = 'us-east-1'
and cast(json_extract(requestparameters, '$.bucketName')as varchar) ='doc_example_bucket'

Certifique-se de substituir o seguinte na consulta acima:

  • ctrail_pp_ymd pelo nome da tabela do CloudTrail
  • doc_example_bucket pelo nome do bucket do S3 em que você deseja criar a tabela do CloudTrail
  • Condições restritivas com base no seu caso de uso

Se você tiver problemas de tempo limite mesmo depois de implementar as etapas acima, poderá solicitar um aumento da cota de serviço.


Informações relacionadas

Consultar logs do AWS CloudTrail

AWS OFICIAL
AWS OFICIALAtualizada há 3 anos