Amazon EventBridge SchedulerでECRのベーシックスキャンを自動化してみた

ECRイメージスキャン実行には、Dockerイメージのタグまたはダイジェスト指定が必要でした。latestタグでワークロードを実行している場合は使えるのかもしれません。拡張イメージスキャンの便利さを実感しました。
2022.11.16

こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。

今回は、ECRに搭載されたベーシックスキャンをAmazon EventBridge Schedulerで定期実行してみます。

ECRのベーシックスキャンとは

Amazon ECRでは、Clairプロジェクトの共通脆弱性識別子データベースを使用した、コンテナイメージの脆弱性スキャン(以後、ベーシックスキャン)を提供しています。

ECRベーシックスキャンの強みはなんと言っても、「無料」であることだと思います。

しかし有償で提供されている、Inspector v2を利用した拡張イメージスキャン(以後、拡張イメージスキャン)に比べていくつか制約があります。

実行タイミング、間隔

ベーシックイメージスキャンと拡張イメージスキャンの実行タイミングは以下のように異なります。

ベーシックイメージスキャン

  • スキャンタイミング:新しいイメージがプッシュされた時、マニュアルスキャンが実行された時
  • 自動化できるか:Amazon ECR単体ではサポートされていない
  • 実行間隔の制限:各イメージに対して1日に1回のみスキャン可能

拡張イメージスキャン

  • スキャンタイミング:新しいイメージがプッシュされた時、新しい脆弱性が発表された時(マニュアルスキャンはサポートしていない)
  • 自動化できるか:はい(必要な時にスキャンが実行されている)
  • 実行間隔の制限:なし

ベーシックイメージスキャンでは、新しい脆弱性が発表された場合の自動スキャンをサポートしていないため、手動で定期的に実行する必要があります。

なおかつ、各イメージに対して1日に1回のみスキャン可能なため、出来れば自動化して定期的な実行を目指すのが望ましいです。

そこで、Amazon EventBridge Schedulerを利用して、日次でイメージスキャンを行なっていきます。

やってみた

IAMロールの作成

Amazon EventBridge SchedulerからECRイメージスキャンを実行するために、Scheduler用のIAMロールを作成します。

IAMポリシーの作成

便宜上、先にIAMロールにアタッチするIAMポリシーを作成します。IAMポリシーは次のように設定します。

iam_policy.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ecr:StartImageScan",
            "Resource": "*"
        }
    ]
}

今回、IAMポリシーの名前は「sample-image-scan-policy」としました。

IAMロールの作成

Scheduler用のIAMロールを作成します。信頼関係ポリシーは以下を設定します。

assume_policy.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

作成したIAMポリシーをIAMロールにアタッチをします。

ロール名は「sample-image-scan-role」とし、問題なければロールの作成を行います。

Schedulerの作成

Scheduler作成画面から、名前やスケジュールのパターンを設定します。

今回は、テストのためスケジュールは午後21時に設定しました。

APIの選択

「Amazon ECR」,「StartImageScan」と検索しStartImageScan APIを選択します。

一筋縄ではいかなかった

StartImageScanを選択すると「ImageId」と「RepositoryName」がパラメーターとして表示されました。

APIリファレンスを確認すると「ImageId」は必須のパラメーターのため、各イメージごとに設定が必要でした...

Request Parameters For information about the parameters that are common to all actions, see Common Parameters.

The request accepts the following data in JSON format.

imageId

An object with identifying information for an image in an Amazon ECR repository.

Type: ImageIdentifier object

Required: Yes

StartImageScan

タグをイミュータブルにコントロールできないため、「良いプラクティス!」とは自信を持って言えではないですが、今回は「latest」で設定しました。(良いプラクティスあればコメントください!)

※RepositoryNameは対象のレポジトリを設定してください。

{
  "ImageId": {
      "ImageTag": "latest"
  },
  "RepositoryName": "sample-image-scan-repo"
}

実行履歴の確認

ECRイメージ側から脆弱性スキャンの結果を確認します。

無事、21時にイメージスキャンが実行されていることが確認できました。

日本のタイムゾーンでスケジュール設定できる部分がとても便利だと思います。

まとめ

以上、Amazon EventBridge SchedulerでECRのベーシックスキャンを自動化してみたでした。

EventBridge Schedulerで定期実行する使い方の1つになれば幸いです。タグに依存しない形のアップデートを期待しています!

以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!