Come posso risolvere i problemi di timeout quando eseguo query sui dati di CloudTrail utilizzando Athena?

5 minuti di lettura
0

Quando utilizzo Amazon Athena per eseguire query sui miei dati di AWS CloudTrail, queste ultime richiedono molto tempo per essere eseguite o scadono.

Risoluzione

I log di CloudTrail possono aumentare di dimensioni nel tempo anche se esegui la partizione della tabella CloudTrail per ridurre il tempo di esecuzione delle query. Le query eseguite su una tabella con partizioni elevate richiedono tempi di pianificazione più lunghi e non vengono completate rapidamente.

Per risolvere il problema di timeout, puoi creare manualmente una tabella CloudTrail utilizzando la proiezione delle partizioni. Ciò consente ad Athena di calcolare dinamicamente il valore delle tabelle CloudTrail invece di eseguire la scansione di un ampio elenco di partizioni. Con la proiezione delle partizioni, non è necessario gestire le partizioni perché i valori e le posizioni delle partizioni vengono calcolati in base alla configurazione.

Per creare una tabella CloudTrail partizionata per timestamp con la proiezione delle partizioni, consulta Creating the table for CloudTrail logs in Athena using partition projection.

Per creare una tabella CloudTrail per più account partizionata per anno, mese e giorno con la proiezione delle partizioni, utilizza un comando simile al seguente:

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

Assicurati di sostituire le seguenti informazioni nella query precedente:

  • ctrail_pp_ymd con il nome della tabella CloudTrail
  • doc_example_bucket con il nome del bucket Amazon Simple Storage Service (Amazon S3) in cui desideri creare la tabella CloudTrail
  • 1111222233334444 e 5555666677778888 con gli ID account per i quali desideri creare la tabella CloudTrail
  • us-east-1, us-east-2, us-west-2 con la regione per cui desideri creare la tabella CloudTrail
  • Gli attributi e le proprietà della tabella in base al tuo caso d'uso
  • Gli intervalli di proiezione in base al tuo caso d'uso (ad esempio, se i dati di CloudTrail sono disponibili solo dall'anno 2018, sostituisci l'intervallo di proiezione nella colonna anno della partizione con "2018, 2021")

Per creare una tabella CloudTrail per più account della stessa organizzazione, utilizza un comando simile al seguente:

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

Nota: se devi interrogare i dati di CloudTrail prima del 2010, assicurati di aggiornare l'intervallo di anni in projection.year.range.

Assicurati di sostituire le seguenti informazioni nella query precedente:

  • ctrail_pp_org con il nome della tabella CloudTrail
  • doc_example_bucket con il nome del bucket Amazon S3 in cui desideri creare la tabella CloudTrail
  • doc_example_orgID con l'ID dell'organizzazione
  • 1111222233334444 e 5555666677778888 con gli ID account per i quali desideri creare la tabella CloudTrail
  • us-east-1, us-east-2 e us-west-2 con le regioni in cui desideri creare la tabella CloudTrail
  • Gli attributi e le proprietà della tabella in base al tuo caso d'uso
  • Gli intervalli di proiezione in base al tuo caso d'uso (ad esempio, se i dati di CloudTrail sono disponibili solo dall'anno 2018, sostituisci l'intervallo di proiezione nella colonna anno della partizione con "2018, 2021")

Quando esegui le query, assicurati di includere condizioni restrittive nelle colonne delle partizioni delle query. Ciò consente ad Athena di scansionare meno dati e velocizza l'elaborazione delle query.

Ad esempio, puoi eseguire un comando simile al seguente per scoprire quale utente ha effettuato la richiesta GetObject al bucket S3. La tabella in questa query utilizza la strategia di partizionamento per anno, mese e giorno.

Nota: assicurati di aver attivato la registrazione degli eventi per Amazon S3 in 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'

Assicurati di sostituire le seguenti informazioni nella query precedente:

  • ctrail_pp_ymd con il nome della tabella CloudTrail
  • doc_example_bucket con il nome del bucket S3 in cui desideri creare la tabella CloudTrail
  • Le condizioni restrittive in base al tuo caso d'uso

Se riscontri problemi di timeout anche dopo aver implementato i passaggi precedenti, puoi richiedere un aumento della quota di servizio.


Informazioni correlate

Interrogare i log di AWS CloudTrail

AWS UFFICIALE
AWS UFFICIALEAggiornata 3 anni fa