Wie behebe ich Timeout-Probleme, wenn ich CloudTrail-Daten mit Athena abfrage?

Lesedauer: 5 Minute
0

Wenn ich Amazon Athena verwende, um meine AWS-CloudTrail-Daten abzufragen, dauert die Ausführung meiner Abfragen sehr lange oder es kommt zu einem Timeout.

Behebung

CloudTrail-Protokolle können im Laufe der Zeit an Größe zunehmen, selbst wenn Sie die CloudTrail-Tabelle partitionieren, um die Laufzeit der Abfragen zu reduzieren. Abfragen für eine stark partitionierte Tabelle erfordern eine höhere Planungszeit und werden nicht schnell abgeschlossen.

Um das Timeout-Problem zu lösen, können Sie mithilfe der Partitionsprojektion manuell eine CloudTrail-Tabelle erstellen. Dadurch kann Athena den Wert von CloudTrail-Tabellen dynamisch berechnen, anstatt eine große Liste von Partitionen zu durchsuchen. Mit der Partitionsprojektion müssen Sie Partitionen nicht verwalten, da Partitionswerte und Speicherorte anhand der Konfiguration berechnet werden.

Informationen zum Erstellen einer nach Zeitstempel partitionierten CloudTrail-Tabelle mit Partitionsprojektion finden Sie unter Erstellen der Tabelle für CloudTrail-Protokolle in Athena mithilfe der Partitionsprojektion.

Um eine CloudTrail-Tabelle für mehrere Konten zu erstellen, die nach Jahr, Monat und Tag mit Partitionsprojektion partitioniert ist, verwenden Sie einen Befehl ähnlich dem folgenden:

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

Stellen Sie sicher, dass Sie in der vorherigen Abfrage Folgendes ersetzen:

  • ctrail_pp_ymd mit dem Namen der CloudTrail-Tabelle
  • doc_example_bucket mit dem Namen des Amazon Simple Storage Service (Amazon S3) Buckets, in dem Sie die CloudTrail-Tabelle erstellen möchten
  • 1111222233334444 und 5555666677778888 mit den Konto-IDs der Konten, für die Sie die CloudTrail-Tabelle erstellen möchten
  • us-east-1, us-east-2, us-west-2 mit der Region, für die Sie die CloudTrail-Tabelle erstellen möchten
  • Tabellenattribute und Eigenschaften basierend auf Ihrem Anwendungsfall
  • Projektionsbereiche, die auf Ihrem Anwendungsfall basieren (wenn Ihre CloudTrail-Daten beispielsweise erst ab dem Jahr 2018 verfügbar sind, ersetzen Sie den Projektionsbereich für das Jahr der Partitionsspalte durch „2018,2021“)

Verwenden Sie einen Befehl, der dem folgenden ähnelt, um eine CloudTrail-Tabelle für mehrere Konten derselben Organisation zu erstellen:

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

**Hinweis:**Wenn Sie die CloudTrail-Daten vor dem Jahr 2010 abfragen müssen, stellen Sie sicher, dass Sie den Jahresbereich in projection.year.range aktualisieren.

Achten Sie darauf, die folgenden Punkte in der Richtlinie zu ersetzen:

  • ctrail_pp_ymd_org mit dem Namen der CloudTrail-Tabelle
  • doc_example_bucket mit dem Namen des Amazon S3 Buckets, in dem Sie die CloudTrail-Tabelle erstellen möchten
  • doc_example_OrgID mit Ihrer Organisations-ID
  • 1111222233334444 und 5555666677778888 mit den Konto-IDs der Konten, für die Sie die CloudTrail-Tabelle erstellen möchten
  • us-east-1, us-east-2 und us-west-2 mit den Regionen, in denen Sie die CloudTrail-Tabelle erstellen möchten
  • Tabellenattribute und Eigenschaften basierend auf Ihrem Anwendungsfall
  • Projektionsbereiche, die auf Ihrem Anwendungsfall basieren (wenn Ihre CloudTrail-Daten beispielsweise erst ab dem Jahr 2018 verfügbar sind, ersetzen Sie den Projektionsbereich für das Jahr der Partitionsspalte durch „2018,2021“)

Wenn Sie Ihre Abfragen ausführen, achten Sie darauf, restriktive Bedingungen für die Partitionsspalten in Ihre Abfragen aufzunehmen. Dadurch kann Athena weniger Daten scannen und die Abfrageverarbeitung wird beschleunigt.

Sie können beispielsweise einen Befehl ähnlich dem folgenden ausführen, um herauszufinden, welcher Benutzer die GetObject-Anfrage an den S3 Bucket gestellt hat. Die Tabelle in dieser Abfrage verwendet die Partitionierungsstrategie für Jahr, Monat und Tag.

Hinweis: Stellen Sie sicher, dass die Ereignisprotokollierung für Amazon S3 in CloudTrail aktiviert ist.

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'

Achten Sie darauf, die folgenden Punkte in der Richtlinie zu ersetzen:

  • ctrail_pp_ymd mit dem Namen der CloudTrail-Tabelle
  • doc_example_bucket mit dem Namen des S3 Buckets, in dem Sie die CloudTrail-Tabelle erstellen möchten
  • Restriktive Bedingungen, die auf Ihrem Anwendungsfall basieren

Wenn Sie auch nach der Implementierung der oben genannten Schritte Probleme mit dem Timeout haben, können Sie eine Erhöhung des Servicekontingents beantragen.


Weitere Informationen

Abfragen von AWS CloudTrail-Protokollen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren