AWS SDK for Java1.xの利用状況をデータイベントOFFでも調べられるか試してみた

AWS SDK for Java1.xの利用状況をデータイベントOFFでも調べられるか試してみた

2026.06.17

こんにちは、せーのです。

今日は AWS SDK for Java 1.x のサポート終了通知をきっかけに、「CloudTrail の管理イベントだけでは見えない SDK 利用をどうやって洗い出すか」を実験してみた話を書いてみたいと思います。

想定読者とゴール

  • AWS Health から「AWS SDK for Java 1.x を使っているようです」と言われたが、CloudTrail の検索だけではスッキリしない方
  • CloudTrail の 管理イベントデータイベント の違いがなんとなく分かっているつもりだけど、「通知内容と手元のログのズレ」をうまく説明できない方

この記事を読み終わると、次のようなことが説明できるはずです。

  • data events を ON にすると aws-sdk-java/1. が CloudTrail に出てくる典型パターン
  • data events を 有効化していなかった期間 に、同じような利用があったかどうかを「別の証跡」から疑う・確認する方法
  • 「開発部門にソースを聞けばよい」で終わらせず、CloudTrail や既存ログで IAM ロールと API 種別 を絞り込んでから相談する、という流れ

ざっくり結論

先にざっくり結論を書いておきます。

まず、AWS SDK for Javaを使っているかどうかは、基本はCloudTrailを読んで、Athenaでクエリをかければ見つかります。

https://dev.classmethod.jp/articles/kiro-cli-investigate-sdk-java-1x-notification/

Java なんて使った記憶がない、という方は大抵が「AWS の別のサービスが内部で使っている」というパターンです。ただ、次のようなケースもあります。

  • CloudTrail の 管理イベント だけを見ていると、S3 や DynamoDB の「中身だけ触る」 Java アプリは、SDK 1.x を使っていても そもそも記録されていない 場合があります
  • data events を ON にすればそういった利用も CloudTrail に載りますが、過去分は増えません
  • data events を OFF のまま過去を振り返るには、API ごとに別の証跡が必要です
    • S3 なら Server Access Logs(既に有効なら User-Agent に aws-sdk-java/1. が出る)
    • それ以外は、最終的には ソース / dependency tree / 成果物 / アプリログ の棚卸しに戻る

この記事では、まず CloudTrail の管理イベント vs データイベントの違いと、「data events ON なら見えるパターン / OFF でも疑えるパターン」を表に整理します。そのうえで、実際に自分の検証環境で S3 だけ触る Java アプリ を動かしてみて、

  • data events を OFF にした状態では管理イベント側に何も出てこない
  • data events を ON にすると aws-sdk-java/1. が data events 側に出てくる

という挙動を確かめていきます。

CloudTrail の管理イベントとデータイベント (おさらい)

まずは用語を揃えておきます。

  • 管理イベント (management events):
    • 例: CreateBucket, ListBuckets, DescribeInstances, CreateLogStream など
    • デフォルトで CloudTrail に記録され、コンソールの Event history からも見えます
    • 「リソースの作成・設定・一覧」を表すことが多い
  • データイベント (data events):
    • 例: S3 GetObject / PutObject, Lambda Invoke, DynamoDB の item-level 操作 など
    • デフォルトでは 記録されません(「Logging data events」ドキュメントの通り、別途有効化が必要)
    • 「オブジェクトやレコードへの実アクセス」を表します

AWS 公式ドキュメントでは次のように整理されています。

違いをざっくり言うと、

管理イベントは「家を建てる・間取りを変える話」、データイベントは「建てた家の中で誰がどの部屋に出入りしたか」というイメージです。

Java SDK 1.x が S3 や DynamoDB の 中身だけ触っている 場合は、家の中の話なので、管理イベントだけを見ていると「そもそも記録されていなかった」ということが起こります。

data events ON / OFF で見えるもの・見えないもの

今回整理したいのは、「data events を ON にしたら見えるパターン」と、「OFF のままでも疑える・確認できるパターン」です。

実験と公式ドキュメント、過去の調査経験をもとに、ざっくり次のような表になりました。

# 利用パターン data events ON で見える eventName 管理イベント data events OFF で確認する方法 過去分
1 S3 オブジェクト読み書き GetObject, PutObject, DeleteObject 出ない ① S3 Server Access Logs(既に有効なら User-Agent に aws-sdk-java/1.) ② ソース / dependency tree ③ 成果物 jar の versionInfo.properties ④ アプリログ(SDK 1.12.767+ 警告) access logs 未設定なら 不可
2 DynamoDB アイテム操作 GetItem, PutItem, Query, Scan 出ない ① ソース / dependency ② 成果物 ③ アプリログ ④ DynamoDB には S3 access logs 相当なし 不可 (デフォルト)
3 Lambda Invoke Invoke(Lambda data events 設定時) 出ない ① 呼び出し元・被呼び出し Lambda のコード / zip ② CloudWatch Logs(実行ログ・SDK 警告) ③ X-Ray 等で依存関係を見る 不可
4 SQS / SNS SendMessage, ReceiveMessage, Publish 一部管理に出る場合あり ① キュー / トピック ARN と紐づくアプリを特定 ② ソース / 成果物 イベント種別次第
5 KMS 暗号化操作 Encrypt, Decrypt, GenerateDataKey 管理にも出る ① 管理イベント側も確認 ② Lambda ランタイム内部 (RetireGrant 等) は aws-internal 公式ログを参照
6 リソース作成・参照 CreateBucket, CreateLogStream, Describe* 出る 管理イベント Athena で足ります(既存記事の Chatbot パターン) Event history / CloudTrail ログで可
7 STS / IAM AssumeRole, GetCallerIdentity 出る 管理イベントで可。ただし「認証だけ SDK 1.x」で本体は別 SDK、というケースもあるので、ソース側の確認が必要

違いを整理すると、

data events ON で初めて見えるのは「オブジェクトやレコードへの実アクセス」系であり、OFF のまま過去の実行実績を追えるのは、その API に対応した 別ログ (S3 access logs など) が既にあった場合だけです。

それ以外のケースでは、「過去の実行実績」を諦めて、ソースコードや成果物の棚卸しで 利用有無そのもの を判断することになります。

実験メモ: 管理イベント側に見えた Java SDK 1.x

本題は「管理イベントに出ないのに data events で見える」パターンですが、その前提として「管理イベント側にちゃんと出ている」パターンも確認しておきます。

検証環境の CloudTrail では、次のような Athena クエリを実行しました。

SELECT
  eventtime,
  eventsource,
  eventname,
  useridentity.arn,
  useragent
FROM sdkv1_investigation.cloudtrail_logs_20260616
WHERE useragent LIKE '%aws-sdk-java/1.%'
  AND useragent NOT LIKE '%aws-internal/%'
ORDER BY eventtime DESC
LIMIT 20;

抜粋すると、次のような行が 1 件見つかりました。

eventtime              eventsource       eventname   arn                                                              useragent
---------------------  ----------------  ----------  ---------------------------------------------------------------  ---------------------------------------------------------------------------
2026-06-16T07:07:49Z  s3.amazonaws.com  ListBuckets arn:aws:sts::XXXXXXXXXXXX:assumed-role/cm-seino.tsuyoshi/...     [aws-sdk-java/1.12.788 Linux/... java/17.0.19 ...]
  • Java SDK 1.x (aws-sdk-java/1.12.788) からの ListBuckets 管理 API 呼び出し が、CloudTrail 管理イベントに普通に記録されています。
  • suzuki.ryo さんの記事で出てきた AWS Chatbot の CreateLogStream と同じ、「管理 API を呼んでいる SDK 利用」のパターンです。

この記事で扱いたいのは、むしろその逆のケース――つまり、

  • 通知は来ている
  • 管理イベント検索ではそれらしい aws-sdk-java/1. が全く出てこない

というパターンです。ここから先は「なぜそうなるのか」と「data events を ON / OFF それぞれで何ができるか」を見ていきます。

Step 1: 管理イベントで aws-sdk-java/1. を探す

まずは王道のパターンとして、CloudTrail の管理イベントから aws-sdk-java/1. の痕跡を探します。

Athena の例はこんな感じです。

SELECT
  useridentity.arn,
  sourceipaddress,
  eventsource,
  eventname,
  awsregion,
  useragent,
  eventtime
FROM cloudtrail_logs
WHERE useragent LIKE '%aws-sdk-java/1.%'
  AND useragent NOT LIKE '%aws-internal/%'
ORDER BY eventtime DESC
LIMIT 100;

集計版もあると、呼び出し元候補の整理がしやすくなります。

SELECT
  useridentity.arn,
  sourceipaddress,
  eventsource,
  eventname,
  regexp_extract(useragent, 'aws-sdk-java/([0-9.]+)', 1) AS sdk_version,
  min(eventtime) AS first_seen,
  max(eventtime) AS last_seen,
  count(*) AS calls
FROM cloudtrail_logs
WHERE useragent LIKE '%aws-sdk-java/1.%'
  AND useragent NOT LIKE '%aws-internal/%'
GROUP BY 1,2,3,4,5
ORDER BY last_seen DESC;

CloudTrail を CloudWatch Logs に配信している環境なら、短期間の調査は Logs Insights の方が手軽なこともあります。

fields userIdentity.type, userIdentity.arn, eventSource, awsRegion,
       eventName, eventType, eventTime, userAgent, sourceIPAddress
| filter userAgent like /aws-sdk-java\/1\./
| filter userAgent not like /aws-internal\//
| sort eventTime desc

スキャン量に応じて課金されるので、時間範囲は絞ってください。

ここでヒットした場合は、

  • userIdentity.arn から どの IAM ユーザー / ロールが呼んでいるか
  • eventSource / eventName から どのサービス・どの API か
  • sourceIPAddress から どこから呼ばれていそうか

を手がかりに、「どの実行基盤 (Lambda / ECS / EC2 / バッチサーバーなど)」なのかを絞り込んでいきます。

逆に まったくヒットしなかった 場合は、「使っていない」と言いたくなりますが、まだ早いです。ここからが本題です。

Step 2: data events を ON にしたら見えるパターンを疑う

管理イベント検索が 0 件だったときに、まず疑うべきなのは「そもそも管理イベントに載らない API だけを使っていないか」です。

典型的には、先ほどの表の #1 と #2 のパターンです。

  • S3 の GetObject / PutObject だけを叩くバッチ
  • DynamoDB の GetItem / Query だけを叩く Web API

こういったアプリは、リソース作成 (CreateBucket / CreateTable) などを一切行わず、データプレーンだけを触っていることがあります。その場合、

  • data events を ON にすれば GetObject / PutObject / GetItem などのイベントに aws-sdk-java/1. が見える
  • data events を OFF のままでは、CloudTrail にはそもそも何も残っていない

という状態になります。

data events を ON にするかどうかはコストとの相談ですが、少なくとも「なぜ管理イベント検索が 0 件でも通知が来るのか」の説明には、このパターンを押さえておく必要があります。

Step 3: data events OFF のまま疑える・確認できるもの

では、data events を有効化していなかった期間について、「それでも何かできないか」を見ていきます。

S3: Server Access Logs があれば勝ち筋がある

S3 については、CloudTrail data events とは別に Server Access Logs という仕組みがあります。

  • 既に access logs を吐き出しているバケットがあれば、過去分を含めて S3 リクエストの User-Agent を確認できます
  • Athena でテーブルを作っておけば、次のようなクエリで aws-sdk-java/1. を探せます
SELECT
  requester,
  remoteip,
  operation,
  key,
  requestdatetime,
  useragent,
  count(*) AS calls
FROM s3_access_logs
WHERE useragent LIKE '%aws-sdk-java/1.%'
GROUP BY 1,2,3,4,5,6
ORDER BY requestdatetime DESC;

これでヒットすれば、

  • どのバケット / プレフィックスに対して
  • どのクライアント (IP や IAM ロール) から
  • どのくらいの頻度で

SDK 1.x のリクエストが飛んでいるかを把握できます。

それ以外のサービス: ログがなければ諦めて棚卸しへ

一方で、DynamoDB や Lambda Invoke などについては、S3 access logs に相当する「外付けのサーバーアクセスログ」がありません。

  • data events OFF 期間については、実際にどのくらい呼ばれていたか を後から復元することはできません
  • できるのは、「ソース / dependency / 成果物 / アプリログ」の棚卸しで「SDK 1.x を含んだデプロイ物がどこかに残っていないか」を見ることだけです

ここは少しモヤッとするところですが、「実行実績」と「利用有無」を分けて考えるしかありません。

Step 4: ソース / 依存関係 / 成果物 / ログの棚卸し

CloudTrail だけでは足りないので、あとは地道な棚卸しです。CloudTrail で IAM ロールと API 種別 が分かったあと、どのコードやデプロイ物に SDK 1.x が残っているかを突き合わせる、という流れになります。

ソースコードを検索する

リポジトリが手元にあるなら、まずは全文検索からです。

rg "import com.amazonaws" .
rg "aws-java-sdk" .
rg "<groupId>com.amazonaws</groupId>" .

rg がなければ grep -R でも構いません。

grep -R "import com.amazonaws" .
grep -R "aws-java-sdk" .
grep -R "<groupId>com.amazonaws</groupId>" .

com.amazonaws は Java SDK 1.x の重要な手がかりです。ただし aws-lambda-java-core のように、SDK 本体ではないライブラリも同じプレフィックスを使います。ヒットしたら artifactId が aws-java-sdk-* かどうかまで確認してください。

Maven / Gradle の依存関係を見る

ソースに直接書いていなくても、推移依存で SDK 1.x が入っていることがあります。

Maven:

mvn dependency:tree -Dincludes=com.amazonaws

Gradle:

./gradlew dependencies --configuration runtimeClasspath | grep "com.amazonaws"

見たい出力例はこんな感じです。

com.amazonaws:aws-java-sdk-s3:jar:1.12.746:compile
com.amazonaws:aws-java-sdk-core:jar:1.12.746:compile

直接依存 (direct dependency) なのか、別ライブラリ経由の推移依存 (transitive dependency) なのかを分けて見ます。推移依存の場合は、親ライブラリの更新や exclude 設定を検討することになります。

JAR / WAR / EAR / Lambda zip を検査する

ソースが古い・失われている・本番だけ別成果物、というケースでは、デプロイ済みの成果物を見る方が早いこともあります。

uber-jar:

jar -tf myapp.jar | grep 'com/amazonaws/sdk/versionInfo.properties'
unzip -p myapp.jar com/amazonaws/sdk/versionInfo.properties

Lambda zip:

unzip -l function.zip | grep 'aws-java-sdk'
unzip -l function.zip | grep 'com/amazonaws/sdk/versionInfo.properties'

WAR:

unzip -l app.war | grep 'WEB-INF/lib/.*aws-java-sdk'

versionInfo.properties が見つかれば、中身でバージョンまで確認できます。

platform=java
version=1.12.xxx

ソースがなくても成果物から SDK 1.x を見つけられる、というのがポイントです。WAR や Lambda zip では WEB-INF/lib/lib/ 配下にネスト JAR があるので、トップレベルだけ grep して見落とさないように注意してください。

コンテナイメージを検査する

ECS / EKS / EC2 上でコンテナを動かしている場合は、実際に動いているイメージを見るのが速いです。

docker pull example/myapp:latest
docker run --rm --entrypoint sh example/myapp:latest -c \
  "find / -name '*aws-java-sdk*.jar' 2>/dev/null | head -100"

JAR の中まで見る例:

docker run --rm --entrypoint sh example/myapp:latest -c \
  "find / -name '*.jar' 2>/dev/null | xargs -I{} sh -c 'unzip -l \"{}\" 2>/dev/null | grep -q \"com/amazonaws/sdk/versionInfo.properties\" && echo \"{}\"'"

本番イメージを pull する権限がない場合は、CI の成果物や SBOM があればそちらを確認します。

アプリログを検索する

SDK 1.12.767 以降は、起動時に次のような非推奨警告を出します。

The AWS SDK for Java 1.x is no longer supported

ローカルログ:

grep -R "The AWS SDK for Java 1.x" /var/log/myapp/

CloudWatch Logs Insights:

fields @timestamp, @logStream, @message
| filter @message like /The AWS SDK for Java 1.x/
| sort @timestamp desc

あくまで「あればラッキー」な補助線です。古い SDK では警告が出ないので、ヒットしなかったから未使用、とは言えません。

状況別の判断表

ここまでの調査結果を、次の表で整理すると迷いにくいです。

状況 次に見るもの
CloudTrail 管理イベントに aws-sdk-java/1. あり userIdentity, sourceIPAddress, eventSource, eventName で実行元候補を絞る
管理イベントにない データイベント未取得の可能性。ソース / 依存 / 成果物 / ログへ進む
ソースに aws-java-sdk-* あり 直接依存。移行計画を立てる
dependency tree にだけある 推移依存。親ライブラリ更新または exclude を検討
成果物に versionInfo.properties あり デプロイ物に SDK 1.x 同梱。実行環境を特定する
アプリログに警告あり 起動しているアプリが SDK 1.x を使っている
どこにもない 期間外、別アカウント / リージョン、AWS サービス / 3rd party 製品、過去デプロイ物を疑う

Step 5: data events を ON にするかどうか

ここまでで、

  • 管理イベントだけ見ていると見落とすパターン
  • data events OFF でも、S3 access logs や棚卸しでできること・できないこと

を整理しました。最後に、「じゃあ data events を ON にするかどうか」の話です。

範囲と期間を決める

CloudTrail data events はイベント数ベースで課金されます。2026-06-16 時点の CloudTrail Pricing では、

  • $0.10 / 100,000 events

という料金です。高頻度な S3 / DynamoDB / Lambda を全アカウント・全リージョンで一気に有効化すると、請求が膨らみやすいです。

調査目的であれば、次のように 範囲と期間を決めて 有効化するのが現実的だと感じています。

  • 通知に書かれている Affected region だけ
  • SDK 1.x の疑いがある S3 バケットだけ
  • GetObject / PutObject など必要な API だけ
  • まずは 1 業務サイクル (1〜2 週間) だけ
  • 調査後に無効化するか、恒久監査方針に移すか決める

特定 S3 バケットの GetObject / PutObject だけを観測する、という考え方の例です。

[
  {
    "Name": "Investigate specific S3 object access",
    "FieldSelectors": [
      { "Field": "eventCategory", "Equals": ["Data"] },
      { "Field": "resources.type", "Equals": ["AWS::S3::Object"] },
      { "Field": "eventName", "Equals": ["GetObject", "PutObject"] },
      { "Field": "resources.ARN", "StartsWith": ["arn:aws:s3:::example-bucket/"] }
    ]
  }
]

本番 trail に selector を足す前に、対象リソース・Read/Write のどちらが必要か・期間・費用感を必ず確認してください。

コストの目安

調査前にざっくり試算しておくと、関係者への説明がしやすくなります。以下は概算です(Athena $5/TB、CloudWatch Logs 配信 $0.25/GB も含む)。

項目 概算
CloudTrail data events 10 万 events/day × 30 日 約 $3
CloudTrail data events 100 万 events/day × 30 日 約 $30
Athena 検索 20 GB を 10 回スキャン 約 $0.98
CloudWatch Logs 配信 20 GB 配信 約 $5

S3 保存料やリージョン差は別途かかります。高トラフィックバケットで Read/Write 両方を無期限に ON にするのは、調査目的としては避けた方が無難です。

data events で見えたらどうするか

data events を限定的に ON にした結果、

  • GetObject / PutObject / Invoke などの data events に aws-sdk-java/1. が出てきた

のであれば、

  1. userIdentity.arn / sourceIPAddress / eventSource / eventName から、実行基盤 (Lambda / ECS / バッチサーバー等) を特定
  2. その実行基盤に対応するリポジトリや成果物を棚卸し
  3. どのアプリ / ライブラリが SDK 1.x に依存しているかを一覧にする

という流れで、移行計画を立てていくことになります。

まとめ

改めて整理すると、今回のポイントは次の 3 つです。

  • CloudTrail の管理イベントだけを見ていると、S3 や DynamoDB の中身だけ触る Java アプリ は SDK 1.x を使っていても「そもそも記録されていない」ことがある
  • data events を ON にすればそういった利用も見えるが、過去分は増えない。S3 に限っては Server Access Logs が「後追い用の救済策」になり得るが、それ以外はコードと成果物の棚卸しに戻る
  • 「開発部門に聞く」の前に、CloudTrail や既存ログで IAM ロールと API 種別 を絞り込んでおくと、「どのアプリをいつまでにどう直すか」という話がだいぶ建設的になる

AWS Health から SDK 1.x の通知が来たときに、「CloudTrail の管理イベントを aws-sdk-java/1. で検索してヒットしなかったから未使用です」とは、もう言えません。

代わりに、

「管理イベント側には出ていませんでしたが、S3 の data events / access logs / ソース / 成果物 / ログを組み合わせて、これこれこういう範囲には SDK 1.x が残っていそうです」

と説明できるようになっていれば、ひとまずは十分かな、と思っています。どうぞ参考にしてみてください。

この記事をシェアする

関連記事