如何使用 Amazon Athena 來分析 Amazon S3 伺服器存取日誌?
我想要在 Amazon Athena 中查詢 Amazon Simple Storage Service (Amazon S3) 伺服器存取日誌。
解決方法
Amazon S3 將伺服器存取日誌作為物件儲存在 S3 儲存貯體中。
先決條件:
對於儲存在 Amazon S3 儲存貯體中的日誌,請為 S3 結構定義以日期為基礎的分割。在下列解決方法範例中,資料表是分割的資料表,而分割的資料欄是時間戳記。對於您的 S3 位置,請包括要對應到時間戳記資料欄的資料夾結構 (/YYY/MM/DD)。
若要使用 Athena 分析 S3 查詢伺服器存取日誌,請完成下列步驟:
-
開啟 S3 儲存貯體的伺服器存取日誌 (如果您尚未開啟)。請注意目標儲存貯體和目標前綴的值。您需要這兩個值才能在 Athena 查詢中指定 Amazon S3 位置。
**注意:**對於日誌物件金鑰格式,請選擇以日期為基礎的分割,以加快分析和查詢應用程式的速度。 -
開啟 Amazon Athena 主控台。
**注意:**在執行第一個查詢之前,請在 Amazon S3 中設定查詢結果位置。 -
在查詢編輯器中,執行 DDL 陳述式以建立資料庫。
**注意:**最佳實務是在與 S3 儲存貯體相同的 AWS 區域中建立資料庫。create database s3_access_logs_db
-
在資料庫中建立資料表結構描述。在下列範例中,STRING 和 BIGINT 資料類型值是存取日誌屬性。您可以在 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}')
-
在左窗格的資料表下,選擇資料表名稱旁邊的省略符號,然後選擇預覽資料表。如果您在結果視窗中看到伺服器存取日誌中的資料,則表示您已成功建立 Athena 資料表。資料包含值,例如 bucketowner、bucket_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 為每筆查詢分析的資料量。
相關資訊
相關內容
- 已提問 10 個月前lg...
- 已提問 2 年前lg...
- 已提問 2 年前lg...
- AWS 官方已更新 1 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 4 年前