Amazon S3 DeleteObjects API の結果が、CloudTrail証跡ログに記録されているのか試してみた

# はじめに

2025/6/12 にAWS CloudTrail（以下、CloudTrail 表記のみ）にアップデートがありました。

https://aws.amazon.com/about-aws/whats-new/2025/06/aws-cloudtrail-logging-amazon-s3-deleteobjects-api/

タイトルを直訳すると、Amazon S3 DeleteObjects API のロギングを強化したとのことです。

個人的に興味のあるアップデートでしたので、実際に試してみたことを書いていきます。

:::note info
本記事は、筆者個人の見解、個人利用の範囲で試した結果です。検証不十分な箇所もあると思いますので、参考程度に留めてください。内容に間違い等がありましたらご指摘いただけますと幸いです。
:::

# アップデート概要

これまでは、DeleteObjects API 呼び出しを使用して複数の S3 オブジェクトを削除すると、CloudTrail は DeleteObjects API 呼び出しを単一のイベントとしてログに記録し、呼び出したユーザと削除されたオブジェクトについては記録されていませんでした。今回の更新で、これらが記録されるようになりました。

# これまで本当に削除されたオブジェクトは記録されていなかったのか？

削除されたオブジェクト情報をログに記録しないなんてそんな…と思っていたのですが、そもそも、S3オブジェクトを削除する際のAPIは、

 - DeleteObject
 - DeleteObjects

の2種類あります。`DeleteObject`は単体のオブジェクトを削除する際に使うAPI、`DeleteObjects`が複数オブジェクトを削除する際に使うAPIです。`DeleteObject`では削除されたオブジェクトを記録していたようですが、`DeleteObjects`の方は削除されたオブジェクトを記録する仕様ではなかったようです。

# CloudTrail証跡への記録を試してみた

実際に、DeleteObject 及び DeleteObjects の実行を、CloudShell から試しみました。


### 今回の環境

:::note info
前提条件として、以下については割愛させていただきます。

 - S3バケットの作成手順
 - CloudTrailの証跡取得設定手順・証跡設定削除手順
 - Amazon Athena へのテーブル設定
:::

証跡取得用S3バケット（aws-cloudtrail-logs-trailtest2025061201）と、今回のテスト用S3バケット（s3deleteobjectapitest-2025061201）も作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/136d42b9-ac3b-49d2-b29b-6041484a8bd7.png)

CloudTrail証跡に管理イベントとデータイベントを記録するよう設定しました。なお、今回は検証のため、暗号化などは設定していません（検証が終わり次第、証跡記録は削除します）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/d53e3a1e-3555-497c-bfcc-8d2aa088b893.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/3ac645f1-eb5e-4c26-9910-00704839dbe6.png)

### オブジェクトの単体削除

AWS CLI を使って削除します。`s3 rm` と `s3api delete-object` でログ内容に違いが無いか、確認しました。

#### s3 rm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/7f7b6ace-27a8-42ed-ae94-84e884ed844f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/9bbf7541-a535-4c96-a852-ebf7e980f62c.png)

### s3api delete-object

`s3api delete-object`の方はコマンドに問題なければ、何も返さないようです。test2.txt は削除されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/32ca2616-546d-486c-a29b-91a47446ebb5.png)

#### Athena でログ確認

`s3 rm` で削除した test1.txt は、eventname が`DeleteObject`で記録されていました。ちなみに、`s3 rm` で削除したオブジェクトは、useragent列に`command#s3.rm`（以下図の赤枠）、`s3api delete-object`で削除したオブジェクトは、`command#s3api.delete-object`（以下図の青枠）と書かれていました。

※test1.txt を`s3 rm`と`s3api delete-object`で何度か削除したので、ログが見づらくなってしまい恐縮です。

![スクリーンショット 2025-06-17 001152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/5cd4381c-561f-4d93-bbe6-d0f90782c775.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/ed1d5951-ae25-4318-8cb6-e4c1b60089d9.png)

`s3api delete-object`で削除した test2.txt もeventname が`DeleteObject`で記録されていました。

![スクリーンショット 2025-06-16 002040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/7bccf585-b9fc-4d17-8b2e-6098d32e7f5f.png)

![スクリーンショット 2025-06-16 002102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/82b788be-07df-435b-af44-209a6d583285.png)


### オブジェクトの一括削除

AWS CLI から `s3api delete-objects` で一括削除した場合、マネジメントコンソールから一括削除した場合、2パターン実施しました。

#### マネジメントコンソールから一括削除

![スクリーンショット 2025-06-15 233309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/3a7fdd8c-209d-4e2d-81ab-f5fa3dfd8097.png)

![スクリーンショット 2025-06-15 233324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/da645a1d-6c43-442d-bf58-6a42ba4b102f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/1fc336c4-af94-4dcb-91de-30d1929752c2.png)

#### AWS CLI から削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/267443a4-53d4-4e79-8d14-307f11817ac7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/08b54995-0915-409f-9f6e-75a16c565e36.png)


#### Athena でログ確認

ログを確認したところ、`DeleteObjects`のログはありましたが、その行に削除されたファイルが書かれているのではなく、`DeleteObject`の実行結果が複数行に分かれて書かれていました。また、マネコンからの一括削除とAWS CLI からの一括削除で、ログの出方の違いは、useragent が違うくらいで、大きな差はありませんでした。

![スクリーンショット 2025-06-16 005930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/0696996b-1e83-4651-bdfb-db962b5f6b0b.png)

![スクリーンショット 2025-06-16 005808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/cd90db20-94b8-4138-851e-86fecb1483a1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/3d7a30f0-e5a3-4c3d-aaf0-7d8fd3d36cf6.png)

ちなみに、`DeleteObjects`に紐づく`DeleteObject`は、additionaleventdata列に"parentRequestID"が書かれており、それと紐づかれているように見受けられました。`DeleteObjects`の requestid列に同じ文字列がありました。実行時間（eventtime）も同じため、関連するイベントと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/e193c1c9-cbe5-4007-97b2-c2a59dd4970b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402789/868c1cc7-4f3b-4de7-94e6-56c53d8d08b9.png)


# 最後に

アップデート前の`DeleteObjects`のログ内容を見ることができれば、もっとしっくり来たのかもしませんが、それでも、オブジェクトが削除されたログを取得できるようになったのは良いアップデートだと思いました。また、ログからAPIがどう実行されたかも見ることができて、よい勉強になりました。

最後まで読んでいただき、ありがとうございました。