

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 大數據部落格文章[使用 和 Amazon Athena 分析安全性、合規性 AWS CloudTrail 和營運活動](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` 子句來傳回資料列的指定部分。