

# CloudWatch 도구 및 Internet Monitor 쿼리 인터페이스로 데이터 탐색
<a name="CloudWatch-IM-view-cw-tools"></a>

Internet Monitor 대시보드를 사용하여 애플리케이션에 대한 성능 및 가용성을 시각화하는 것 외에도 Internet Monitor가 생성하는 데이터를 심층 분석하는 데 사용할 수 있는 몇 가지 방법이 있습니다. 이러한 방법에는 CloudWatch 로그 파일에 저장된 Internet Monitor 데이터와 함께 CloudWatch 도구를 사용하고 Internet Monitor 쿼리 인터페이스를 사용하는 것이 포함됩니다. 사용할 수 있는 도구로 CloudWatch Logs Insights, CloudWatch Metrics, CloudWatch Contributor Insights, Amazon Athena 등이 있습니다. 필요에 따라 대시보드뿐만 아니라 이러한 도구 일부 또는 전체를 사용하여 Internet Monitor 데이터를 탐색할 수 있습니다.

Internet Monitor는 애플리케이션 및 각 AWS 리전으로 전송되는 트래픽에 대한 CloudWatch 지표를 집계하고 총 트래픽 영향, 가용성, 왕복 시간과 같은 데이터를 포함합니다. 이 데이터는 CloudWatch Logs에 게시되며 Internet Monitor 쿼리 인터페이스에서도 사용할 수 있습니다. 지리적 세분성과 각 데이터에 대해 탐색할 수 있는 기타 측면에 대한 세부 정보는 다양합니다.

Internet Monitor는 5분 간격으로 모니터용 데이터를 게시한 다음 여러 가지 방법으로 데이터를 사용할 수 있도록 합니다. 다음 표에는 Internet Monitor 데이터에 액세스하는 시나리오가 나열되어 있으며 각 시나리오에 대해 수집되는 데이터의 특징이 설명되어 있습니다.


****  

| 기능 | CloudWatch Logs | S3로 내보내기 | 쿼리 인터페이스 | CloudWatch 대시보드 | 
| --- | --- | --- | --- | --- | 
| 기본적으로 사용됩니다. | 예 | 아니요 | 예 | 예 | 
| 데이터가 수집되는 도시-네트워크 수 | 상위 500개(아래 참고 참조) | 모두 | 모두 | 모두 | 
| 데이터 보존 | 사용자 제어 | 사용자 제어 | 30일 | 30일 | 
| 데이터 수집 대상 지리적 세부 정보 | 전체(도시-네트워크, 메트로\$1네트워크, 세분\$1네트워크, 국가\$1네트워크) | 도시-네트워크 | 전체(도시-네트워크, 메트로\$1네트워크, 세분\$1네트워크, 국가\$1네트워크) | 전체(도시-네트워크, 메트로\$1네트워크, 세분\$1네트워크, 국가\$1네트워크) | 
| 데이터 쿼리 및 필터링 방법 | [CloudWatch Logs Insights를 사용하여 Internet Monitor 측정값 살펴보기](CloudWatch-IM-view-cw-tools-logs-insights.md) | [Amazon Athena를 사용하여 Amazon S3 로그 파일에서 인터넷 측정값 쿼리](CloudWatch-IM-view-cw-tools.S3_athena.md) | [Internet Monitor 쿼리 인터페이스 사용](CloudWatch-IM-view-cw-tools-cwim-query.md) | [Internet Monitor 대시보드로 모니터링 및 최적화](CloudWatch-IM-monitor-and-optimize.md) | 

참고: 도시-네트워크의 경우 상위 500개 측정치, 메트로\$1네트워크는 상위 250개, 세분\$1네트워크는 상위 100개, 국가\$1네트워크는 상위 50개의 측정값이 캡처됩니다.

이 장에서는 CloudWatch 도구 또는 Internet Monitor 쿼리 인터페이스를 사용하여 데이터를 쿼리하고 탐색하는 방법을 각 방법의 예시와 함께 설명합니다.

**Topics**
+ [CloudWatch Logs Insights](CloudWatch-IM-view-cw-tools-logs-insights.md)
+ [CloudWatch Contributor Insights](CloudWatch-IM-view-cw-tools-contributor-insights.md)
+ [CloudWatch 지표](CloudWatch-IM-view-cw-tools-metrics-dashboard.md)
+ [Athena와 S3 로그](CloudWatch-IM-view-cw-tools.S3_athena.md)
+ [Internet Monitor 쿼리 인터페이스](CloudWatch-IM-view-cw-tools-cwim-query.md)

# CloudWatch Logs Insights를 사용하여 Internet Monitor 측정값 살펴보기
<a name="CloudWatch-IM-view-cw-tools-logs-insights"></a>

CloudWatch Logs Insights 쿼리를 사용하여 특정 도시 또는 지리(클라이언트 위치), 클라이언트 ASN(ISP) 및 AWS 소스 위치에 대한 로그 하위 세트를 필터링할 수 있습니다. Internet Monitor는 CloudWatch Logs Insights를 사용하여 살펴볼 수 있는 CloudWatch Logs에 대한 가용성 및 왕복 시간의 세분화된 측정값을 게시합니다.

Internet Monitor의 클라이언트 위치 정확도에 대해 자세히 알아보려면 [Internet Monitor의 지리적 위치 정보 및 정확도](CloudWatch-IM-inside-internet-monitor.md#IMGeolocationSourceAccuracy)를 참조하세요.

이 섹션의 예를 통해 자체 애플리케이션 트래픽 측정 및 지표에 대해 자세히 알아볼 수 있는 CloudWatch 로그 인사이트 쿼리를 생성할 수 있습니다. CloudWatch Logs Insights에서 이 예를 사용하는 경우 *monitorName*을 자신의 모니터 이름으로 바꾸세요.

**트래픽 최적화 제안 보기**

Internet Monitor의 **트래픽 인사이트** 탭에서 위치별로 필터링된 트래픽 최적화 제안을 볼 수 있습니다. 해당 탭의 **트래픽 최적화 제안** 섹션에 표시되는 것과 동일한 정보를 보려면 위치 세분성 필터를 사용하지 않고 다음 CloudWatch Logs Insights 쿼리를 사용하세요.

1. AWS Management Console에서 CloudWatch Logs Insights로 이동합니다.

1. **Log Group**(로그 그룹)에서 `/aws/internet-monitor/monitorName/byCity`와 `/aws/internet-monitor/monitorName/byCountry`를 선택한 다음 시간 범위를 지정합니다.

1. 다음 쿼리를 추가하고 실행합니다.

```
fields @timestamp, 
clientLocation.city as @city, clientLocation.subdivision as @subdivision, clientLocation.country as @country,
`trafficInsights.timeToFirstByte.currentExperience.serviceName` as @serviceNameField,
concat(@serviceNameField, ` (`, `serviceLocation`, `)`) as @currentExperienceField,
concat(`trafficInsights.timeToFirstByte.ec2.serviceName`, ` (`, `trafficInsights.timeToFirstByte.ec2.serviceLocation`, `)`) as @ec2Field,
`trafficInsights.timeToFirstByte.cloudfront.serviceName` as @cloudfrontField,
concat(`clientLocation.networkName`, ` (AS`, `clientLocation.asn`, `)`) as @networkName
| filter ispresent(`trafficInsights.timeToFirstByte.currentExperience.value`)
| stats avg(`trafficInsights.timeToFirstByte.currentExperience.value`) as @averageTTFB,
avg(`trafficInsights.timeToFirstByte.ec2.value`) as @ec2TTFB,
avg(`trafficInsights.timeToFirstByte.cloudfront.value`) as @cloudfrontTTFB,
sum(`bytesIn` + `bytesOut`) as @totalBytes,
latest(@ec2Field) as @ec2,
latest(@currentExperienceField) as @currentExperience,
latest(@cloudfrontField) as @cloudfront,
count(*) by @networkName, @city, @subdivision, @country
| display @city, @subdivision, @country, @networkName, @totalBytes, @currentExperience, @averageTTFB, @ec2, @ec2TTFB, @cloudfront, @cloudfrontTTFB
| sort @totalBytes desc
```

**인터넷 가용성 및 RTT(p50, p90, p95) 보기**

트래픽에 대한 인터넷 가용성 및 왕복 시간(p50, p90, p95)을 보려면 다음 CloudWatch Logs Insights 쿼리를 사용하세요.

**최종 사용자 지역:** 미국 일리노이주 시카고

**최종 사용자 네트워크(ASN):** AS7018 

**AWS 서비스 위치:** 미국 동부(버지니아 북부) 리전

다음 방법으로 로그를 볼 수 있습니다.

1. AWS Management Console에서 CloudWatch Logs Insights로 이동합니다.

1. **Log Group**(로그 그룹)에서 `/aws/internet-monitor/monitorName/byCity`와 `/aws/internet-monitor/monitorName/byCountry`를 선택한 다음 시간 범위를 지정합니다.

1. 다음 쿼리를 추가하고 실행합니다.

이 쿼리는 선택한 기간 동안 일리노이주 시카고에 있는 AS7018에서 미국 동부(버지니아 북부) 리전으로 연결한 사용자의 모든 성능 데이터를 반환합니다.

```
fields @timestamp, 
internetHealth.availability.experienceScore as availabilityExperienceScore, 
internetHealth.availability.percentageOfTotalTrafficImpacted as percentageOfTotalTrafficImpacted,
internetHealth.performance.experienceScore as performanceExperienceScore,
internetHealth.performance.roundTripTime.p50 as roundTripTimep50, 
internetHealth.performance.roundTripTime.p90 as roundTripTimep90, 
internetHealth.performance.roundTripTime.p95 as roundTripTimep95
 | filter clientLocation.country == `United States` 
 and clientLocation.city == `Chicago` 
 and serviceLocation == `us-east-1` 
 and clientLocation.asn == 7018
```

자세한 내용은 [CloudWatch Logs Insights를 사용한 로그 분석](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)을 참조하세요.

# Contributor Insights를 사용하여 상위 위치 및 ISP 식별
<a name="CloudWatch-IM-view-cw-tools-contributor-insights"></a>

CloudWatch Contributor Insights는 AWS 애플리케이션의 상위 클라이언트 위치 및 ASN(일반적으로 인터넷 서비스 제공업체(ISP))를 식별하는 데 도움이 됩니다. 다음 샘플 Contributor Insights 규칙으로 Internet Monitor에서 유용한 규칙을 시작합니다. 자세한 내용은 [CloudWatch에서 Contributor Insights 규칙 생성](ContributorInsights-CreateRule.md) 섹션을 참조하세요.

Internet Monitor의 클라이언트 위치 정확도에 대해 자세히 알아보려면 [Internet Monitor의 지리적 위치 정보 및 정확도](CloudWatch-IM-inside-internet-monitor.md#IMGeolocationSourceAccuracy)를 참조하세요.

**참고**  
Internet Monitor에서는 5분마다 인터넷 측정값 데이터를 저장하므로 Contributor Insights 규칙을 설정한 후 그래프를 보려면 기간을 5분으로 조정해야 합니다.

**가용성 영향의 영향을 받는 상위 위치 및 ASN 보기**

가용성 저하로 인해 영향을 받는 상위 클라이언트 위치 및 ASN을 보려면 구문 편집기에서 다음 Contributor Insights 규칙을 사용하면 됩니다. *monitor-name*을 사용자의 모니터 이름으로 바꿉니다.

```
{
    "Schema": {
        "Name": "CloudWatchLogRule",
        "Version": 1
    },
    "AggregateOn": "Sum",
    "Contribution": {
        "Filters": [
            {
                "Match": "$.clientLocation.city",
                "IsPresent": true
            }
        ],
        "Keys": [
            "$.clientLocation.city",
            "$.clientLocation.networkName"
        ],
        "ValueOf": "$.awsInternetHealth.availability.percentageOfTotalTrafficImpacted"
    },
    "LogFormat": "JSON",
    "LogGroupNames": [
        "/aws/internet-monitor/monitor-name/byCity"
    ]
}
```

**지연 시간 영향의 영향을 받는 상위 클라이언트 위치 및 ASN 보기**

왕복 시간(지연 시간) 증가의 영향을 받는 상위 클라이언트 위치 및 ASN을 보려면 구문 편집기에서 다음 Contributor Insights 규칙을 사용하세요. *monitor-name*을 사용자의 모니터 이름으로 바꿉니다.

```
{
    "Schema": {
        "Name": "CloudWatchLogRule",
        "Version": 1
    },
    "AggregateOn": "Sum",
    "Contribution": {
        "Filters": [            {
                "Match": "$.clientLocation.city",
                "IsPresent": true
            }
        ],
        "Keys": [
            "$.clientLocation.city",
            "$.clientLocation.networkName"
        ],
        "ValueOf": "$.awsInternetHealth.performance.percentageOfTotalTrafficImpacted"
    },
    "LogFormat": "JSON",
    "LogGroupNames": [
        "/aws/internet-monitor/monitor-name/byCity"
    ]
}
```

**총 트래픽 백분율에 따라 영향을 받는 상위 클라이언트 위치 및 ASN 보기**

총 트래픽 백분율에 따라 영향을 받는 상위 클라이언트 위치 및 ASN을 보려면 구문 편집기에서 다음 Contributor Insights 규칙을 사용하세요. *monitor-name*을 사용자의 모니터 이름으로 바꿉니다.

```
{
    "Schema": {
        "Name": "CloudWatchLogRule",
        "Version": 1
    },
    "AggregateOn": "Sum",
    "Contribution": {
        "Filters": [
            {
                "Match": "$.clientLocation.city",
                "IsPresent": true
            }
        ],
        "Keys": [
            "$.clientLocation.city",
            "$.clientLocation.networkName"
        ],
        "ValueOf": "$.percentageOfTotalTraffic"
    },
    "LogFormat": "JSON",
    "LogGroupNames": [
        "/aws/internet-monitor/monitor-name/byCity"
    ]
}
```

# CloudWatch Metrics에서 Internet Monitor 지표 보기 또는 경보 설정
<a name="CloudWatch-IM-view-cw-tools-metrics-dashboard"></a>

CloudWatch 콘솔에서 CloudWatch 경보 및 CloudWatch 지표를 사용하여 Internet Monitor 지표에 대한 경보를 보거나 설정할 수 있습니다. Internet Monitor는 성능, 가용성, 왕복 시간 및 처리량(초당 바이트)에 대한 지표를 포함하여 계정에 지표를 게시할 수 있습니다. 모니터에 대한 모든 지표를 찾으려면 CloudWatch 지표 대시보드에서 사용자 지정 네임스페이스 `AWS/InternetMonitor`를 참조하세요.

모니터의 도시-네트워크 최대 한도를 선택하는 데 도움이 되도록 이러한 여러 지표의 사용 사례를 보려면 [도시-네트워크 최대값 선택](IMCityNetworksMaximum.md)을 참조하세요. Internet Monitor의 경보 설정에 대한 자세한 내용은 [Internet Monitor를 사용하여 경보 생성](CloudWatch-IM-create-alarm.md) 섹션을 참조하세요.

지표는 모니터의 VPC, Network Load Balancer, CloudFront 배포 또는 WorkSpaces 디렉터리에 대한 모든 인터넷 트래픽과 모니터되는 각 AWS 리전 및 인터넷 엣지 로케이션에 대한 모든 트래픽에 대해 집계됩니다. 리전은 서비스 위치로 정의되며 모든 위치 또는 `us-east-1`과 같은 특정 리전일 수 있습니다.

참고: 도시-네트워크**는 클라이언트 위치와 클라이언트가 사용하는 ASN(일반적으로 인터넷 서비스 제공업체(ISP))의 페어입니다.

Internet Monitor는 다음 지표를 제공합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-IM-view-cw-tools-metrics-dashboard.html)

자세한 내용은 [Amazon CloudWatch의 지표](working_with_metrics.md) 섹션을 참조하세요.

# Amazon Athena를 사용하여 Amazon S3 로그 파일에서 인터넷 측정값 쿼리
<a name="CloudWatch-IM-view-cw-tools.S3_athena"></a>

Amazon Athena를 사용하여 Internet Monitor가 Amazon S3 버킷에 게시하는 인터넷 측정값을 쿼리하고 확인할 수 있습니다. Internet Monitor에는 애플리케이션의 인터넷 측정값을 모니터하는 도시-네트워크(클라이언트 위치 및 ASN, 일반적으로 인터넷 서비스 제공업체(ISP))의 인터넷 대상 트래픽에 대한 S3 버킷에 게시하는 옵션이 있습니다. S3에 대한 측정값 게시 여부와 관계없이 Internet Monitor는 각 모니터의 상위 500개(트래픽 볼륨 기준) 도시-네트워크에 대해 5분마다 인터넷 측정값을 CloudWatch 로그에 자동으로 게시합니다.

이 장에서는 S3 로그 파일에 있는 인터넷 측정값에 대해 Athena에서 테이블을 만드는 방법에 대한 단계와 측정값의 다양한 보기를 볼 수 있는 [예 쿼리](#CloudWatch-IM-view-cw-tools.S3_athena.athena-sample-queries)를 제공합니다. 예를 들어 지연 시간 영향에 따라 영향을 받은 상위 10개 도시-네트워크에 대해 쿼리할 수 있습니다.

## Amazon Athena를 사용하여 Internet Monitor에서 인터넷 측정값 테이블 생성
<a name="CloudWatch-IM-view-cw-tools.S3_athena.athena-queries"></a>

Internet Monitor S3 로그 파일과 함께 Athena를 사용하려면 먼저 인터넷 측정값에 대한 테이블을 생성하세요.

이 절차의 단계에 따라 S3 로그 파일을 기반으로 Athena에서 테이블을 생성합니다. 그러면 테이블에서 [다음 예 인터넷 측정값 쿼리](#CloudWatch-IM-view-cw-tools.S3_athena.athena-sample-queries)와 같은 Athena 쿼리를 실행하여 측정에 대한 정보를 얻을 수 있습니다.

**Athena 테이블을 만들려면**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/)에서 Athena 콘솔을 엽니다.

1. Athena 쿼리 편집기에서 쿼리 문을 입력하여 Internet Monitor 인터넷 측정값이 포함된 테이블을 생성합니다. 위치 파라미터의 값을 Internet Monitor 인터넷 측정값이 저장되는 S3 버킷의 위치로 바꿉니다.

   ```
   CREATE EXTERNAL TABLE internet_measurements (
       version INT,
       timestamp INT,
       clientlocation STRING,
       servicelocation STRING,
       percentageoftotaltraffic DOUBLE,
       bytesin INT,
       bytesout INT,
       clientconnectioncount INT,
       internethealth STRING,
       trafficinsights STRING
   )
   PARTITIONED BY (year STRING, month STRING, day STRING)
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   LOCATION
   's3://amzn-s3-demo-bucket/bucket_prefix/AWSLogs/account_id/internetmonitor/AWS_Region/'
   TBLPROPERTIES ('skip.header.line.count' = '1');
   ```

1. 데이터를 읽을 파티션을 생성하는 문을 입력합니다. 예를 들어 다음 쿼리는 지정된 날짜와 위치에 대해 단일 파티션을 생성합니다.

   ```
   ALTER TABLE internet_measurements
   ADD PARTITION (year = 'YYYY', month = 'MM', day = 'dd')
   LOCATION
   's3://amzn-s3-demo-bucket/bucket_prefix/AWSLogs/account_id/internetmonitor/AWS_Region/YYYY/MM/DD';
   ```

1. **실행**을 선택합니다.

**인터넷 측정값에 대한 Athena 문 예시**

다음은 테이블을 생성하는 문의 예입니다.

```
CREATE EXTERNAL TABLE internet_measurements (
    version INT,
    timestamp INT,
    clientlocation STRING,
    servicelocation STRING,
    percentageoftotaltraffic DOUBLE,
    bytesin INT,
    bytesout INT,
    clientconnectioncount INT,
    internethealth STRING,
    trafficinsights STRING
)
PARTITIONED BY (year STRING, month STRING, day STRING)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://internet-measurements/TestMonitor/AWSLogs/1111222233332/internetmonitor/us-east-2/'
TBLPROPERTIES ('skip.header.line.count' = '1');
```

다음은 데이터를 읽을 파티션을 생성하는 문의 예입니다.

```
ALTER TABLE internet_measurements
ADD PARTITION (year = '2023', month = '04', day = '07')
LOCATION 's3://internet-measurements/TestMonitor/AWSLogs/1111222233332/internetmonitor/us-east-2/2023/04/07/'
```

## Internet Monitor에서 인터넷 측정값에 사용할 샘플 Amazon Athena 쿼리
<a name="CloudWatch-IM-view-cw-tools.S3_athena.athena-sample-queries"></a>

이 섹션에는 Amazon Athena에서 Amazon S3에 게시된 애플리케이션의 인터넷 측정값에 대한 정보를 얻기 위해 사용할 수 있는 쿼리 예가 포함되어 있습니다.

**영향을 받는 상위 10개(총 트래픽 백분율 기준) 클라이언트 위치 및 ASN 쿼리**

이 Athena 쿼리를 실행하여 영향을 받는 상위 10개(총 트래픽 백분율 기준) 도시-네트워크, 즉 클라이언트 위치 및 ASN(일반적으로 인터넷 서비스 제공업체)을 반환합니다.

```
SELECT json_extract_scalar(clientLocation, '$.city') as city,
    json_extract_scalar(clientLocation, '$.networkname') as networkName,
    sum(percentageoftotaltraffic) as percentageoftotaltraffic
FROM internet_measurements
GROUP BY json_extract_scalar(clientLocation, '$.city'),
    json_extract_scalar(clientLocation, '$.networkname')
ORDER BY percentageoftotaltraffic desc
limit 10
```

**영향을 받는 상위 10개(가용성 기준) 클라이언트 위치 및 ASN 쿼리**

이 Athena 쿼리를 실행하여 영향을 받는 상위 10개(총 트래픽 백분율 기준) 도시-네트워크, 즉 클라이언트 위치 및 ASN(일반적으로 인터넷 서비스 제공업체)을 반환합니다.

```
SELECT json_extract_scalar(clientLocation, '$.city') as city,
    json_extract_scalar(clientLocation, '$.networkname') as networkName,
    sum(
        cast(
            json_extract_scalar(
                internetHealth,
                '$.availability.percentageoftotaltrafficimpacted'
            )
        as double ) 
    ) as percentageOfTotalTrafficImpacted
FROM internet_measurements
GROUP BY json_extract_scalar(clientLocation, '$.city'),
    json_extract_scalar(clientLocation, '$.networkname')
ORDER BY percentageOfTotalTrafficImpacted desc
limit 10
```

**영향을 받는 상위 10개(지연 시간 기준) 클라이언트 위치 및 ASN 쿼리 **

이 Athena 쿼리를 실행하여 영향을 받는(지연 시간 영향에 따라) 상위 10개 도시-네트워크, 즉 클라이언트 위치 및 ASN(일반적으로 인터넷 서비스 제공업체)을 반환합니다.

```
SELECT json_extract_scalar(clientLocation, '$.city') as city,
    json_extract_scalar(clientLocation, '$.networkname') as networkName,
    sum(
        cast(
            json_extract_scalar(
                internetHealth,
                '$.performance.percentageoftotaltrafficimpacted'
            )
        as double ) 
    ) as percentageOfTotalTrafficImpacted
FROM internet_measurements
GROUP BY json_extract_scalar(clientLocation, '$.city'),
    json_extract_scalar(clientLocation, '$.networkname')
ORDER BY percentageOfTotalTrafficImpacted desc
limit 10
```

**클라이언트 위치 및 ASN의 트래픽 하이라이트 쿼리 **

이 Athena 쿼리를 실행하여 도시-네트워크, 즉 클라이언트 위치 및 ASN(일반적으로 인터넷 서비스 제공업체)에 대한 가용성 점수, 성능 점수, 첫 바이트까지의 시간 등 트래픽 하이라이트를 반환합니다.

```
SELECT json_extract_scalar(clientLocation, '$.city') as city,
    json_extract_scalar(clientLocation, '$.subdivision') as subdivision,
    json_extract_scalar(clientLocation, '$.country') as country,
    avg(cast(json_extract_scalar(internetHealth, '$.availability.experiencescore') as double)) as availabilityScore,
    avg(cast(json_extract_scalar(internetHealth, '$.performance.experiencescore') as double)) performanceScore,
    avg(cast(json_extract_scalar(trafficinsights, '$.timetofirstbyte.currentexperience.value') as double)) as averageTTFB,
    sum(bytesIn) as bytesIn,
    sum(bytesOut) as bytesOut,
    sum(bytesIn + bytesOut) as totalBytes
FROM internet_measurements
where json_extract_scalar(clientLocation, '$.city') != 'N/A'
GROUP BY 
json_extract_scalar(clientLocation, '$.city'),
    json_extract_scalar(clientLocation, '$.subdivision'),
    json_extract_scalar(clientLocation, '$.country')
ORDER BY totalBytes desc
limit 100
```

Athena 사용에 대한 자세한 내용은 [Amazon Athena 사용 설명서](https://docs.aws.amazon.com/athena/latest/ug/)를 참조하세요.

# Internet Monitor 쿼리 인터페이스 사용
<a name="CloudWatch-IM-view-cw-tools-cwim-query"></a>

Internet Monitor *쿼리 인터페이스*를 사용하면 AWS 애플리케이션의 인터넷 트래픽을 더 자세히 파악할 수 있습니다. 쿼리 인터페이스를 사용하려면 선택한 데이터 필터를 사용하여 쿼리를 생성한 다음 쿼리를 실행하여 Internet Monitor 데이터의 하위 집합을 반환해야 합니다. 쿼리가 반환하는 데이터를 탐색하면 애플리케이션이 인터넷에서 어떻게 작동하는지 파악할 수 있습니다.

가용성 및 성능 점수, 전송된 바이트, 왕복 시간, 첫 번째 바이트까지 걸리는 시간(TTFB) 등 Internet Monitor가 모니터로 캡처하는 모든 지표를 쿼리하고 탐색할 수 있습니다.

Internet Monitor는 쿼리 인터페이스를 사용하여 Internet Monitor 콘솔 대시보드에서 탐색할 수 있는 데이터를 제공합니다. 대시보드의 **분석** 페이지 또는 **최적화** 페이지에서 검색 옵션을 사용하여 애플리케이션의 인터넷 데이터를 쿼리하고 필터링할 수 있습니다.

대시보드가 제공하는 것보다 더 유연하게 데이터를 탐색하고 필터링하려면 Internet Monitor API 작업을 AWS Command Line Interface 또는 AWS SDK와 함께 사용하여 쿼리 인터페이스를 직접 사용할 수 있습니다. 이 섹션에서는 쿼리 인터페이스에서 사용할 수 있는 쿼리 유형과 데이터의 하위 집합을 생성하여 애플리케이션의 인터넷 트래픽에 대한 인사이트를 얻기 위해 지정할 수 있는 필터를 소개합니다.

**Topics**
+ [쿼리 인터페이스 사용 방법](#CloudWatch-IM-view-cw-tools-cwim-query-use-query)
+ [쿼리 예제](#CloudWatch-IM-view-cw-tools-cwim-query-example-queries)
+ [쿼리 결과 가져오기](#CloudWatch-IM-view-cw-tools-cwim-query-get-data)
+ [문제 해결](#CloudWatch-IM-view-cw-tools-cwim-query-troubleshooting)

## 쿼리 인터페이스 사용 방법
<a name="CloudWatch-IM-view-cw-tools-cwim-query-use-query"></a>

쿼리 유형을 선택한 다음 필터 값을 지정하여 쿼리 인터페이스로 쿼리를 생성하고, 로그 파일 데이터의 원하는 특정 하위 집합을 반환합니다.** 그런 다음 데이터 하위 집합을 사용하여 추가 필터링 및 정렬, 보고서 생성 등의 작업을 수행할 수 있습니다.

쿼리 프로세스는 다음과 같습니다.

1. 쿼리를 실행하면 Internet Monitor가 쿼리의 고유한 `query ID`를 반환합니다. 이 섹션에서는 사용 가능한 쿼리 유형과 쿼리의 데이터를 필터링하는 옵션을 설명합니다. 작동 방식을 이해하려면 [쿼리 예제](#IMQueryInterfaceExamples)에 대한 섹션을 검토할 수 있습니다.

1. [GetQueryResults](https://docs.aws.amazon.com/internet-monitor/latest/api/API_GetQueryResults.html) API 작업을 통해 모니터 이름과 함께 쿼리 ID를 지정하여 쿼리에 대한 데이터 결과를 반환합니다. 각 쿼리 유형은 서로 다른 데이터 필드 세트를 반환합니다. 자세히 알아보려면 [쿼리 결과 가져오기](#IMGetQueryData)를 참조하세요.

쿼리 인터페이스는 다음과 같은 쿼리 유형을 제공합니다. 각 쿼리 유형은 다음과 같이 로그 파일의 트래픽에 대한 다양한 정보 세트를 반환합니다.
+ **측정:** 가용성 점수, 성능 점수, 총 트래픽, 왕복 시간을 5분 간격으로 제공합니다.
+ **상위 위치:** 모니터링 중인 상위 위치 및 ASN 조합에 대한 가용성 점수, 성능 점수, 총 트래픽, TTFB(첫 번째 바이트까지 시간) 정보를 트래픽 볼륨별로 제공합니다.
+ **주요 위치 세부 정보:** Amazon CloudFront용 TTFB, 현재 구성, 최고 성능의 Amazon EC2 구성을 1시간 간격으로 제공합니다.
+ **전반적인 트래픽 제안 사항:** 모니터링되는 AWS 위치마다 모든 트래픽에 대해 30일 가중 평균을 사용하여 TTFB를 제공합니다.
+ **전반적인 트래픽 제안 사항 세부 정보:** 제안된 AWS 위치의 상위 위치마다 30일 가중 평균을 사용하여 TTFB를 제공합니다.
+ **라우팅 제안:** IP 접두사에서 DNS 해석기의 AWS 위치로 향하는 예상 평균 왕복 시간(RTT)을 제공합니다. RTT는 1시간에 걸쳐 1시간 간격으로 계산됩니다.

특정 기준을 사용하여 데이터를 더 많이 필터링할 수 있습니다. 라우팅 제안을 제외한 대부분의 쿼리 유형에서는 다음 기준 중 하나 이상을 지정하여 필터링할 수 있습니다.
+ **AWS 위치:** AWS 위치에는 CloudFront 또는 AWS 리전과 같이(예:`us-east-2`) 지정할 수 있습니다.
+ **ASN:** DNS 해석기(일반적으로 ISP)의 Autonomous System Number(ASN)를 지정합니다. 예를 들어 4225와 같습니다.
+ **클라이언트 위치:** 위치는 도시, 대도시, 구역 또는 국가를 지정합니다.
+ **제안된 AWS 위치:** AWS 리전(예: `us-east-2`) 또는 AWS 로컬 영역을 지정합니다. 이 필터를 전체 트래픽 제안 세부 정보 쿼리 유형과 함께 사용할 수 있습니다.
+ **지역:** 일부 쿼리에서 `geo`를 지정합니다. 이는 `Top locations` 쿼리 유형을 사용하는 쿼리에는 필요하지만 다른 쿼리 유형에는 허용되지 않습니다. 필터 파라미터에서 `geo` 지정 시기를 이해하려면 [쿼리 예제](#IMQueryInterfaceExamples) 섹션을 참조하세요.

라우팅 제안 쿼리 유형에서 다음 기준 중 하나 이상을 지정하여 데이터를 더 많이 필터링할 수 있습니다.
+ **현재 AWS 위치:** AWS 리전을 `us-east-2`와 같이 지정합니다.
+ **제안된 AWS 위치:** AWS 리전(예: `us-east-2`) 또는 AWS 로컬 영역을 지정합니다.
+ **IPv4 접두사:** `192.0.2.0/24`과(와) 마찬가지로 표준 형식으로 IPv4 접두사를 지정합니다.
+ **모니터 ARN:** 특정 모니터의 ARN을 지정합니다.
+ **DNS 해석기 IP:** DNS 해석기의 IP 주소를 지정합니다.
+ **DNS 해석기 ISP:** DNS 해석기(일반적으로 ISP)의 이름을 `Cloudflare`과(와) 같이 지정합니다.
+ **DNS 해석기 ASN:** DNS 해석기의 Autonomous System Number(ASN)를 지정합니다. 예를 들어 4225와 같습니다.

데이터 필터링에 사용할 수 있는 연산자는 `EQUALS` 및 `NOT_EQUALS`입니다. 매개 변수 필터링에 대한 자세한 내용은 [FilterParameter](https://docs.aws.amazon.com/internet-monitor/latest/api/API_FilterParameter.html) API 작업을 참조하세요.

쿼리 인터페이스 작업에 대한 자세한 내용은 Internet Monitor API 참조 안내서의 다음 API 작업을 참조하세요.
+ 쿼리를 생성하고 실행하려면 [StartQuery](https://docs.aws.amazon.com/internet-monitor/latest/api/API_StartQuery.html) API 작업을 참조하세요.
+ 쿼리를 중지하려면 [StopQuery](https://docs.aws.amazon.com/internet-monitor/latest/api/API_StopQuery.html) API 작업을 참조하세요.
+ 생성한 쿼리의 데이터를 반환하려면 [GetQueryResults](https://docs.aws.amazon.com/internet-monitor/latest/api/API_GetQueryResults.html) API 작업을 참조하세요.
+ 쿼리 상태를 검색하려면 [GetQueryStatus](https://docs.aws.amazon.com/internet-monitor/latest/api/API_GetQueryStatus.html) API 작업을 참조하세요.

## 쿼리 예제
<a name="CloudWatch-IM-view-cw-tools-cwim-query-example-queries"></a>

모니터의 로그 파일에서 필터링된 데이터 세트를 검색하는 데 사용할 수 있는 쿼리를 생성하려면 [StartQuery](https://docs.aws.amazon.com/internet-monitor/latest/api/API_StartQuery.html) API 작업을 사용합니다. 쿼리 유형을 지정하고 쿼리의 매개 변수를 필터링합니다. 그런 다음 Internet Monitor 쿼리 인터페이스 API 작업을 사용하여 해당 쿼리를 사용한 쿼리 결과를 가져오면 작업하려는 데이터의 하위 집합이 검색됩니다.

쿼리 유형과 필터 매개변수의 작동 방식을 설명하기 위해 몇 가지 예를 살펴보겠습니다.

**예제 1**.

한 도시를 제외하고 특정 국가에 대한 모니터의 모든 로그 파일 데이터를 검색한다고 가정해 보겠습니다. 다음 예제는 이 시나리오의 `StartQuery` 작업으로 생성하 수 있는 쿼리의 필터 매개변수를 보여줍니다.

```
{
   MonitorName: "TestMonitor"
   StartTime: "2023-07-12T20:00:00Z"
   EndTime: "2023-07-12T21:00:00Z"
   QueryType: "MEASUREMENTS"
   FilterParameters: [
      {
       Field: "country",
       Operator: "EQUALS",
       Values: ["Germany"]
      },
      {
       Field: "city",
       Operator: "NOT_EQUALS",
       Values: ["Berlin"]
      },
    ]
}
```

**예제 2**.

또 다른 예로 상위 위치를 대도시별로 확인한다고 가정해 보겠습니다. 이 시나리오에서는 다음 예제 쿼리를 사용할 수 있습니다.

```
{
   MonitorName: "TestMonitor"
   StartTime: "2023-07-12T20:00:00Z"
   EndTime: "2023-07-12T21:00:00Z"
   QueryType: "TOP_LOCATIONS"
   FilterParameters: [
      {
       Field: "geo",
       Operator: "EQUALS",
       Values: ["metro"]
      },
    ]
}
```

**예 3**

이제 로스앤젤레스 대도시 지역의 주요 도시-네트워크 조합을 확인한다고 가정해 보겠습니다. 이렇게 하려면 `geo=city`을 지정하고 `metro`을 로스앤젤레스로 설정합니다. 이제 쿼리는 전체 상위 메트로\$1네트워크 대신 로스앤젤레스 대도시 지역의 상위 도시-네트워크를 반환합니다.

사용할 수 있는 예제 쿼리는 다음과 같습니다.

```
{
   MonitorName: "TestMonitor"
   StartTime: "2023-07-12T20:00:00Z"
   EndTime: "2023-07-12T21:00:00Z"
   QueryType: "TOP_LOCATIONS"
   FilterParameters: [
      {
       Field: "geo",
       Operator: "EQUALS",
       Values: ["city"]
      },
      {
       Field: "metro",
       Operator: "EQUALS",
       Values: ["Los Angeles"]
      }
    ]
}
```

**예 4**

다음으로, 특정 세분화(예: 미국의 주)에 대한 TTFB 데이터를 검색한다고 가정해 보겠습니다.

다음은 이 시나리오의 예제 쿼리입니다.

```
{
   MonitorName: "TestMonitor"
   StartTime: "2023-07-12T20:00:00Z"
   EndTime: "2023-07-12T21:00:00Z"
   QueryType: "TOP_LOCATION_DETAILS"
   FilterParameters: [
      {
       Field: "subdivision",
       Operator: "EQUALS",
       Values: ["California"]
      },
    ]
}
```

**예 5**

이제 애플리케이션에 클라이언트 트래픽이 있는 위치마다 TTFB 데이터를 검색한다고 가정해 보겠습니다.

다음은 이 시나리오의 예제 쿼리입니다.

```
{
   MonitorName: "TestMonitor"
   StartTime: "2023-07-12T20:00:00Z"
   EndTime: "2023-07-12T21:00:00Z"
   QueryType: "OVERALL_TRAFFIC_SUGGESTIONS"
   FilterParameters: []
}

Results:
[us-east-1, 40, us-west-2, 30],
[us-east-1, 40, us-west-1, 35],
[us-east-1, 40, us-east-1, 44],
[us-east-1, 40, CloudFront, 22],
...
[us-east-2, 44, us-west-2, 30],
[us-east-2, 44, us-west-1, 35],
...
```

**예제 6**

특정한 새 AWS 리전에 대한 TTFB 데이터를 검색한다고 가정해 보겠습니다.

다음은 이 시나리오의 예제 쿼리입니다.

```
{
   MonitorName: "TestMonitor"
   StartTime: "2023-07-12T20:00:00Z"
   EndTime: "2023-07-12T21:00:00Z"
   QueryType: "OVERALL_TRAFFIC_SUGGESTIONS_DETAILS"
   FilterParameters: [
      {
       Field: "proposed_aws_location",
       Operator: "EQUALS",
       Values: ["us-west-2"]
      },
   ]
}

Results:
[San Jose, San Jose-Santa Clara, California, United States, 7922, us-east-1, 40, 350, 350, us-west-2, 45]
[San Jose, San Jose-Santa Clara, California, United States, 7922, us-west-1, 35, 450, 450, us-west-2, 45]
```

**예제 7**

마지막 예는 특정 DNS 해석기의 데이터를 검색하는 것입니다.

다음은 이 시나리오의 예제 쿼리입니다.

```
{
   MonitorName: "TestMonitor"
   StartTime: "2023-07-12T20:00:00Z"
   EndTime: "2023-07-12T21:00:00Z"
   QueryType: "ROUTING_SUGGESTIONS"
   FilterParameters: [
      {
       Field: "proposed_aws_location",
       Operator: "EQUALS",
       Values: ["us-east-1"]
      },
   ]
}

Results:
[162.158.180.245, 13335, Cloudflare, [5.4.0.0/14], us-east-2, 200.0, us-east-1, 160.0]
[162.158.180.243, 13313, Cloudflare, [5.4.0.0/10], us-east-2, 150.0, us-east-1, 125.0]
```

## 쿼리 결과 가져오기
<a name="CloudWatch-IM-view-cw-tools-cwim-query-get-data"></a>

쿼리를 정의한 후 다른 Internet Monitor API 작업인 [GetQueryResults](https://docs.aws.amazon.com/internet-monitor/latest/api/API_GetQueryResults.html)를 실행하여 쿼리와 함께 결과 세트를 반환할 수 있습니다. `GetQueryResults`를 실행할 때 모니터 이름과 함께 정의한 쿼리의 쿼리 ID를 지정합니다. `GetQueryResults`가 지정된 쿼리의 데이터를 결과 집합으로 검색합니다.

쿼리 실행 시 `GetQueryResults`을 사용하여 결과를 확인하기 전에 쿼리 실행이 완료되었는지 확인하세요. [GetQueryStatus](https://docs.aws.amazon.com/internet-monitor/latest/api/API_GetQueryStatus.html) API 작업을 사용하여 쿼리가 완료되었는지 확인할 수 있습니다. 쿼리의 `Status`가 `SUCCEEDED`인 경우 결과를 검토할 수 있습니다.

쿼리가 완료되면 다음 정보를 결과를 검토하는 데 사용할 수 있습니다. 쿼리를 생성할 때 사용하는 각 쿼리 유형에는 다음 목록에 설명된 대로 로그 파일의 고유한 데이터 필드 세트가 포함됩니다.

**측정값**  
`measurements` 쿼리 유형은 다음과 같은 데이터를 반환합니다.  
`timestamp, availability, performance, bytes_in, bytes_out, rtt_p50, rtt_p90, rtt_p95`

**상위 위치**  
`top locations` 쿼리 유형은 위치별로 데이터를 그룹화하고 기간 동안의 평균 데이터를 제공합니다. 반환되는 데이터에는 다음이 포함됩니다.  
`aws_location, city, metro, subdivision, country, asn, availability, performance, bytes_in, bytes_out, current_fbl, best_ec2, best_ec2_region, best_cf_fbl`  
참고로 `city`, `metro`, `subdivision`는 `geo` 필드에서 해당 위치 유형을 선택한 경우에만 반환됩니다. `geo`에 지정한 위치 유형에 따라 다음과 같은 위치 필드가 반환됩니다.  

```
city = city, metro, subdivision, country
metro = metro, subdivision, country
subdivision = subdivision, country
country = country
```

**상위 위치 세부 정보**  
`top locations details` 쿼리 유형은 시간별로 그룹화된 데이터를 반환합니다. 이 쿼리는 다음과 같은 데이터를 반환합니다.  
`timestamp, current_service, current_fbl, best_ec2_fbl, best_ec2_region, best_cf_fbl`

**전체 트래픽 제안**  
`overall traffic suggestions` 쿼리 유형은 시간별로 그룹화된 데이터를 반환합니다. 이 쿼리는 다음과 같은 데이터를 반환합니다.  
`current_aws_location, proposed_aws_location, average_fbl, traffic, optimized_traffic_excluding_cf, optimized_traffic_including_cf`

**전체 트래픽 제안 세부 정보**  
`overall traffic suggestions details` 쿼리 유형은 시간별로 그룹화된 데이터를 반환합니다. 이 쿼리는 다음과 같은 데이터를 반환합니다.  
`aws_location, city, metro, subdivision, country, asn, traffic, current_aws_location, fbl_data`

**라우팅 제안**  
`routing suggestions` 쿼리 유형은 시간별로 그룹화된 데이터를 반환합니다. 이 쿼리는 다음과 같은 데이터를 반환합니다.  
`dns_resolver_ip, dns_resolver_asn, dns_resolver_isp, ipv4_prefixes, current_aws_location, current_latency, proposed_aws_location, proposed_latency`

`GetQueryResults` API 작업을 실행하면 Internet Monitor가 응답으로 다음을 반환합니다.
+ 쿼리가 반환하는 결과를 포함하는 *데이터 문자열 배열*입니다. 이 정보는 `Fields` 필드에 따라 정렬된 배열로 반환되며 API 호출에서도 반환됩니다. `Fields` 필드를 사용하여 `Data` 리포지토리의 정보를 파싱한 다음 용도에 맞게 추가로 필터링하거나 정렬할 수 있습니다.
+ 쿼리가 (`Data` 필드 응답에서) 데이터를 반환한 필드를 나열하는 *필드 배열*입니다. 배열의 각 항목은 이름-데이터 유형 쌍입니다(예: `availability_score`-`float`).

## 문제 해결
<a name="CloudWatch-IM-view-cw-tools-cwim-query-troubleshooting"></a>

쿼리 인터페이스 API 작업을 사용할 때 오류가 반환되는 경우 Internet Monitor를 사용에 필요한 권한이 있는지 확인하세요. 다음 권한이 활성화되어 있는지 확인하세요.

```
internetmonitor:StartQuery
internetmonitor:GetQueryStatus
internetmonitor:GetQueryResults
internetmonitor:StopQuery
```

이러한 권한은 콘솔의 Internet Monitor 대시보드를 사용하기 위한 권장 AWS Identity and Access Management 정책에 포함되어 있습니다. 자세한 내용은 [Internet Monitor에 대한 AWS 관리형 정책](CloudWatch-IM-permissions.md) 섹션을 참조하세요.