[アップデート] Amazon Inspector を有効化せずに AMI をオンデマンドスキャンしてみた
はじめに
Amazon Inspector で、AMI を手軽にスキャンできるオンデマンドスキャンが使えるようになりました。
これまで Inspector で AMI の脆弱性を調べるには、AMI からインスタンスを起動し、そのインスタンスをスキャンする必要がありました。
オンデマンドスキャンでは AMI のスナップショットを直接読み取るので、インスタンスを起動せずに直接スキャンできます。また、Inspector が無効のアカウントでもスキャン可能とのことです。
結果の受け取り方については、ドキュメントによって書かれていることが異なります。Inspector のドキュメントには「結果は Amazon EventBridge だけに届く」と書かれていますが、EC2 のドキュメントには「結果が EC2 に送られ、EC2 の API で取得できる」と書かれています。
そこで、この記事では Inspector を無効にしたアカウントで AMI をスキャンし、結果の届き方を確かめてみようと思います。
検証環境
Inspector を無効にしたアカウントで検証します。また、オンデマンドスキャンの対象にできるのは自分のアカウントが所有する AMI のみなので、Amazon Linux 2023 の公開 AMI を 2 つ自分のアカウントにコピーしておきます。
| 用途 | コピー元の AMI 名 | コピー後の AMI ID |
|---|---|---|
| 脆弱性が多い AMI | al2023-ami-2023.0.20230315.0-kernel-6.1-x86_64 |
ami-07d2ba94d48bca823 |
| 脆弱性が少ない AMI | al2023-ami-2023.12.20261028.0-kernel-6.1-x86_64 |
ami-08b070da26a7579d0 |
EventBridge に届くイベントは、デフォルトのイベントバスのルールで受け取り、CloudWatch Logs に保存しました。
スキャンを実行する
start-on-demand-scan に AMI ID を渡すとスキャンが始まり、scanId が返ります。
aws inspector2 start-on-demand-scan \
--resource-id ami-07d2ba94d48bca823 \
--resource-type AMI
{
"scanId": "842d9c96f14e40559b8fc450ba747577"
}
実行する IAM プリンシパルには、inspector2:StartOnDemandScan に加えて iam:CreateServiceLinkedRole の権限が必要です。初回のスキャンで、スナップショットを読むためのサービスにリンクされたロール AWSServiceRoleForAmazonInspector2Ami が作られました。
スキャンの状態は、get-on-demand-scan-status に AMI ID と scanId を渡して確かめます。
aws inspector2 get-on-demand-scan-status \
--resource-id ami-07d2ba94d48bca823 \
--resource-type AMI \
--scan-id 842d9c96f14e40559b8fc450ba747577
{
"scanId": "842d9c96f14e40559b8fc450ba747577",
"resourceId": "ami-07d2ba94d48bca823",
"resourceType": "AMI",
"scanStatus": "SUCCESSFUL",
"startedAt": "2026-10-29T09:52:31.968000+00:00",
"completedAt": "2026-10-29T09:58:36.442000+00:00"
}
2 つの AMI とも、約 6 分で SUCCESSFUL になりました!インスタンスを 1 台も起動せずにスキャンが終わって手軽ですね。
EC2 で結果を確認する
EventBridge を使わずに結果を見られるかを確かめるため、EC2 の describe-images と get-image-findings を実行しました。
describe-images でサマリを見る
describe-images の ScanResults には、検出結果の最も高い重大度などのサマリが入ります。
aws ec2 describe-images \
--image-ids ami-07d2ba94d48bca823 ami-08b070da26a7579d0 \
--query "Images[].ScanResults"
[
{
"HighestFindingSeverityLabel": "critical",
"FindingScanDate": "2026-10-29T09:52:31.968000+00:00",
"LowFixAvailableSince": "2026-10-29T09:58:30.471000+00:00",
"MediumFixAvailableSince": "2026-10-29T09:58:30.471000+00:00",
"HighFixAvailableSince": "2026-10-29T09:58:30.471000+00:00",
"CriticalFixAvailableSince": "2026-10-29T09:58:30.542000+00:00"
},
{
"FindingScanDate": "2026-10-29T09:52:22.201000+00:00"
}
]
古い AMI では最も高い重大度が critical となり、重大度ごとに修正が出ていることを示す *FixAvailableSince も入りました。検出結果が 0 件だった新しい AMI では、スキャンした日時の FindingScanDate だけが返っています。
get-image-findings で検出結果を見る
aws ec2 get-image-findings --image-id ami-07d2ba94d48bca823
古い AMI の検出結果は 4,186 件、新しい AMI は 0 件でした。
例として、critical の 1 件は以下の内容でした。
{
"FixAvailable": true,
"Score": 9.9,
"FirstObservedAt": "2026-10-29T09:58:30.542000+00:00",
"UpdatedAt": "2026-10-29T09:58:30.542000+00:00",
"Title": "CVE-2026-89049 - amazon-ssm-agent",
"Paths": [
"/var/lib/rpm/rpmdb.sqlite"
],
"SeverityLabel": "critical",
"SnapshotId": "snap-0db91065890272669"
}
各検出結果には、脆弱性が見つかった EBS スナップショットの ID とファイルパスが付きます。なお、CVE の説明や修正済みのバージョンは、get-image-findings には含まれません。
Inspector のドキュメントには「結果は EventBridge だけに届く」とありましたが、EC2 の API でもきちんと取れました。
EC2 コンソールの表示を確認する
ドキュメントには、EC2 コンソールの AMI の「Security」タブで結果を確認できると書かれています。しかし、執筆時点では AMI の詳細画面にそのタブはありませんでした。コンソールへの反映はまだなのかもしれません。
EventBridge でイベントを受け取る
デフォルトのイベントバスには、次の 2 種類のイベントが届きました。
detail-type |
届くタイミング |
|---|---|
Inspector2 OnDemand Finding |
検出結果 1 件ごと |
Inspector2 OnDemand Scan Complete |
スキャンが終わったとき |
スキャン完了のイベント
スキャン完了のイベントには、以下の例のように重大度ごとの件数が findingSeverityCounts に入ります。
{
"version": "0",
"id": "ed10a415-0d57-5c57-14ed-23d77d0fadb1",
"detail-type": "Inspector2 OnDemand Scan Complete",
"source": "aws.inspector2",
"account": "123456789012",
"time": "2026-10-29T09:58:24Z",
"region": "ap-northeast-1",
"resources": [
"ami-08b070da26a7579d0"
],
"detail": {
"scanId": "b63e50341444477cb48b75d21796aa6f",
"awsAccountId": "123456789012",
"resourceId": "ami-08b070da26a7579d0",
"resourceType": "MACHINE_IMAGE",
"scanStatus": "SUCCESSFUL",
"startedAt": "2026-10-29T09:52:22.201Z",
"completedAt": "2026-10-29T09:58:24.165Z",
"findingSeverityCounts": {
"CRITICAL": 0,
"HIGH": 0,
"MEDIUM": 0,
"LOW": 0,
"INFORMATIONAL": 0,
"UNTRIAGED": 0,
"TOTAL": 0
},
"version": "1.0"
}
}
検出結果のイベント
検出結果のイベントには、get-image-findings にはない CVE の説明、CVSS のスコア、修正済みのバージョン、参考 URL などが入ります。同じスキャンの完了イベントとは、detail.scanId で結び付けられます。
古い AMI では 4,000 件を超える検出結果のイベントがまとめて発行されたせいで、完了イベントの方が先に届きました。完了イベントをきっかけに処理する場合は、findingSeverityCounts.TOTAL と受け取った件数を比べるか、get-image-findings で取り直す方が確実です。
おわりに
Amazon Inspector の AMI のオンデマンドスキャンを、Inspector を無効にしたアカウントで試しました。
結果を手軽に取得するなら EC2 の get-image-findings、自動化するなら EventBridge と使い分けられます。
ただし EventBridge では、数千件のイベントがまとめて発行され、完了イベントが検出結果より先に届くこともありました。件数に注意して、量を確かめてから処理するようにしてみてください。





