Usando AWS re:Post, accetti AWS re:Post Termini di utilizzo

Come posso utilizzare la proiezione delle partizioni per creare tabelle CloudTrail per le query con 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 runtime delle query. Le query in una tabella altamente partizionata richiedono tempi di pianificazione lunghi e non vengono completate rapidamente.

Per risolvere il problema del timeout, usa la proiezione delle partizioni per creare manualmente una tabella Cloudtrail. Ciò consente ad Athena di calcolare dinamicamente il valore delle tabelle CloudTrail, riducendo il runtime delle query. 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 variabili 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 AWS per cui desideri creare la tabella CloudTrail.
  • Gli attributi e le proprietà della tabella in base al tuo caso d'uso.
  • 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 nella proprietà projection.year.range.

Assicurati di sostituire le seguenti variabili 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.
  • 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 riduce il tempo di 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 il formato della partizione 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 variabili 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, consulta Come posso risolvere i problemi di timeout quando eseguo query sui dati di CloudTrail utilizzando Athena?

Per ulteriori informazioni, consulta Querying AWS CloudTrail logs e Come posso creare e utilizzare tabelle partizionate in Amazon Athena?

Informazioni correlate

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

Troubleshooting in Athena

AWS UFFICIALE
AWS UFFICIALEAggiornata 10 mesi fa