ECS で別コンテナからプロセス状況を監視する方法を教えてください

ECS で別コンテナからプロセス状況を監視する方法を教えてください

2026.03.19

困っていた内容

ECS Fargate でアプリケーションを実行しています。
メモリ使用率が高いため、サイドカーコンテナからアプリケーションコンテナのプロセス状況を確認したいです。
サイドカーコンテナからpsコマンドを実行しましたが、アプリケーションコンテナのプロセスが表示されません。

タスク内の別コンテナからプロセス状況を確認する方法を教えてください

どう対応すればいいの?

ECS タスク定義のpidModetaskに設定してください。

Fargate での Amazon ECS タスク定義パラメータ - Amazon Elastic Container Service

pidMode
タイプ: 文字列
有効な値: host | task
必須: いいえ

タスクのコンテナで使用するプロセス名前空間。有効な値は host または task です。Linuxコンテナでは、有効な値は task のみです。例えば、サイドカーのモニタリングでは、pidMode が同じタスクで実行されている他のコンテナに関する情報にアクセスする必要がある場合があります。

task が指定されている場合、指定したタスク内のすべてのコンテナは同じプロセス名前空間を共有します。

値が指定されていない場合、デフォルトは各コンテナのプライベート名前空間です。

pidModeがデフォルト値の場合、同一コンテナ内のプロセスのみが参照でき、別のコンテナ内のプロセスは参照できません。

pidModetaskに設定すると、ECS タスク内のコンテナ間で PID namespace が共有され、別コンテナ内のプロセスが参照できるようになります。

なお、pidModetaskに設定すると、タスク内で ECS Exec を実行できるコンテナが制限されるため、ご注意ください。

ECS Exec を使用して Amazon ECS コンテナをモニタリングする - Amazon Elastic Container Service

プロセス ID (PID) 名前空間ごとに作成できる ECS Exec セッションは 1 つのみです。タスク内で PID 名前空間を共有している場合は、1 つのコンテナ内でのみ ECS Exec セッションを開始できます。

やってみた

pidModetaskに設定し、1 分毎にプロセス状況を CloudWatch Logs に出力するサイドカーコンテナを構築、実行します。

サイドカー用コンテナイメージの作成

Amazon Linux 2023 のコンテナイメージをベースに、ps コマンドでプロセス状況を JSON 形式で標準出力する Dockerfile の例です。

Dockerfile
FROM public.ecr.aws/amazonlinux/amazonlinux:2023
RUN dnf install -y jq procps && \
    dnf clean all && rm -rf /var/cache/dnf/* 
COPY <<'EOF' /usr/local/bin/ps-monitor.sh
#!/bin/bash
while true; do
  timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
  processes=$(ps aux --sort=-%mem \
    | awk 'NR>1 {
        cmd = $11
        for (i=12; i<=NF; i++) cmd = cmd " " $i
        print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t" $8 "\t" $9 "\t" $10 "\t" cmd
      }' \
    | jq -Rsc '
        [ split("\n")[]
          | select(length > 0)
          | split("\t")
          | {
              user:    .[0],
              pid:     (.[1] | tonumber),
              cpu:     (.[2] | tonumber),
              mem:     (.[3] | tonumber),
              vsz:     (.[4] | tonumber),
              rss:     (.[5] | tonumber),
              tty:     .[6],
              stat:    .[7],
              start:   .[8],
              time:    .[9],
              command: .[10]
            }
        ]')
  jq -cn \
    --arg timestamp "$timestamp" \
    --argjson processes "$processes" \
    '{timestamp: $timestamp, processes: $processes}'
  sleep 60s
done
EOF
RUN chmod +x /usr/local/bin/ps-monitor.sh
CMD ["/usr/local/bin/ps-monitor.sh"]

上記 Dockerfile をビルドして、ECR にプッシュします。

コマンド例
docker build -t ps-monitoring .
docker tag ps-monitoring:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ps-monitoring:latest
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ps-monitoring:latest

ECS タスク定義の作成

JSON エディタを使って、pidModeとサイドカーコンテナ(hato-sidecar-container)をタスク定義に設定します。

ECS Monitor Process From Sidecar Container 1

タスク定義の例
{
    "family": "hato-taskdefinition",
    "containerDefinitions": [
        {
            "name": "hato-sidecar-container",
            "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ps-monitoring:latest",
            "cpu": 0,
            "portMappings": [],
            "essential": true,
            "environment": [],
            "mountPoints": [],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/hato-taskdefinition",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            },
            "systemControls": []
        },
        {
            "name": "hato-app-container",
            "image": "public.ecr.aws/amazonlinux/amazonlinux:2023",
            "cpu": 0,
            "portMappings": [],
            "essential": false,
            "environment": [],
            "mountPoints": [],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/hato-taskdefinition",
                    "awslogs-create-group": "true",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
    ],
    "taskRoleArn": "arn:aws:iam::123456789012:role/hato-ecs-task-role",
    "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "volumes": [],
    "placementConstraints": [],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "2048",
    "pidMode": "task",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    }
}

タスクの実行

作成した ECS タスク定義でタスクを実行します。

サイドカーコンテナが起動すると、1 分毎にプロセス状況が CloudWatch Logs に出力されます。

ECS Monitor Process From Sidecar Container 2

出力例
{
    "timestamp": "2026-03-18T05:13:20Z",
    "processes": [
        {
            "user": "root",
            "pid": 26,
            "cpu": 99.2,
            "mem": 25.8,
            "vsz": 1027532,
            "rss": 1024100,
            "tty": "?",
            "stat": "R",
            "start": "05:02",
            "time": "10:56",
            "command": "stress --vm 1 --vm-bytes 1000M --vm-keep"
        },
        {
            "user": "root",
            "pid": 13,
            "cpu": 0.0,
            "mem": 0.0,
            "vsz": 4256,
            "rss": 3420,
            "tty": "?",
            "stat": "Ss",
            "start": "05:02",
            "time": "0:00",
            "command": "/bin/bash /usr/local/bin/ps-monitor.sh"
        },
...
        {
            "user": "root",
            "pid": 1,
            "cpu": 0.0,
            "mem": 0.0,
            "vsz": 996,
            "rss": 4,
            "tty": "?",
            "stat": "Ss",
            "start": "05:02",
            "time": "0:00",
            "command": "/pause"
        }
    ]
}

参考資料

PID namespace は、コンテナ内のプロセスが参照可能なプロセスを制限します。デフォルトでは、コンテナ内のプロセスは同じコンテナ内のプロセスのみを参照でき、他のコンテナ内、または実行基盤となるホスト上のプロセスは参照できません。コンテナ間で PID namespace を共有する一般的なユースケースとして、可観測性ツールがあります。コンテナランタイムセキュリティツールは、多くの場合サイドカーコンテナで実行されます。このとき、サイドカーコンテナ内のプロセスがアプリケーションコンテナ内のプロセスを監視し、不審なシステムコールが実行されていないかどうかを確認します。

今回の発表により、タスク定義内の pidMode キーの値を task に設定することで、AWS Fargate においても ECS タスク内のコンテナ間で PID namespace を共有できるようになりました。

この記事をシェアする

FacebookHatena blogX

関連記事