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を有効にします。

  1. ECSサービスへ移動:
    • AWSコンソールにログインし、ECSサービスを開きます。
  2. クラスターの選択または新規作成:
    • 左側のナビゲーションペインで「クラスター」を選択します。
    • 既存のクラスターで有効にする場合は、対象のクラスター名をクリックします。
    • 新規クラスターを作成する場合は、「クラスターの作成」をクリックします。
  3. 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機能で簡単に検出及び管理する事が可能です。

運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る