Como posso usar a projeção de partição para criar tabelas do CloudTrail para consultas do Athena?

5 minuto de leitura
0

Quando uso o Amazon Athena para consultar meus dados do AWS CloudTrail, as consultas demoram muito para serem executadas ou acabam atingindo 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 runtime das consultas. Consultas em uma tabela altamente particionada têm um tempo de planejamento alto e não são concluídas rapidamente.

Para resolver o problema de tempo limite, use uma projeção de partição para criar manualmente uma tabela do CloudTrail. Isso permite que o Athena calcule dinamicamente o valor das tabelas do CloudTrail, o que reduz o runtime da consulta. 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 de logs do CloudTrail no Athena usando a projeção de partições.

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 as seguintes variáveis 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 and 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 da AWS 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 dados do CloudTrail estiverem disponíveis apenas a partir do ano 2018, substitua o intervalo de projeção para a coluna de partição ano 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 precisar consultar os dados do CloudTrail antes do ano 2010, atualize o intervalo de anos na propriedade projection.year.range.

Certifique-se de substituir as seguintes variáveis na consulta anterior:

  • 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 dados do CloudTrail estiverem disponíveis apenas a partir do ano 2018, substitua o intervalo de projeção para a coluna de partição ano 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 reduza o tempo do processo de consulta.

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 nesta consulta usa o formato de partição 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 as seguintes variáveis na consulta anterior:

  • 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ê receber problemas de tempo limite, consulte Como solucionar problemas de tempo limite ao consultar dados do CloudTrail usando o Athena?

Para obter mais informações, consulte a Consultar os logs do AWS CloudTrail e Como posso criar e usar tabelas particionadas no Amazon Athena?

Informações relacionadas

How do I resolve the partition projection error "INVALID_TABLE_PROPERTY" when I query a table in Athena?

Solução de problemas no Athena

AWS OFICIALAtualizada há um ano