

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

# 使用手動分割在 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` 指標，使用 `LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/'` 來指定所有 `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/'
   ```