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

3 分的閱讀內容
0

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

解決方法

Amazon S3 將伺服器存取日誌作為物件儲存在 S3 儲存貯體中。請遵循下列步驟使用 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

現在,您可以查詢 Amazon S3 伺服器存取日誌。

查詢範例

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

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 服務日誌

AWS 官方
AWS 官方已更新 3 個月前