如何使用 Amazon Athena 來分析 Amazon S3 伺服器存取日誌?

3 分的閱讀內容
0

我想要在 Amazon Athena 中查詢 Amazon Simple Storage Service (Amazon S3) 伺服器存取日誌。

解決方法

Amazon S3 將伺服器存取日誌作為物件儲存在 S3 儲存貯體中。

先決條件:

對於儲存在 Amazon S3 儲存貯體中的日誌,請為 S3 結構定義以日期為基礎的分割。在下列解決方法範例中,資料表是分割的資料表,而分割的資料欄是時間戳記。對於您的 S3 位置,請包括要對應到時間戳記資料欄的資料夾結構 (/YYY/MM/DD)。

若要使用 Athena 分析 S3 查詢伺服器存取日誌,請完成下列步驟:

  1. 開啟 S3 儲存貯體的伺服器存取日誌 (如果您尚未開啟)。請注意目標儲存貯體目標前綴的值。您需要這兩個值才能在 Athena 查詢中指定 Amazon S3 位置。
    **注意:**對於日誌物件金鑰格式,請選擇以日期為基礎的分割,以加快分析和查詢應用程式的速度。

  2. 開啟 Amazon Athena 主控台
    **注意:**在執行第一個查詢之前,請在 Amazon S3 中設定查詢結果位置

  3. 查詢編輯器中,執行 DDL 陳述式以建立資料庫
    **注意:**最佳實務是在與 S3 儲存貯體相同的 AWS 區域中建立資料庫。

    create database s3_access_logs_db
  4. 在資料庫中建立資料表結構描述。在下列範例中,STRINGBIGINT 資料類型值是存取日誌屬性。您可以在 Athena 中查詢這些屬性。在 LOCATION 中,輸入步驟 1 的 S3 儲存貯體和字首路徑。請務必在字首結尾加上正斜線 (/) (例如,s3://doc-example-bucket/prefix/)。如果您未使用字首,則請在儲存貯體名稱的結尾加上正斜線 (/) (例如,s3://doc-example-bucket/)。

    CREATE EXTERNAL TABLE s3_access_logs_db.mybucket_logs( `bucketowner` STRING,
     `bucket_name` STRING,
     `requestdatetime` STRING,
     `remoteip` STRING,
     `requester` STRING,
     `requestid` STRING,
     `operation` STRING,
     `key` STRING,
     `request_uri` STRING,
     `httpstatus` STRING,
     `errorcode` STRING,
     `bytessent` BIGINT,
     `objectsize` BIGINT,
     `totaltime` STRING,
     `turnaroundtime` STRING,
     `referrer` STRING,
     `useragent` STRING,
     `versionid` STRING,
     `hostid` STRING,
     `sigv` STRING,
     `ciphersuite` STRING,
     `authtype` STRING,
     `endpoint` STRING,
     `tlsversion` STRING,
     `accesspointarn` STRING,
     `aclrequired` STRING)
     PARTITIONED BY (
       `timestamp` string)
    ROW FORMAT SERDE
     'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
     'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$')
    STORED AS INPUTFORMAT
     'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION
     's3://bucket-name/prefix-name/account-id/region/source-bucket-name/'
     TBLPROPERTIES (
      'projection.enabled'='true',
      'projection.timestamp.format'='yyyy/MM/dd',
      'projection.timestamp.interval'='1',
      'projection.timestamp.interval.unit'='DAYS',
      'projection.timestamp.range'='2024/01/01,NOW',
      'projection.timestamp.type'='date',
      'storage.location.template'='s3://bucket-name/prefix-name/account-id/region/source-bucket-name/${timestamp}')
  5. 在左窗格的資料表下,選擇資料表名稱旁邊的省略符號,然後選擇預覽資料表。如果您在結果視窗中看到伺服器存取日誌中的資料,則表示您已成功建立 Athena 資料表。資料包含值,例如 bucketownerbucket_name,以及 requestdatetime

查詢範例

若要尋找已刪除物件的請求,請使用下列查詢:

SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE key = 'images/picture.jpg'
AND operation like '%DELETE%';

若要顯示導致 403 存取遭拒錯誤的請求的 Amazon S3 請求 ID,請使用下列查詢:

SELECT requestdatetime, requester, operation, requestid, hostid
FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus = '403';

若要尋找特定時段內 HTTP 5xx 錯誤的 Amazon S3 請求 ID (包括金鑰和錯誤碼),請執行下列查詢:

SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid
FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus like '5%'AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要顯示刪除物件的人員和時間 (包括時間戳記、IP 地址和 AWS Identity and Access Management (IAM) 角色),請使用下列查詢:

SELECT requestdatetime, remoteip, requester, key
FROM s3_access_logs_db.mybucket_logs
WHERE key = 'images/picture.jpg'
AND operation like '%DELETE%';

若要顯示 IAM 角色執行的所有操作,請使用以下查詢:

SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE requester='arn:aws:iam::123456789123:user/user_name';

若要顯示在特定時段內對物件執行的所有操作,請使用下列查詢:

SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE Key='prefix/images/picture.jpg'  
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要顯示在特定時段內傳輸到 IP 地址的資料量,請使用下列查詢:

SELECT coalesce(SUM(bytessent), 0) AS bytessentTOTAL
FROM s3_access_logs_db.mybucket_logs
WHERE RemoteIP='1.2.3.4'AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要顯示生命週期規則在特定時段內執行的所有到期操作,請使用以下查詢:

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT' AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要計算在特定時段內到期的物件數目,請使用下列查詢:

SELECT count(*) as ExpireCount
FROM s3_access_logs_db.mybucket_logs
WHERE operation = 'S3.EXPIRE.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要顯示生命週期規則在特定時段內執行的所有轉換操作,請使用以下查詢:

SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE operation like 'S3.TRANSITION%'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要顯示依簽章版本分組的所有請求者,請使用下列查詢:

SELECT requester, Sigv, Count(Sigv) as SigCount
FROM s3_access_logs_db.mybucket_logs
GROUP BY requester, Sigv;

若要顯示在特定時段內提出請求的所有匿名請求者,請使用下列查詢:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE requester IS NULL AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要顯示在特定時段內傳送 PUT 物件請求的所有請求者,請使用下列查詢:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.PUT.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要顯示在特定時段內傳送 GET 物件請求的所有請求者,請使用下列查詢:

SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.GET.OBJECT'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'

若要顯示在特定時段內最高周轉時間所排序的所有請求者,請使用下列查詢:

SELECT * FROM s3_access_logs_db.mybucket_logs
WHERE NOT turnaroundtime='-'
AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'
ORDER BY CAST(turnaroundtime AS INT) DESC;

**注意:**由於 S3 儲存貯體內的物件數目會隨著時間而增加,因此查詢將會隨著時間處理更多資料。最佳實務是為伺服器存取日誌儲存貯體建立生命週期政策。設定生命週期政策,以定期移除日誌檔案。此政策可減少 Athena 為每筆查詢分析的資料量。

相關資訊

使用 Amazon OpenSearch Service 分析 Amazon S3 伺服器存取日誌

Amazon S3 伺服器存取日誌格式

查詢 AWS 服務日誌

使用 Amazon Athena 查詢請求的存取日誌

考量事項和限制

AWS 官方
AWS 官方已更新 1 年前