Comment résoudre les problèmes de délai d'expiration lorsque j'interroge des données CloudTrail à l'aide d'Athena ?

Date de la dernière mise à jour : 26/05/2021

Lorsque j'utilise Amazon Athena pour interroger mes données AWS CloudTrail, mes requêtes prennent beaucoup de temps à s'exécuter ou elles expirent.

Résolution

Les journaux CloudTrail peuvent occuper de plus en plus d'espace au fil du temps, même si vous partitionnez la table CloudTrail pour réduire le temps d'exécution des requêtes. Les requêtes sur une table fortement partitionnée ont une durée de planification plus élevée et n'aboutissent pas rapidement.

Pour résoudre le problème de délai d'expiration, vous pouvez créer manuellement une table CloudTrail à l'aide de la projection de partition. Cela permet à Athena de calculer dynamiquement la valeur des tables CloudTrail au lieu d'analyser une grande liste de partitions. Avec la projection de partitions, vous n'avez pas besoin de gérer les partitions, car leurs valeurs et leurs emplacements sont calculés à partir de la configuration.

Pour savoir comment créer une table CloudTrail partitionnée par horodatage avec projection de partition, consultez la section Création de la table pour les journaux CloudTrail dans Athena à l'aide d'une projection de partition.

Pour créer une table CloudTrail pour plusieurs comptes partitionnée par année, mois et jour avec projection de partition, utilisez une commande similaire à la suivante :

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

Assurez-vous de remplacer ce qui suit dans la stratégie ci-dessus :

  • ctrail_pp_ymd par le nom de la table CloudTrail
  • doc_example_bucket par le nom du compartiment Amazon Simple Storage Service (Amazon S3) où vous souhaitez créer la table CloudTrail
  • 1111222233334444 et 5555666677778888 par les ID des comptes pour lesquels vous souhaitez créer la table CloudTrail
  • us-east-1, us-east-2, us-west-2 par la région pour laquelle vous souhaitez créer la table CloudTrail
  • Les attributs et propriétés de table en fonction de votre cas d'utilisation
  • Les plages de projection basées sur votre cas d'utilisation (par exemple, si vos données CloudTrail ne sont disponibles qu'à partir de l'année 2018, remplacez la plage de projection pour la colonne de partition année par '2018,2021')

Pour créer une table CloudTrail pour plusieurs comptes dans la même organisation, utilisez une commande semblable à la suivante :

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

Remarque : Si vous devez interroger les données CloudTrail avant l'année 2010, assurez-vous de mettre à jour la plage d'années dans projection.year.range.

Assurez-vous de remplacer ce qui suit dans la stratégie ci-dessus :

  • ctrail_pp_ymd_org par le nom de la table CloudTrail
  • doc_example_bucket par le nom du compartiment Amazon S3 où vous souhaitez créer la table CloudTrail
  • doc_example_orgID par l'ID de votre organisation
  • 1111222233334444 et 5555666677778888 par les ID des comptes pour lesquels vous souhaitez créer la table CloudTrail
  • us-east-1, us-east-2et us-west-2 par les régions pour lesquelles vous souhaitez créer la table CloudTrail
  • Les attributs et propriétés de table en fonction de votre cas d'utilisation
  • Les plages de projection basées sur votre cas d'utilisation (par exemple, si vos données CloudTrail ne sont disponibles qu'à partir de l'année 2018, remplacez la plage de projection pour la colonne de partition année par '2018,2021')

Lorsque vous exécutez vos requêtes, assurez-vous d'inclure des conditions restrictives dans les colonnes de partition de vos requêtes. Cela permet à Athena d'analyser moins de données et accélère le traitement des requêtes.

Par exemple, vous pouvez exécuter une commande semblable à la suivante pour savoir quel utilisateur a effectué la requête GetObject dans le compartiment S3. La table de cette requête utilise la stratégie de partitionnement année, mois et jour.

Remarque : veillez à ce que la journalisation des événements soit activée pour Amazon S3 dans 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'

Assurez-vous de remplacer ce qui suit dans la stratégie ci-dessus :

  • ctrail_pp_ymd par le nom de la table CloudTrail
  • doc_example_bucket par le nom du compartiment S3 où vous souhaitez créer la table CloudTrail
  • Les conditions restrictives basées sur votre cas d'utilisation

Si vous rencontrez des problèmes de délai d'expiration même après la mise en œuvre des étapes ci-dessus, vous pouvez demander une augmentation du quota de service.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?