

# 使用手动分区在 Athena 中为 CloudTrail 日志创建表
<a name="create-cloudtrail-table"></a>

可以在 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 字段。

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

1. 修改 `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 查询时获得最高程度的灵活度。

1. 验证字段是否正确列出。有关 CloudTrail 记录中的完整字段列表的更多信息，请参阅 [CloudTrail 记录内容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

   步骤 1 中的示例 `CREATE TABLE` 语句使用 [Hive JSON SerDe](hive-json-serde.md)。在该示例中，字段 `requestparameters`、`responseelements` 和 `additionaleventdata` 作为查询中的 `STRING` 类型列出，但在 JSON 中使用 `STRUCT` 数据类型。因此，要将数据移出这些字段，请使用 `JSON_EXTRACT` 函数。有关更多信息，请参阅 [从字符串中提取 JSON 数据](extracting-data-from-JSON.md)。为了提高性能，此示例按 AWS 区域、年份、月份和日期对数据进行分区。

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

1. 使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 命令加载分区，以便您可以查询它们，如以下示例所示。

   ```
   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/'
   ```