

# Amazon ECS Service Connect アクセスログ
<a name="service-connect-envoy-access-logs"></a>

Amazon ECS Service Connect は、Service Connect プロキシによって処理された個別のリクエストに関する詳細なテレメトリを提示するアクセスログをサポートします。アクセスログは、HTTP メソッド、パス、レスポンスコード、フラグ、タイミング情報などのリクエストごとのトラフィックメタデータをキャプチャすることで、既存のアプリケーションログを補完します。これにより、リクエストレベルのトラフィックパターンとサービスインタラクションをより詳細に観察できるため、効果的なトラブルシューティングとモニタリングが可能になります。

アクセスログを有効にするには、`serviceConnectConfiguration` オブジェクトで `logConfiguration` オブジェクトと `accessLogConfiguration` オブジェクトの両方を指定します。ログの形式と、ログについて `accessLogConfiguration` にクエリパラメータが含まれるかどうかを設定できます。ログは、`logConfiguration` で指定されたログドライバーによって送信先ロググループに配信されます。

```
{
    "serviceConnectConfiguration": {
        "enabled": true,
        "namespace": "myapp.namespace",
        "services": [
            ...
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "my-envoy-log-group",
                "awslogs-region": "us-west-2",
                "awslogs-stream-prefix": "myapp-envoy-logs"
            }
        },
         "accessLogConfiguration": {
            "format": "TEXT",
            "includeQueryParameters": "ENABLED" 
        }
    }
}
```

## 考慮事項
<a name="service-connect-envoy-access-logs-considerations"></a>

アクセスログへのアクセスを有効にする場合は、次の点を考慮してください。
+ アクセスログとアプリケーションログはどちらも `/dev/stdout` に書き込まれます。アクセスログをアプリケーションログから分離するには、カスタムの Fluent Bit または Fluentd の設定で `awsfirelens` ログドライバーを使用することをお勧めします。
+  `awslogs` ログドライバーを使用して、アプリケーションとアクセスログを同じ CloudWatch の宛先に送信することをお勧めします。
+ アクセスログは、プラットフォームバージョン `1.4.0` 以降を使用する Fargate サービスでサポートされています。
+ リクエスト ID やトークンなどのクエリパラメータは、デフォルトでアクセスログから除外されます。アクセスログにクエリパラメータが含まれるようにするには、`includeQueryParameters` を `"ENABLED"` に設定します。

## アクセスログの形式
<a name="service-connect-envoy-access-logs-formats"></a>

アクセスログは、JSON 形式のディクショナリまたはテキスト形式の文字列のいずれかでフォーマットできますが、異なるタイプのアクセスログでサポートされているコマンド演算子は異なります。

### HTTP アクセスログ
<a name="service-connect-envoy-access-logs-formats-http"></a>

HTTP ログには、デフォルトで次のコマンド演算子が含まれています。

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration_ms": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%"
}
```

------

### HTTP2 アクセスログ
<a name="service-connect-envoy-access-logs-formats-http2"></a>

HTTP ログに含まれるコマンド演算子に加えて、HTTP2 ログにはデフォルトで `%STREAM_ID%` 演算子が含まれます。

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%" "%STREAM_ID%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%",
  "stream_id": "%STREAM_ID%"
}
```

------

### gRPC アクセスログ
<a name="service-connect-envoy-access-logs-formats-grpc"></a>

HTTP ログに含まれるコマンド演算子に加えて、gRPC アクセスログにはデフォルトで `%STREAM_ID%` および `%GRPC_STATUS()%` の演算子が含まれます。

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %GRPC_STATUS()% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%" "%STREAM_ID%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "grpc_status": "%GRPC_STATUS()%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%",
  "stream_id": "%STREAM_ID%"
}
```

------

### TCP アクセスログ
<a name="service-connect-envoy-access-logs-formats-tcp"></a>

次のコマンド演算子は、デフォルトで TCP アクセスログに含まれています。

------
#### [ Text ]

```
[%START_TIME%] %DOWNSTREAM_REMOTE_ADDRESS% %DOWNSTREAM_REMOTE_PORT% 
%BYTES_RECEIVED% %BYTES_SENT% %DURATION%  
%CONNECTION_TERMINATION_DETAILS% %CONNECTION_ID%\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "downstream_remote_address": "%DOWNSTREAM_REMOTE_ADDRESS%",
  "downstream_remote_port": "%DOWNSTREAM_REMOTE_PORT%",s
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "connection_termination_details": "%CONNECTION_TERMINATION_DETAILS%",
  "connection_id": %CONNECTION_ID%
}
```

------

これらのコマンド演算子の詳細については、Envoy ドキュメントの「[コマンド演算子](https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#command-operators)」を参照してください。

# Amazon ECS Service Connect のアクセスログの有効化
<a name="service-connect-access-logs-configuration"></a>

Service Connect を使用する Amazon ECS サービスでは、アクセスログはデフォルトでは有効になっていません。以下の方法でアクセスログを有効にできます。

## AWS CLI を使用してアクセスログを有効にする
<a name="service-connect-access-logs-configure-cli"></a>

次のコマンドは、サービスの作成時に `accessLogConfiguration` を指定することで AWS CLI を使用して、Amazon ECS サービスのアクセスログを有効にする方法を示しています。

```
aws ecs create-service \
    --cluster my-cluster \
    --service-name my-service \
    --task-definition my-task-def \
    --service-connect-configuration '{
        "enabled": true,
        "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-abcdef1234567890",
        "services": [{
            "portName": "web",
            "discoveryName": "my-service",
            "clientAliases": [{
                "port": 80,
                "dnsName": "my-service"
            }]
        }],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "my-envoy-log-group",
                "awslogs-region": "us-west-2",
                "awslogs-stream-prefix": "myapp-envoy-logs"
            }
        },
         "accessLogConfiguration": {
            "format": "TEXT",
            "includeQueryParameters": "ENABLED" 
        }
    }'
```

## コンソールを使用してアクセスログを有効にする
<a name="service-connect-access-logs-configure-console"></a>

サービス作成手順の詳細については、「[Amazon ECS のローリング更新デプロイの作成](create-service-console-v2.md)」を参照してください。

**AWS マネジメントコンソールを使用して共有名前空間でサービスを作成するには**

1. コンソールを[https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)で開きます。

1. **[クラスター]** ページで、サービスを作成するクラスターを選択します。

1. **[サービス]** で **[作成]** を選択します。

1. ワークロードに応じて他の詳細情報を入力したら、**[Service Connect]** セクションで **[Service Connect を使う]** を選択します。

1. 必要に応じて、サービスタイプ (クライアントまたはクライアントサーバー) の Service Connect 設定を構成します。

1. **[アクセスログ設定]** を展開します。**[形式]** で、**[JSON]** または [`TEXT`] を選択します。

1. アクセスログにクエリパラメータが含まれるようにするには、**[クエリパラメータを含める]** を選択します。

1. サービスの作成プロセスを完了します。