

# 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)를 참조하세요.

# 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 Management Console을 사용하여 공유 네임스페이스가 있는 서비스를 생성하는 방법**

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. 서비스 생성 프로세스를 완료하세요.