S3へのアクセスのログを取るには、CloudTrailを使う方法とS3サーバアクセスログを使う方法があります。
2つのログの比較は公式ドキュメントにも説明があります。
Amazon S3 でのログ記録 - Amazon Simple Storage Service
実際に両方のログを取ってみたのでサンプルを載せておきます。
CloudTrail S3オブジェクトレベルログ
CloudTrailでのログはJSONをgzで圧縮したものがS3に保存されます。
情報量が多いです。JSONですので項目名が書かれており、わかりやすいです。
S3サーバアクセスログと違って、イベントが発生したらすぐに保存されるようです。
{
"Records": [
{
"eventVersion": "1.07",
"userIdentity": {
"type": "IAMUser",
"principalId": "AIDAXXXXXXXXXXXXXXXXX",
"arn": "arn:aws:iam::XXXXXXXXXXXX:user/xxxxxxxx",
"accountId": "XXXXXXXXXXXX",
"accessKeyId": "AKIAXXXXXXXXXXXXXXXX",
"userName": "xxxxxxxx"
},
"eventTime": "2020-07-06T13:37:17Z",
"eventSource": "s3.amazonaws.com",
"eventName": "GetObject",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "172.XXX.XXX.XXX",
"userAgent": "[aws-cli/1.18.68 Python/3.8.1 Linux/4.15.0-1057-aws botocore/1.16.18]",
"requestParameters": {
"bucketName": "XXXXBUCKETNAMEXXXX",
"Host": "XXXXBUCKETNAMEXXXX.s3.ap-northeast-1.amazonaws.com",
"key": "test1.txt"
},
"responseElements": null,
"additionalEventData": {
"SignatureVersion": "SigV4",
"CipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
"bytesTransferredIn": 0,
"AuthenticationMethod": "AuthHeader",
"x-amz-id-2": "XXXXAMAZONREQUESTIDXXXX",
"bytesTransferredOut": 6
},
"requestID": "XXXXREQUESTIDXXXX",
"eventID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"readOnly": true,
"resources": [
{
"type": "AWS::S3::Object",
"ARN": "arn:aws:s3:::XXXXBUCKETNAMEXXXX/test1.txt"
},
{
"accountId": "XXXXXXXXXXXX",
"type": "AWS::S3::Bucket",
"ARN": "arn:aws:s3:::XXXXBUCKETNAMEXXXX"
}
],
"eventType": "AwsApiCall",
"managementEvent": false,
"recipientAccountId": "XXXXXXXXXXXX",
"vpcEndpointId": "vpce-xxxxxxxxxxxxxxxxx",
"eventCategory": "Data"
}
]
}
S3サーバアクセスログ
S3サーバアクセスログは、Apacheのログのように1リクエストで1行書き出されます。
ログには項目名がなく、値だけがスペース区切りで書かれるので、何が書かれているのか分かりづらいのですが、公式ドキュメントに説明があります。
Amazon S3 サーバーアクセスログの形式 - Amazon Simple Storage Service
S3にログが保存されるまでに少しタイムラグがあるようです。試したときは1時間半ぐらいかかりました。
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XXXXBUCKETNAMEXXXX [06/Jul/2020:13:37:17 +0000] 172.XXX.XXX.XXX arn:aws:iam::XXXXXXXXXXXX:user/xxxxxxxx XXXXREQUESTIDXXXX REST.GET.OBJECT test1.txt "GET /test1.txt HTTP/1.1" 200 - 6 6 12 11 "-" "aws-cli/1.18.68 Python/3.8.1 Linux/4.15.0-1057-aws botocore/1.16.18" - XXXXAMAZONREQUESTIDXXXX SigV4 ECDHE-RSA-AES128-GCM-SHA256 AuthHeader XXXXBUCKETNAMEXXXX.s3.ap-northeast-1.amazonaws.com TLSv1.2
1つ目の64文字の項目はバケット所有者の「正規ユーザーID」というものらしいです。