Amazon GuardDuty Investigationをイベントドリブンで使えるか確認してみたけど使えなかった
こんにちは、臼田です。
みなさん、AWSのインシデント調査してますか?(挨拶
先日Amazon GuardDutyにInvestigation機能がプレビューで追加されました。
こちら、調査の開始は明示的にこちらから実行する必要があるため、上手く自動で実行したりイベントを自動で取れないかな?と考えて動作確認をしました。
タイトルの通り自動でイベントは取れなかったのでどうやればいいかというところ含めまとめます。
概要
Amazon GuardDuty Investigationは検出した脅威などの追加調査ができる機能です。
従来Amazon GuardDutyはAWS上の様々なアクティビティから脅威を検出してくれますが、その脅威の前後どのような操作がされていたかや、対象リソースの関連情報取得など、影響の判断や対応をしていくための追加情報の収集がぼちぼち必要であったりしました。
まだプレビューですがAmazon GuardDuty Investigationは1つのFindings、あるいは1AWSアカウント、あるいはAWS Organizations全体にまたがって調査し、AIも活用しながら各種追加調査を実施して、どうなっているか・どう対応すべきかをまとめてくれる良いやつです!
今後正式リリースされる際にもっと便利になる可能性がありますが、まだプレビューですので色々試した結果をまとめていきます。(AWSへのフィードバックもするよ
やりたいこと
上述の通りで、現状のAmazon GuardDuty Investigationによる調査は手動で実行を開始する必要があります。
例えば常にFindingsが検出されたら調査も行う、としたり、調査結果が出たらSlackで通知する、とかもやりたいですよね。
というわけでまず今回Amazon EventBridgeでイベントが出るのか?というところから調査してみました。
イベントは出ない
Amazon GuardDutyでは脅威の検出があると"detail-type": "GuardDuty Finding"イベントがAmazon EventBridgeから発行されます。詳細はこちらのユーザーガイド。
Amazon GuardDuty Investigationの調査など、Amazon GuardDutyとして追加のイベント発行があるかを、まず確認してみました。
通常下記のようにイベントルールを設定して検出を通知します。

今回はすべてのAmazon GuardDutyのイベントが通知されるように変更しました。調査にかかわらずいろんなアクションが通知されるのでちょっとした検証の時だけの諸刃の剣設定です。

結果、AwsApiCallとして以下のようにCreateInvestigation自体の実行は取得できました。
{
"version": "0",
"id": "00000000-0000-0000-0000-000000000000",
"detail-type": "AWS API Call via CloudTrail",
"source": "aws.guardduty",
"account": "123456789012",
"time": "2026-07-07T01:58:24Z",
"region": "ap-northeast-1",
"resources": [],
"detail": {
"eventVersion": "1.09",
"userIdentity": {
"…省略…"
},
"eventTime": "2026-07-07T01:58:24Z",
"eventSource": "guardduty.amazonaws.com",
"eventName": "CreateInvestigation",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "203.0.113.10",
"userAgent": "Boto3/1.43.41 md/Botocore#1.43.41 ua/2.1 os/linux lang/python#3.13.13 exec-env/CloudShell Botocore/1.43.41",
"requestParameters": {
"triggerPrompt": "Investigate account 123456789012",
"detectorId": "1111111111111111111111111111111",
"clientToken": "00000000-0000-0000-0000-000000000000"
},
"responseElements": {
"investigationId": "22222222-2222-2222-2222-222222222222"
},
"requestID": "33333333-3333-3333-3333-333333333333",
"eventID": "44444444-4444-4444-4444-444444444444",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"eventCategory": "Management",
"sessionCredentialFromConsole": "true"
}
}
しかし、これ以外のイベントは発行されませんでした。つまり以下のとおりです。
- Amazon GuardDuty Investigation関連のイベントタイプはない
- Amazon GuardDuty Investigationの調査が完了しても受動的に検出できない
というわけで、イベントは出ないので、明示的に取りに行く必要があります。
スクリプトで調査を実行して結果を取りに行く
どのみちFindingsのイベントが出てから、調査を明示的にトリガーする必要もありますので、そこから結果を取得するところまでを一連の処理にしてあげるのが今のところは良さそうです。
下記記事にてAWS CLIでの調査について記載がありますので、本記事ではPythonでやってみます。
コードはboto3のcreate_investigationなどを参考にしてください。
ざっくり以下のようなスクリプトで行けました。
import time
import boto3
ACCOUNT_ID = "902096752875"
client = boto3.client("guardduty")
detector_id = client.list_detectors()["DetectorIds"][0]
investigation_id = client.create_investigation(
DetectorId=detector_id,
TriggerPrompt=f"Investigate account {ACCOUNT_ID}",
)["InvestigationId"]
while True:
resp = client.get_investigation(
DetectorId=detector_id,
InvestigationId=investigation_id,
)
investigation = resp["Investigation"]
status = investigation["Status"]
print(status)
if status in ("COMPLETED", "FAILED"):
break
time.sleep(15)
print(investigation.get("RiskLevel"))
print(investigation.get("Confidence"))
print(investigation.get("Summary"))
いくつかポイントを紹介します。
上述のAWS CLIの記事にもありますが、画面上と違ってAPIからの調査ではFindingsやAWSアカウントをただ指定するのではなく、TriggerPromptパラメータに自然言語でそれらを含めた指示を入れる形で調査を行います。
実に生成AIな感じですね。
なので、それを簡易的に組み上げています。逆に明示的なパラメータじゃないのでなんだか扱いづらいので注意ポイントでもあります。
また、調査の状態はget_investigationでresponse["Investigation"]["Status"]にあり、完了しているかどうかはここが"COMPLETED"か"FAILED"のどちらかになるまで待っていれば良さそうです。
ちなみに調査結果は、生成AIらしく同じプロンプトでも結構ブレがある感じで、タイトルからこんな感じで違いました。

中身もぼちぼち変わるので、実際の調査でどの程度安定して良い内容が出力されるのか気になりますね。
まとめ
Amazon GuardDuty Investigationの機能をイベントドリブンで扱うことができるか確認しましたが、少なくともプレビューの現状では扱えませんでした。
Findingsの検出に合わせて調査とその結果を使った通知などを作るのが良さそうです。









