使用手动分区在 Athena 中为 CloudTrail 日志创建表
可以在 Athena 控制台中为 CloudTrail 日志文件手动创建表,然后在 Athena 中运行查询。
使用 Athena 控制台为 CloudTrail 跟踪记录创建 Athena 表
-
将以下 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 字段。 -
(可选)删除表格中所有非必填字段。如果您只需要读取一组特定的列,则您的表定义可以排除其他列。
-
修改
s3://amzn-s3-demo-bucket/AWSLogs/
以指向包含要查询的日志数据的 Amazon S3 存储桶。该示例使用特定账户的日志的Account_ID
/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 查询时获得最高程度的灵活度。
-
-
验证字段是否正确列出。有关 CloudTrail 记录中的完整字段列表的更多信息,请参阅 CloudTrail 记录内容。
步骤 1 中的示例
CREATE TABLE
语句使用 Hive JSON SerDe。在该示例中,字段requestparameters
、responseelements
和additionaleventdata
作为查询中的STRING
类型列出,但在 JSON 中使用STRUCT
数据类型。因此,要将数据移出这些字段,请使用JSON_EXTRACT
函数。有关更多信息,请参阅 从字符串中提取 JSON 数据。为了提高性能,此示例按 AWS 区域、年份、月份和日期对数据进行分区。 -
在 Athena 控制台中运行
CREATE TABLE
语句。 -
使用 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/
'