

# 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`에 기록됩니다. 액세스 로그를 애플리케이션 로그와 분리하려면 `awsfirelens` 로그 드라이버를 사용자 지정 Fluent Bit 또는 Fluentd 구성과 함께 사용하는 것이 좋습니다.
+  `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 설명서의 [Command Operators](https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#command-operators)를 참조하세요.