Amazon Inspectorを使ったECRスキャンでスキャン結果にイメージを使用しているECSタスク・EKS Pod情報がマッピングされるようになりました
お疲れさまです。とーちです。
What's Newを眺めていたらAmazon Inspectorに関する面白そうなアップデートがありました。
Amazon Inspectorを使ったECRスキャンで、スキャン結果にそのイメージを実際に使用しているECSタスク・EKS Podの場所や最後にそのイメージを使用した日時がデータとして含まれるようになったというアップデートです。
早速試してみたのですが、結論から言うと、残念ながら上記の動作を確認することはできませんでした。
私の検証方法が悪い可能性もあるので引き続き調査し、本記事についてはアップデートを行う予定ですが、一旦現時点で分かったことをまとめておきます。
アップデート内容について
今回のアップデートですが、以下の複数の要素を含んだものとなっています
-
ECR 再スキャン期間の設定に
Last in-use date
(最終使用日時)を起点とした設定が追加- 従来はpushとpullを起点とした設定だったが、これに最終使用日時を起点とした設定が追加
-
実際に実行されているECSタスク・EKS Podの情報を検出結果に自動的にマッピング
- 最後にイメージを使用した日時、そのイメージを実行しているクラスター等を特定できる情報をAmazon Inspector コンソールまたは APIで取得できるようになった
-
最終使用日時等の情報をEventBridgeへの転送
- 上記の情報はEventBridgeで転送することも可能
それぞれについて、検証結果も交えて解説していきます。
Last in-use date
(最終使用日時)を起点とした設定が追加
ECR 再スキャン期間の設定に ECR基本スキャンがコンテナイメージをpushした際に一度だけスキャンするのに対して、Amazon Inspectorを使ったECRスキャンでは、対象のECR上のイメージを継続的にスキャンするという動作になっています。継続的なスキャンでは、Amazon Inspectorが持つデータベースに新しい脆弱性 (CVE) が追加されたタイミングで、対象のECR上のイメージをスキャンします。(参考)
以下はECRレジストリのスキャン設定の画面ですが、これが拡張スキャンとなっている場合には、Amazon Inspectorを使ったECRスキャンが行われます。
さて、この継続的なスキャンですが、全てのイメージが永続的にスキャンされるというわけではなく、ある条件に従ってスキャンされるようになっています。
従来は以下の2つの条件を設定できました
- イメージがアップロード(プッシュ)されてからの期間:ECRにイメージをプッシュしてからどれだけ時間が経ったか
- イメージが最後にpullされてからの期間: ECS等のサービスでECRからイメージをダウンロード(プル)してから、どれだけ時間が経ったか
今回のアップデートにより上記の2つに加えて以下の条件が設定できるようになりました
- イメージが最後に使用されてからの期間: ECS等のサービスでイメージを最後に使用してから、どれだけ時間が経ったか
上記の設定は、以下のAmazon Inspectorの設定画面で設定します。
Image re-scan mode
で、Last in-use date
(最終使用日時) か Last pull date
(最終pull日時) かを選択できます。
またその下の Image last in use date
で最後に使用されてからどのくらい日数が経過するまで継続的にスキャンするかを指定します。
ちなみに、更にその下のECR再スキャン期間
の項目はpushされてからの日数の設定です。
Image last in use date
は最小の設定が14日となっており、実際に検証するには14日待つ必要があるので、最終使用日時というのが具体的にどのタイミングになるのかまでは分かりませんが、おそらくECS等のサービスで実際に使用されている限りは継続スキャンの対象になるのではないかと思います。
実際に実行されているECSタスク・EKS Podの情報を検出結果に自動的にマッピング
Amazon Inspectorの検出結果の画面で実際に実行されているECSタスクの情報が分かるということでなかなか素晴らしい機能だと思ったのですが、残念ながら動作を確認することはできませんでした。
実際に以下のように検証を行いました。なお構成としては一般的なパブリックなALB ⇒ ECSといった構成です
- AWSアカウント上で、ECSタスクを作成
- 作成したECSタスクを使ってECSサービスを作成
- ECRに新しいコンテナイメージをpush
- ECSタスクを更新し、ECSサービスもタスク定義の部分を更新
- Amazon Inspectorの検出結果の画面を確認
ECSサービスは以下のようにActiveな状態となっており、
ECSタスクも正常に起動されている状態です。
ブラウザを使ったECSへのアクセスにも成功しているので、ECSタスクとしては間違いなくECR上のイメージを使用している状態になっています。
この状態で、Amazon Inspectorの検出結果の画面を確認しましたが、以下のような状態でした。
上記のDeployed Pods/TasksにデプロイされているECSタスクに関する情報が表示され、Last in useには最後に使用された日時が表示されるのが期待する動作だったのですが、実際には空になっています。
画面下の検出結果の部分では新たに Image in use count
と Image last in use at
でフィルタができるようになっています。
しかし、試しにImage last in use at
で7日でフィルタ(過去7日以内に使用されたイメージのみを表示)してみましたが、何も表示されない状態でした。
ということで、「実際に実行されているECSタスク・EKS Podの情報を検出結果画面にマッピング」する機能の確認はできませんでした。
なお、上記の検証はap-northeast-1(東京リージョン)で行ったあとにus-east-1(バージニア北部)でも実施しましたが、同様の結果でした。
最終使用日時等の情報をEventBridgeへの転送
念の為、Amazon InspectorのスキャンイベントをEventBridgeで受け取りイベント情報の中身も確認してみました。
以下のようなTerraformコードでEventBridgeとLambdaを作成しています。
# Lambda関数用のIAMロール
resource "aws_iam_role" "lambda_role" {
name = "ecr_scan_lambda_role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "lambda.amazonaws.com"
}
}
]
})
}
# Lambda基本実行権限とCloudWatch Logs権限をアタッチ
resource "aws_iam_role_policy_attachment" "lambda_basic" {
role = aws_iam_role.lambda_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
# Lambda関数用のコードをzipファイルとして準備
data "archive_file" "lambda_zip" {
type = "zip"
output_path = "${path.module}/lambda_function.zip"
source {
content = <<EOF
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
"""ECRスキャンイベントを受け取り、内容をログに出力する関数"""
# イベント全体をログに出力
logger.info("ECRスキャンイベント:")
logger.info(json.dumps(event, indent=2, default=str))
return {
'statusCode': 200,
'body': 'イベント処理完了'
}
EOF
filename = "lambda_function.py"
}
}
# Lambda関数の作成
resource "aws_lambda_function" "ecr_scan_lambda" {
function_name = "ecr-scan-event-processor"
role = aws_iam_role.lambda_role.arn
handler = "lambda_function.lambda_handler"
filename = data.archive_file.lambda_zip.output_path
source_code_hash = data.archive_file.lambda_zip.output_base64sha256
runtime = "python3.9"
timeout = 10
tags = {
Name = "ECRScanEventProcessor"
}
}
# EventBridgeルールの作成
resource "aws_cloudwatch_event_rule" "ecr_scan_rule" {
name = "ecr-scan-events"
description = "キャプチャするECRスキャンイベント"
event_pattern = jsonencode({
source = ["aws.inspector2"]
detail-type = ["Inspector2 Scan"]
})
}
# EventBridgeルールのターゲットとしてLambda関数を設定
resource "aws_cloudwatch_event_target" "lambda_target" {
rule = aws_cloudwatch_event_rule.ecr_scan_rule.name
target_id = "SendToLambda"
arn = aws_lambda_function.ecr_scan_lambda.arn
}
# EventBridgeがLambda関数を呼び出す権限を付与
resource "aws_lambda_permission" "allow_eventbridge" {
statement_id = "AllowExecutionFromEventBridge"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.ecr_scan_lambda.function_name
principal = "events.amazonaws.com"
source_arn = aws_cloudwatch_event_rule.ecr_scan_rule.arn
}
これをデプロイした状態で、上記のECSサービスへのデプロイまでを含めた検証を実施しましたが、以下の通りイベント情報には特にどこのECSタスクで使用されているか等の情報は含まれていませんでした。
{
"version": "0",
"id": "b2a9391d-0e8e-1f3b-db45-baba7da0ee63",
"detail-type": "Inspector2 Scan",
"source": "aws.inspector2",
"account": "XXXXXXXXXXXX",
"time": "2025-05-20T00:04:37Z",
"region": "us-east-1",
"resources": [
"arn:aws:ecr:us-east-1:XXXXXXXXXXXX:repository/test-ecspresso-test"
],
"detail": {
"scan-status": "INITIAL_SCAN_COMPLETE",
"repository-name": "arn:aws:ecr:us-east-1:XXXXXXXXXXXX:repository/test-ecspresso-test",
"finding-severity-counts": {
"CRITICAL": 0,
"HIGH": 2,
"MEDIUM": 0,
"TOTAL": 2
},
"image-digest": "sha256:4c24505bb7aed4b33db21a9a9ac91a947e71bb6cbcfa3f8b40e5c0f6fbb734d7",
"image-tags": [
"v4"
],
"version": "1.0"
}
}
まとめ
ということで、「Amazon Inspectorを使ったECRスキャンでスキャン結果にそのイメージを実際に使用しているECSタスク・EKS Podがマッピングされるようになった」というアップデートの紹介でした。
実際に期待する動作を確認することができなかったので、継続して調査しようと思います。
もし読者の皆さんで実際にこの機能を確認できた方や、私の検証方法に問題があることにお気づきの方がいらっしゃいましたら、tttkkk215まで、ぜひ教えていただければと思います。
新機能の詳細が分かり次第、本記事も更新していきますので、引き続きよろしくお願いします。
以上、とーちでした。