はじめに
2025 年 10 月 15 日、AWS は Amazon Elastic Container Service(ECS)の Firelens コンテナにおいて、非 root ユーザーでの実行をサポートすることを発表しました。
これまで Firelens コンテナは root ユーザー(ユーザー ID: 0)でのみ実行可能でしたが、タスク定義で任意のユーザー ID を指定できるようになりました。
この機能は全 AWS リージョンで即座に利用可能で、ECS Agent 1.96.0 以降で対応しています。
本記事では、新機能の詳細、従来との違い、実際の使い方、コストや制限事項についてまとめています。
新機能の概要
今回発表された新機能により、Firelens コンテナを非 root ユーザーとして実行できるようになりました。
主な特徴
新機能の主な特徴としては以下の 3 つです。
- セキュリティリスクの軽減
- コンプライアンス要件への対応
- シンプルな実装方法
セキュリティリスクの軽減
非 root ユーザーで実行することで、コンテナが侵害された場合の攻撃対象領域(Attack Surface)を大幅に削減できます。
コンプライアンス要件への対応
AWS Security Hub、CIS Benchmarks、PCI DSS、HIPAA などのセキュリティ基準やコンプライアンスフレームワークへの対応が容易になります。
シンプルな実装
タスク定義で user フィールドを追加するだけで、非 root ユーザーでの実行が可能になります。
何が変わったのか
今回発表された新機能により、Firelens のセキュリティ設定が大きく変わりました。
従来の課題と新機能による変化を見ていきましょう。
従来の課題
主な課題としては以下の 2 つがありました。
- root ユーザーでの実行強制
- セキュリティ・コンプライアンス対応の困難
root ユーザーでの実行強制
Firelens コンテナは "user": "0"(root ユーザー)でのみ実行可能でした。
タスク定義で root 以外のユーザーを指定しようとすると、エラーが発生していました。
セキュリティ・コンプライアンス対応の困難
セキュリティ対応
AWS Security Hub や社内のセキュリティスキャンで、「root ユーザーで実行されているコンテナ」として指摘されていました。
アプリケーションコンテナは非 root で実行しているにもかかわらず、Firelens だけが root 実行を強制されるという状況でした。
コンプライアンス対応
金融機関や医療機関など、「すべてのコンテナを非 root で実行する」というコンプライアンス要件がある環境では、Firelens の使用が制約となっていました。
CIS Benchmarks の推奨や、PCI DSS・HIPAA で求められる最小権限の原則に完全に準拠することが困難でした。
新機能による変化
新機能により、従来の課題がすべて解決されました。
任意のユーザー ID での実行が可能に
タスク定義の Firelens containerDefinition 要素で、user フィールドに任意のユーザー ID を指定できるようになりました。
従来は "user": "0"(root ユーザー)のみが許可されており、非 root ユーザーを指定するとエラーが発生していましたが、新機能により非 root ユーザーで正常に起動するようになりました。
セキュリティ・コンプライアンス対応の改善
AWS Security Hub のセキュリティチェックに対応し、CIS Benchmarks の推奨に準拠できるようになりました。
Firelens を含む ECS 環境全体を非 root で統一できるため、金融機関や医療機関などで求められるコンプライアンス要件に完全に対応できます。
使い方
新機能の使い方を、Docker イメージの作成からタスク定義の設定、動作確認までを説明します。
カスタム Docker イメージの作成
非 root ユーザーを含むカスタムイメージを作成します。
Dockerfile の作成
FROM public.ecr.aws/aws-observability/aws-for-fluent-bit:stable
# 非 root ユーザーの作成
RUN useradd -u 1000 -r -s /bin/false fluent-bit
# 必要なディレクトリのパーミッション設定
RUN chown -R fluent-bit:fluent-bit /fluent-bit
# 非 root ユーザーに切り替え
USER fluent-bit
Docker イメージのビルド
# Dockerイメージをビルド
docker build -t fluent-bit-nonroot .
# ビルドされたイメージを確認
docker images | grep fluent-bit-nonroot
Amazon ECR へのプッシュ
作成したカスタムイメージを Amazon ECR にプッシュします。
ECR リポジトリの作成
aws ecr create-repository \
--repository-name fluent-bit-nonroot \
--region ap-northeast-1
イメージのプッシュ
# ECR にログイン
aws ecr get-login-password --region ap-northeast-1 | \
docker login --username AWS --password-stdin \
<account-id>.dkr.ecr.ap-northeast-1.amazonaws.com
# イメージにタグ付け
docker tag fluent-bit-nonroot:latest \
<account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/fluent-bit-nonroot:latest
# プッシュ
docker push <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/fluent-bit-nonroot:latest
タスク定義の作成
カスタムイメージを使用したタスク定義を作成します。
{
"family": "firelens-nonroot-example",
"taskRoleArn": "arn:aws:iam::<account-id>:role/ecsTaskRole",
"executionRoleArn": "arn:aws:iam::<account-id>:role/ecsTaskExecutionRole",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512",
"containerDefinitions": [
{
"name": "log_router",
"image": "<account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/fluent-bit-nonroot:latest",
"user": "1000",
"essential": true,
"firelensConfiguration": {
"type": "fluentbit"
},
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/firelens",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "firelens",
"awslogs-create-group": "true"
}
}
},
{
"name": "app",
"image": "httpd:latest",
"essential": true,
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
],
"logConfiguration": {
"logDriver": "awsfirelens",
"options": {
"Name": "cloudwatch",
"region": "ap-northeast-1",
"log_group_name": "/aws/ecs/application",
"auto_create_group": "true",
"log_stream_prefix": "app"
}
}
}
]
}
サービスの作成
- 上記のタスク定義を登録
- サービスを作成してデプロイ
※ ECS Exec をオンにしたうえでタスクの実行をするようにしてください。
実行ユーザーの確認
タスクが起動したら、実際に非 root ユーザーで動作しているか確認します。
# タスク ARN を取得
TASK_ARN=$(aws ecs list-tasks \
--cluster <cluster-name> \
--family firelens-nonroot-example \
--query 'taskArns[0]' \
--output text)
# ECS Exec で接続
aws ecs execute-command \
--cluster <cluster-name> \
--task $TASK_ARN \
--container log_router \
--interactive \
--command "ps aux"
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
fluent-+ 1 0.0 5.6 4072488 53824 ? Ssl 15:35 0:00 /fluent-bit/bin
Fluent Bit プロセスが fluent-+(fluent-bit ユーザー)で実行されており、非 root ユーザーで動作していることが確認できます。
コストと制限事項
新機能を利用する前に知っておくべきコストと制限事項について説明します。
料金体系
今回の機能追加に伴う追加のコストは発生しません。
制限事項
機能面の制限
- EC2 起動タイプの場合、以下が必要
- ECS Agent 1.96.0 以降
- ECS-optimized AMI v20250716 以降
- Windows コンテナではサポートされていない
運用上の注意点
- 非 root ユーザーはポート 1024 以下をバインドできない
- カスタム Fluent Bit/Fluentd 設定を使用している場合、パーミッション関連の動作を事前に確認する必要がある
- 既存の Firelens 環境から移行する際は、開発環境で十分にテストすることを推奨
まとめ
今回発表された新機能により、Firelens コンテナを非 root ユーザーとして実行できるようになりました。
これにより、ECS 環境全体を非 root で統一でき、セキュリティリスクの軽減とコンプライアンス要件への対応が可能になります。
設定もタスク定義に user フィールドを追加するだけとシンプルで、追加のコストも発生しません。
既存の Firelens 環境を使用している場合は、ぜひ非 root ユーザーへの移行を検討してみてください。
参考リンク
https://aws.amazon.com/jp/about-aws/whats-new/2025/10/amazon-ecs-running-firelens-as-nonroot-user/
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html