はじめに
猫とアポロチョコが好きな、アノテーション株式会社の m.hayakawa です。
本記事はAWS CLI を用いて S3 サーバーアクセスログを有効化してみた | DevelopersIOの続きの記事となります。
S3 サーバーアクセスログに関する検証を行うことが多いのですが、Athena でクエリをする際に毎回やり方を忘れてしまうため、手順を記事化します。
同じことに困っている方の一助になれば幸いです。
前提条件
ログ保存先の S3 バケット:logging-bucket-test0123
やってみた
クエリの結果の場所を指定
クエリエディタを開きます。
下記の画面が出た場合、クエリの結果の場所を指定されていないため、設定が必要です。
設定を編集 ボタンを押下し、Location of query result に任意の S3 バケットを指定し、保存ボタン を押下します。
Athena のデータベースとテーブルを作成する
データベースを作成するために、下記のクエリを実行します。
create database s3_access_logs_db
続いて、テーブルを作成するために、下記のクエリを実行します。
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)
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://logging-bucket-test0123/source-bucket-test0123/'
ちなみに、データベース名とテーブル名を ` で囲まないと下記のエラーが出てハマります。私はハマりました。
line 1:8: mismatched input 'EXTERNAL'. Expecting: 'MATERIALIZED', 'MULTI', 'OR', 'PROTECTED', 'ROLE', 'SCHEMA', 'TABLE', 'VIEW'
クエリを投げてみる
ひとまず直近の 10 件のログを見てみます。
SELECT * FROM "logging-bucket-test0123_logs" limit 10;
"bucketowner","bucket_name","requestdatetime","remoteip","requester","requestid","operation","key","request_uri","httpstatus","errorcode","bytessent","objectsize","totaltime","turnaroundtime","referrer","useragent","versionid","hostid","sigv","ciphersuite","authtype","endpoint","tlsversion"
"MASK","source-bucket-test0123","30/Jun/2024:04:17:24 +0000","-","arn:aws:sts::<AccountID>:assumed-role/AWSServiceRoleForTrustedAdvisor/TrustedAdvisor_<AccountID>_698bb03f-6b68-4ffd-abac-c320e7a80f28","CMPXWYFZNRSAMPLE","REST.GET.LOCATION","-","""GET /source-bucket-test0123?location HTTP/1.1""","200","-","142",,"4","-","""-""","""-""","-","Masked","SigV4","TLS_AES_128_GCM_SHA256","AuthHeader","s3.ca-central-1.amazonaws.com","TLSv1.3"
<後略>
Trusted Advisor から何かアクセスされていることが確認できました。オブジェクトを S3 に配置するだけでも、AWS サービス上から何かしらのアクセスは発生しているようです。
前回のブログでオブジェクトをバケットへコピーしたので、その記録を確認してみます。operation が REST.PUT.OBJECT である記録をクエリします。
SELECT * FROM "mybucket_logs"
WHERE operation='REST.PUT.OBJECT'
"bucketowner","bucket_name","requestdatetime","remoteip","requester","requestid","operation","key","request_uri","httpstatus","errorcode","bytessent","objectsize","totaltime","turnaroundtime","referrer","useragent","versionid","hostid","sigv","ciphersuite","authtype","endpoint","tlsversion"
"MASKED","source-bucket-test0123","25/Jun/2024:02:40:06 +0000","<IP Address>","arn:aws:sts::<AccountID>:assumed-role/<IAMRole>/<SessionName>","91J7WDK3KQSAMPLE","REST.PUT.OBJECT","sample.txt","""PUT /sample.txt HTTP/1.1""","200","-",,"6","40","20","""-""","""aws-cli/2.16.11 md/awscrt#0.20.11 ua/2.0 os/linux#6.1.92-99.174.amzn2023.x86_64 md/arch#x86_64 lang/python#3.11.8 md/pyimpl#CPython exec-env/CloudShell cfg/retry-mode#standard md/installer#exe md/distrib#amzn.2023 md/prompt#off md/command#s3.cp""","-","MASKED","SigV4","TLS_AES_128_GCM_SHA256","AuthHeader","source-bucket-test0123.s3.ap-northeast-1.amazonaws.com","TLSv1.3"
当該の記録を確認できました!
参考資料
Getting started - Amazon Athena
Amazon S3 アクセスログを使用したリクエストの識別 - Amazon Simple Storage Service