

# CloudTrail 日志查询示例
<a name="query-examples-cloudtrail-logs"></a>

以下示例显示从在 CloudTrail 事件日志创建的表，返回所有匿名（未签名）请求的查询部分。此查询选择 `useridentity.accountid` 匿名并且 `useridentity.arn` 未指定的那些请求：

```
SELECT *
FROM cloudtrail_logs
WHERE 
    eventsource = 's3.amazonaws.com' AND 
    eventname in ('GetObject') AND 
    useridentity.accountid = 'anonymous' AND 
    useridentity.arn IS NULL AND
    requestparameters LIKE '%[your bucket name ]%';
```

有关更多信息，请参阅 AWS 大数据博客文章：[使用 AWS CloudTrail 和 Amazon Athena 分析安全性、合规性和运营活动](https://aws.amazon.com/blogs/big-data/aws-cloudtrail-and-amazon-athena-dive-deep-to-analyze-security-compliance-and-operational-activity/)。

## 查询 CloudTrail 日志中的嵌套字段
<a name="cloudtrail-logs-nested-fields"></a>

由于 `userIdentity` 和 `resources` 字段是嵌套的数据类型，查询这些内容需要特殊处理。

`userIdentity` 对象由嵌套 `STRUCT` 类型组成。可以使用点分隔字段以分隔待查询的字段，如下例所示：

```
SELECT 
    eventsource, 
    eventname,
    useridentity.sessioncontext.attributes.creationdate,
    useridentity.sessioncontext.sessionissuer.arn
FROM cloudtrail_logs
WHERE useridentity.sessioncontext.sessionissuer.arn IS NOT NULL
ORDER BY eventsource, eventname
LIMIT 10
```

`resources` 字段是一个 `STRUCT` 对象数组。对于这些数组，请使用 `CROSS JOIN UNNEST` 来取消嵌套数组，以便您可以查询其对象。

下面的示例将返回资源 ARN 以 `example/datafile.txt` 结尾的所有行。为了便于读取，[replace](https://prestodb.io/docs/current/functions/string.html#replace) 函数将从 ARN 中删除初始 `arn:aws:s3:::` 子字符串。

```
SELECT 
    awsregion,
    replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as s3_resource,
    eventname,
    eventtime,
    useragent
FROM cloudtrail_logs t
CROSS JOIN UNNEST(t.resources) unnested (resources_entry)
WHERE unnested.resources_entry.ARN LIKE '%example/datafile.txt'
ORDER BY eventtime
```

以下是 `DeleteBucket` 事件的示例查询。查询将从 `resources` 对象中提取存储桶的名称以及存储桶所属的账户 ID。

```
SELECT 
    awsregion,
    replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as deleted_bucket,
    eventtime AS time_deleted,
    useridentity.username, 
    unnested.resources_entry.accountid as bucket_acct_id 
FROM cloudtrail_logs t
CROSS JOIN UNNEST(t.resources) unnested (resources_entry)
WHERE eventname = 'DeleteBucket'
ORDER BY eventtime
```

有关取消嵌套的更多信息，请参阅 [筛选数组](filtering-arrays.md)。

## 有关查询 CloudTrail 日志的提示
<a name="tips-for-querying-cloudtrail-logs"></a>

在探索 CloudTrail 日志数据时考虑以下各项：
+ 在查询日志之前，请验证您的日志表是否看似与[使用手动分区在 Athena 中为 CloudTrail 日志创建表](create-cloudtrail-table.md)中的表一样。如果不是第一个表，请使用以下命令删除现有表：`DROP TABLE cloudtrail_logs`。
+ 删除现有表后，重新创建它。有关更多信息，请参阅 [使用手动分区在 Athena 中为 CloudTrail 日志创建表](create-cloudtrail-table.md)。

  确认正确列出了 Athena 查询中的字段。有关 CloudTrail 记录中的完整字段列表的信息，请参阅 [CloudTrail 记录内容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

  如果您的查询包含 JSON 格式的字段，例如 `STRUCT`，请从 JSON 中提取数据。有关更多信息，请参阅 [从字符串中提取 JSON 数据](extracting-data-from-JSON.md)。

  关于针对 CloudTrail 表发布查询的一些建议如下：
+ 首先查看哪些用户调用了哪些 API 操作以及来自哪些源 IP 地址。
+ 将以下基本 SQL 查询用作您的模板。将查询粘贴到 Athena 控制台并运行它。

  ```
  SELECT
   useridentity.arn,
   eventname,
   sourceipaddress,
   eventtime
  FROM cloudtrail_logs
  LIMIT 100;
  ```
+ 修改查询以进一步探索您的数据。
+ 为了提高性能，请包含 `LIMIT` 子句以返回指定的行子集。