使用手动分区在 Athena 中为 CloudTrail 日志创建表 - Amazon Athena

使用手动分区在 Athena 中为 CloudTrail 日志创建表

可以在 Athena 控制台中为 CloudTrail 日志文件手动创建表,然后在 Athena 中运行查询。

使用 Athena 控制台为 CloudTrail 跟踪记录创建 Athena 表
  1. 将以下 DDL 语句复制并粘贴到 Athena 控制台查询编辑器中,然后根据要求进行修改。请注意,由于 CloudTrail 日志文件不是公用 API 调用的有序堆栈跟踪,因此日志文件中的字段不会按照任何特定顺序显示。

    CREATE EXTERNAL TABLE cloudtrail_logs ( eventversion STRING, useridentity STRUCT< type:STRING, principalid:STRING, arn:STRING, accountid:STRING, invokedby:STRING, accesskeyid:STRING, username:STRING, onbehalfof: STRUCT< userid: STRING, identitystorearn: STRING>, sessioncontext:STRUCT< attributes:STRUCT< mfaauthenticated:STRING, creationdate:STRING>, sessionissuer:STRUCT< type:STRING, principalid:STRING, arn:STRING, accountid:STRING, username:STRING>, ec2roledelivery:string, webidfederationdata: STRUCT< federatedprovider: STRING, attributes: map<string,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, vpcendpointaccountid STRING, eventcategory STRING, addendum STRUCT< reason:STRING, updatedfields:STRING, originalrequestid:STRING, originaleventid:STRING>, sessioncredentialfromconsole STRING, edgedevicedetails STRING, tlsdetails STRUCT< tlsversion:STRING, ciphersuite:STRING, clientprovidedhostheader:STRING> ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/Account_ID/';
    注意

    建议使用示例中所示的 org.apache.hive.hcatalog.data.JsonSerDe。虽然存在 com.amazon.emr.hive.serde.CloudTrailSerde,但目前还无法处理一些较新的 CloudTrail 字段。

  2. (可选)删除表格中所有非必填字段。如果您只需要读取一组特定的列,则您的表定义可以排除其他列。

  3. 修改 s3://amzn-s3-demo-bucket/AWSLogs/Account_ID/ 以指向包含要查询的日志数据的 Amazon S3 存储桶。该示例使用特定账户的日志的 LOCATION 值,但您可以使用最适合您的应用程序的明确度程度。例如:

    • 要分析多个账户中的数据,您可以通过使用 LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/',回滚 LOCATION 说明符来指示所有 AWSLogs

    • 要分析特定日期、账户和区域中的数据,请使用 LOCATION 's3://amzn-s3-demo-bucket/123456789012/CloudTrail/us-east-1/2016/03/14/'.

    • 要分析网络活动数据而不是管理事件,请将 LOCATION 子句中的 /CloudTrail/ 替换为 /CloudTrail-NetworkActivity/

    如果使用对象层次结构中的最高级别,则可以在使用 Athena 查询时获得最高程度的灵活度。

  4. 验证字段是否正确列出。有关 CloudTrail 记录中的完整字段列表的更多信息,请参阅 CloudTrail 记录内容

    步骤 1 中的示例 CREATE TABLE 语句使用 Hive JSON SerDe。在该示例中,字段 requestparametersresponseelementsadditionaleventdata 作为查询中的 STRING 类型列出,但在 JSON 中使用 STRUCT 数据类型。因此,要将数据移出这些字段,请使用 JSON_EXTRACT 函数。有关更多信息,请参阅 从字符串中提取 JSON 数据。为了提高性能,此示例按 AWS 区域、年份、月份和日期对数据进行分区。

  5. 在 Athena 控制台中运行 CREATE TABLE 语句。

  6. 使用 ALTER TABLE ADD PARTITION 命令加载分区,以便您可以查询它们,如以下示例所示。

    ALTER TABLE table_name ADD PARTITION (region='us-east-1', year='2019', month='02', day='01') LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'