ECSクラスターにおけるContainer Insightsの有効化について
                このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、ECSクラスターにおいてContainer Insightsが有効化されていない状態について、リスクと対策を解説します。

ポリシーの説明
Amazon ECS の Security Hub コントロール – AWS Security Hub
このコントロールは、ECS クラスターが Container Insights を使用しているかどうかをチェックします。クラスターで Container Insights がセットアップされていない場合、このコントロールは失敗します。
リスク
Amazon Elastic Container Service (ECS) は、コンテナ化されたアプリケーションを大規模に実行、停止、管理できるフルマネージドなコンテナオーケストレーションサービスです。ECSクラスターでContainer Insightsが有効化されていない場合、コンテナ環境の健全性やパフォーマンスの可視性が著しく低下し、以下のような運用上およびセキュリティ上のリスクが発生します。
- パフォーマンス問題の特定困難: CPU、メモリ、ディスクI/O、ネットワーク利用率といった重要なコンテナおよびクラスターレベルのメトリクスが自動的に収集されないため、アプリケーションのパフォーマンスボトルネックやリソース枯渇の問題を特定するのが困難になります。
 - 障害発生時の原因究明の遅延: コンテナの再起動失敗、タスクの異常終了、コンテナインスタンスのヘルス低下など、運用上の問題が発生した際に、詳細な診断情報が得られません。これにより、根本原因の特定と解決に時間がかかり、ダウンタイムが長期化する可能性があります。
 - リソースの最適化不足: 各コンテナやサービスの実際のメトリクスが分からないため、リソース割り当て(CPU、メモリ)が適切に行われているか判断できません。過剰なリソース割り当てはコストの無駄につながり、不足しているとパフォーマンス問題を引き起こします。
 - セキュリティインシデントの検知遅延: コンテナの異常な挙動(例: 予期しないリソース消費増大)は、セキュリティ侵害の兆候である可能性があります。Container Insightsが有効でないと、これらの異常を自動で検知する仕組みが不足し、インシデントへの対応が遅れる可能性があります。
 - 運用上のオーバーヘッド増加: メトリクスやログを手動で収集・分析する必要が生じ、運用チームの負担が増大します。これは、特に大規模なコンテナ環境において非効率的です。
 
対策
ECSクラスターでContainer Insightsを有効化することは、コンテナ化されたアプリケーションのパフォーマンス監視、問題解決、およびリソース最適化を大幅に改善するために不可欠です。
- Container Insightsの有効化: ECSクラスターの作成時、または既存のクラスターに対して、Container Insightsを有効にします。これにより、CPU、メモリ、ストレージ、ネットワークなどのコンテナとクラスターレベルのメトリクスが自動的にCloudWatchに収集されます。
 - 高解像度メトリクスの活用: Container Insightsは高解像度メトリクス(1秒間隔)を収集するため、より粒度の細かいパフォーマンスデータに基づいた監視とアラートが可能です。
 - ダッシュボードでの可視化: Container Insightsによって収集されたメトリクスと診断情報を、CloudWatchダッシュボードで可視化します。これにより、クラスター全体の健全性、各サービスのパフォーマンス、リソース使用状況などを一目で把握できます。
 - CloudWatchアラームの設定: 重要なメトリクス(例: コンテナのメモリ使用率がしきい値を超過、タスクのCPU使用率が異常値を示す、コンテナ再起動の失敗回数など)に対してCloudWatchアラームを設定し、問題が発生した場合に通知を受け取れるようにします。
 - ログデータとの連携: Container InsightsはCloudWatch Logsにも診断情報を送信します。これらのログとメトリクスを連携させて分析することで、問題の根本原因をより深く掘り下げて特定できます。
 
修復方法
AWSコンソールでの修復手順
AWSコンソールを使用して、ECSクラスターでContainer Insightsを有効にします。
- ECSサービスへ移動:
- AWSコンソールにログインし、ECSサービスを開きます。
 
 - クラスターの選択または新規作成:
- 左側のナビゲーションペインで「クラスター」を選択します。
 - 既存のクラスターで有効にする場合は、対象のクラスター名をクリックします。
 - 新規クラスターを作成する場合は、「クラスターの作成」をクリックします。
 
 - Container Insightsの有効化:
- 既存のクラスターの場合:
- クラスターの詳細ページで「設定」タブを選択します。
 - 「編集」をクリックします。
 - 「Container Insights」セクションを見つけ、「Container Insights を有効にする」にチェックを入れます。
 - 「変更の保存」をクリックします。
 
 - 新規クラスターの作成の場合:
- クラスター作成ウィザードの「監視」セクションで、「Container Insights を有効にする」にチェックを入れます。クラスターの作成を続行します。
 
 
 - 既存のクラスターの場合:
 

Terraformでの修復手順
TerraformでECSクラスターにおいてContainer Insightsを有効化するには、aws_ecs_cluster リソースの setting ブロックを使用します。
# ECSクラスターの定義
resource "aws_ecs_cluster" "my_ecs_cluster" {
  name = "my-application-cluster"
  # Container Insightsを有効化する設定
  setting {
    name  = "containerInsights"
    value = "enabled"
  }
  tags = {
    Environment = "Development"
  }
}
# (オプション) クラスターに紐づくEC2インスタンスまたはFargateプロファイルなど、
# その他のECS関連リソースもここで定義できます。
/*
# 例: EC2インスタンスを登録するECS容量プロバイダー
resource "aws_ecs_capacity_provider" "example" {
  name = "example"
  auto_scaling_group_provider {
    auto_scaling_group_arn         = aws_autoscaling_group.example.arn
    managed_draining               = "ENABLED"
    managed_termination_protection = "ENABLED"
  }
}
resource "aws_autoscaling_group" "example" {
  # ... オートスケーリンググループの設定 ...
}
# 例: ECSサービスとタスク定義
resource "aws_ecs_task_definition" "example" {
  family                   = "my-app"
  cpu                      = "256"
  memory                   = "512"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  execution_role_arn       = aws_iam_role.ecs_task_execution_role.arn
  container_definitions = jsonencode([
    {
      name      = "my-container"
      image     = "nginx:latest"
      portMappings = [
        {
          containerPort = 80
          hostPort      = 80
          protocol      = "tcp"
        }
      ]
      logConfiguration = {
        logDriver = "awslogs"
        options = {
          "awslogs-group"         = "/ecs/my-app"
          "awslogs-region"        = "ap-northeast-1" # あなたのリージョンに置き換え
          "awslogs-stream-prefix" = "ecs"
        }
      }
    }
  ])
}
resource "aws_ecs_service" "example" {
  name            = "my-app-service"
  cluster         = aws_ecs_cluster.my_ecs_cluster.id
  task_definition = aws_ecs_task_definition.example.arn
  desired_count   = 2
  launch_type     = "FARGATE"
  network_configuration {
    subnets          = [aws_subnet.public_a.id] # あなたのサブネットに置き換え
    security_groups  = [aws_security_group.ecs_sg.id] # あなたのセキュリティグループに置き換え
    assign_public_ip = true
  }
}
*/
上記のTerraformコードでは、aws_ecs_cluster リソース内で setting ブロックを定義し、その中に name = "containerInsights" と value = "enabled" を指定することで、ECSクラスターのContainer Insightsを有効にしています。
my-application-cluster などのプレースホルダーは、実際の環境に合わせて修正してください。
最後に
この記事では、ECSクラスターにおいてContainer Insightsが有効化されていない状態について、リスクと対策を解説しました。ECSクラスターでContainer Insightsを有効化することは、コンテナ環境の健全性、パフォーマンス、および運用の可視性を確保するために不可欠です。これにより、問題の早期発見、迅速なトラブルシューティング、そしてリソースの効率的な利用が可能となり、安定したコンテナアプリケーションの運用をサポートします。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。
CSPMについてはこちらで解説しております。併せてご覧ください。
            