[アップデート] ECS Service Connect エージェントのアクセスログを出力可能になりました

[アップデート] ECS Service Connect エージェントのアクセスログを出力可能になりました

2025.11.11

概要

ECS サービスで Service Connect を有効化した際、Service Connect エージェントがサイドカーとして自動で挿入されます。
エージェントの実態としては AWS が管理する Envoy であり、Envoy 自体のアプリケーションログは以前から出力可能でした。
今回のアップデートで Envoy のアクセスログも含めて CloudWatch ログに出力可能になりました。

https://aws.amazon.com/about-aws/whats-new/2025/10/amazon-ecs-service-connect-envoy-access-logs/

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-connect-envoy-access-logs.html

Envoy 側のアクセスログに関するドキュメント

https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage

やってみる

「クライアント側のみ」を有効化した ECS サービス (Client) と「クライアントとサーバー」を有効化した ECS サービス (Server) を用意します。

arch.png

Server 側でアクセスログを有効化します。

sc-access-log-1.png

フォーマットとしてテキストと JSON を選択可能ですが、CloudWatch Logs Insights で扱いやすいので今回は JSON を選択します。

スクリーンショット 2025-11-11 16.57.43.png

クライアント側から HTTP リクエストを送った所、サーバー側で下記ログを出力できました。

{
  "start_time": "2025-11-11T07:40:46.216Z",
  "bytes_received": 0,
  "user_agent": "curl/8.11.1",
  "protocol": "HTTP/1.1",
  "forwarded_for": null,
  "bytes_sent": 11,
  "path": "/",
  "duration": 1,
  "request_id": "c13c6bc6-5a9e-4ee8-929d-7089c54f31fd",
  "method": "GET",
  "authority": "app.sample-namespace",
  "response_code": 200,
  "upstream_service_time": "1"
}

今回は HTTP リクエストの場合ですが、HTTP2 や gRPC、TCP のログフォーマットについても AWS 公式ドキュメント に記載されています。
※ 今回はサーバー側タスク定義の portMappings.appProtocolhttp を指定しています。

{
  "compatibilities": ["EC2", "FARGATE", "MANAGED_INSTANCES"],
  "containerDefinitions": [
    {
      "entryPoint": [],
      "environment": [],
      "essential": true,
      "image": "xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample-ecs-app:v1",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/sample-ecs-app",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "name": "App",
      "portMappings": [
        {
          "appProtocol": "http",
          "containerPort": 80,
          "hostPort": 80,
          "name": "app",
          "protocol": "tcp"
        }
      ],
      "secrets": []
    }
  ],
  "cpu": "256",
  "executionRoleArn": "arn:aws:iam::xxxxxxxxxxxx:role/MainStack-TaskExecutionRole250D2532-Rlp5UtlWi3H2",
  "family": "MainStackTaskDefinitionC957DE9A",
  "memory": "512",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "revision": 6,
  "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxx:task-definition/MainStackTaskDefinitionC957DE9A:6",
  "taskRoleArn": "arn:aws:iam::xxxxxxxxxxxx:role/MainStack-EcsTaskRole8DFA0181-1EKaZTXqypel",
  "volumes": [],
  "tags": []
}

クエリパラメータについて

デフォルトではメールアドレスなどの機密情報が乗る可能性があるクエリパラメータはログに出力されません。
「クエリパラメータを含める」にチェックを入れることで下記のように path 属性に含めることが可能です。

{
  "authority": "app.sample-namespace",
  "path": "/?key1=value1",
  "forwarded_for": null,
  "user_agent": "curl/8.11.1",
  "protocol": "HTTP/1.1",
  "request_id": "472e98e9-4e1e-48bf-be3f-fce64d172688",
  "response_code": 200,
  "duration": 1,
  "method": "GET",
  "upstream_service_time": "1",
  "bytes_sent": 11,
  "bytes_received": 0,
  "start_time": "2025-11-11T08:18:10.196Z"
}

ログの振り分けについて

アプリケーションログとアクセスログの両方が同一のログストリームに配信されるので、振り分けるなら Fluent Bit などで分ける必要があります。

スクリーンショット 2025-11-11 19.19.40.png

混じった状態で Logs Insights で検索してしまうのもありですが、コストが気になる場合はアクセスログを Fluent Bit 経由で S3 などに転送すると良いでしょう。

スクリーンショット 2025-11-11 19.26.10.png

最後に

ECS Service Connect でカスタマイズできる部分がまた一つ増えました。
特にセキュリティ要件でアクセスログが必須な場合でも利用できるようになったのは大きいと思います。

この記事をシェアする

FacebookHatena blogX

関連記事