Amazon Web Services 한국 블로그

AWS Tools for PowerShell을 통한 Amazon CloudWatch 맞춤형 통계 구성 및 저장하기

이 글은 PowerShell용 AWS 도구를 사용하여 Amazon CloudWatch에서 지표 데이터를 작성하고 내보내는 절차를 안내합니다. Amazon CloudWatch 서비스는 로깅, 지표, 차트, 대시보드, 경보, 이벤트 등 주요 영역을 포괄하는 서비스입니다.

우선 CloudWatch 지표 영역, 특히 PowerShell 지표와의 관계를 짚고 넘어가겠습니다. 먼저 CloudWatch에서 지표 데이터를 작성하는 방법을 데모와 함께 살펴본 다음, CloudWatch에서 기존 지표를 찾는 방법을 소개하고, 마지막으로 특정 지표에서 지표 데이터 요소를 검색하는 방법을 알려 드리겠습니다.

Amazon CloudWatch는 최대 15개월 동안 지표 데이터를 저장합니다. 그러나 지표 데이터 보존 요건과 필요한 지표 세부 수준에 따라 Amazon CloudWatch의 데이터를 원하는 장기 보관 도구로 내보낼 수 있습니다. 내보낸 기록 데이터를 CloudWatch에서 사용하지 못할 수도 있지만, 시간이 경과한 이후에 Amazon QuickSight 및 Amazon Athena 등 다른 AWS 데이터 분석 도구를 사용하여 기록 데이터에 대한 보고서를 작성할 수 있습니다.

가정

이 기사에서는 AWS 계정이 있다고 가정합니다. 또한 PowerShell에 대한 기초적인 지식이 있고, PowerShell과 PowerShell용 AWS 도구를 선택한 플랫폼에 설치하고, CloudWatch에 대한 액세스 권한을 부여하는 데 필요한 IAM 정책과 AWS 자격 증명 파일을 이미 설정했다고 가정합니다. PowerShell에서 다양한 CloudWatch API를 호출하는 방법을 논의하고 시연하겠으니 이 주제에 대해 미리 준비하시기 바랍니다.

자세한 내용은 Getting Started guide for AWS Tools for PowerShell을 참조하십시오.

CloudWatch에 지표 데이터 쓰기

먼저 CloudWatch에서 사용자 지정 지표를 저장하는 방법을 살펴보겠습니다.

PowerShell용 AWS 도구에는 다음과 같은 명령이 있습니다. Write-CWMetricData. 이 PowerShell 명령은 궁극적으로 CloudWatch에 지표를 쓰는 PutMetricData API를 호출합니다. 이 명령은 파라미터가 몇 개뿐이므로 매우 쉽게 호출할 수 있습니다. 하지만 이 명령을 사용하기 전에 CloudWatch가 어떻게 작동하는지 알고 있어야 합니다.

  • CloudWatch 지표는 네임스페이스 내에 저장됩니다.
  • 지표 데이터 요소:
    • 이름이 있어야 합니다.
    • 0개 이상의 차원을 포함할 수 있습니다.
    • 값, 타임스탬프 및 측정 단위(예: 바이트, BytesPerSecond, 개수 등)를 포함할 수 있습니다.
    • 사용자 지정 스토리지 분해능(예: 1초, 5초, 60초(기본값) 등)을 지정할 수 있습니다.
  • PowerShell용 AWS 도구에서 하나 이상의 MetricDatum .NET 개체를 생성한 다음 Write-CWMetricData로 전달합니다.

우선 개념 정보는 미루어 두고 사용자 지정 지표를 생성하는 가장 간단한 방법에 대해 살펴보겠습니다. CloudWatch에 지표 데이터 요소를 쓰는 것이 곧 지표를 생성하는 방법입니다. 지표를 생성한 다음 데이터 요소를 지표에 쓰는 것이 별도의 작업이 아닙니다.

### First, we create one or more MetricDatum objects
$Metric = [Amazon.CloudWatch.Model.MetricDatum]::new()
$Metric.MetricName = 'UserCount'
$Metric.Value = 98

### Second, we write the metric data points to a CloudWatch metrics namespace
Write-CWMetricData -MetricData $Metric -Namespace trevortest/tsulli.loc

많은 지표를 추적해야 하는 경우 최상위 지표 네임스페이스가 복잡해지는 것을 방지하려면 지표 차원이 유용합니다. 예를 들어, 100개 이상의 Active Directory 도메인에 대해 “UserCount” 지표를 추적한다고 가정합시다. 모든 지표를 한 네임스페이스에 저장할 수 있지만, 이때 지표마다 “DomainName” 차원을 하나씩 생성해야 합니다. 차원의 값은 각 Active Directory 도메인의 이름입니다. 다음 스크린샷은 진행 중인 이 작업을 보여줍니다.

다음은 차원과 함께 CloudWatch에 지표를 쓰는 방법을 보여주는 PowerShell 코드 예제입니다. 이 문서에서 살펴본 샘플에서는 지표 하나를 작성하는 방법을 보여 주지만, 애플리케이션 코드에서 개별 AWS API를 호출하는 횟수를 줄이고자 노력해야 합니다. 동일한 PutMetricData API 호출에서 여러 지표 데이터 요소를 수집하고 작성하는 절차를 MetricDatum 객체 어레이로 통합해 보십시오. HTTP 연결 횟수와 연결 해제 횟수가 줄어들면 애플리케이션 성능이 향상되며, 그렇게 해도 지표를 원하는 수만큼 수집할 수 있습니다.

$Metric = [Amazon.CloudWatch.Model.MetricDatum]::new()
### Create a metric dimension, and set its name and value
$Dimension = [Amazon.CloudWatch.Model.Dimension]::new()
$Dimension.Name = 'DomainName'
$Dimension.Value = 'awstrevor.loc'

$Metric.MetricName = 'UserCount'
$Metric.Value = 76
### NOTE: Be sure you assign the Dimension object to the Dimensions property of the MetricDatum object
$Metric.Dimensions = $Dimension
Write-CWMetricData -MetricData $Metric -Namespace trevortest

CloudWatch에서 지표 목록 검색

지금까지 CloudWatch에 사용자 지정 지표를 작성했으므로 이제 지표를 검색하는 방법을 살펴보겠습니다. 시간이 지나면 다양한 리전에 걸쳐 AWS 계정에 수천 또는 수만 개의 지표가 생성됩니다. 따라서 분석 프로젝트와 관련한 지표를 찾는 방법을 알고 있어야 합니다.

물론, AWS Management Console을 사용하여 지표 네임스페이스를 보고, 각 네임스페이스에 포함된 지표와 지표 차원을 탐색할 수 있습니다. 이 방법은 초기에 플랫폼을 익히는 데 유용하지만 자동화를 사용하여 플랫폼에서 관련 데이터를 찾을 수 있다면 가장 좋을 것입니다. 자동화는 여러 AWS 리전과 여러 AWS 계정에 걸쳐 지표를 도입하여 그래픽 인터페이스를 통해 지표를 찾기 어려울 때 특히 유용합니다.

PowerShell용 AWS 도구에서 Get-CWMetricList 명령은 AWS ListMetrics API에 매핑됩니다. 이 명령은 CloudWatch에 저장된 지표에 대한 상위 수준의 정보 목록을 반환합니다. 계정에 많은 정보가 저장되어 있는 경우 매우 큰 목록이 반환될 수 있습니다. 고맙게도 PowerShell에는 원하는 지표를 찾는 데 도움이 되는 몇 가지 일반 정렬 및 필터링 명령이 있으며, Get-CWMetricList 명령의 일부 유용한 필터링 파라미터를 사용할 수 있습니다.

이 명령을 사용하는 방법에 대한 몇 가지 사례를 살펴보겠습니다.

가장 간단한 예부터 시작하여 현재 AWS 계정과 리전에서 모든 CloudWatch 지표의 목록을 검색해 보겠습니다.

Get-CWMetricList

이 명령의 결과가 약간 부담스럽게 느껴지더라도 상관 없습니다. -Namespace 파라미터를 사용하여 반환되는 지표를 특정 지표 네임스페이스로 필터링할 수 있습니다.

Get-CWMetricList -Namespace AWS/Lambda

어떤 지표 네임스페이스가 있는지 모른다면 어떻게 됩니까? PowerShell은 고유한 값을 필터링할 수 있는 유용한 명령을 제공합니다.

(Get-CWMetricList).Namespace | Select-Object -Unique

결과가 사전순으로 반환되지 않을 경우 눈으로 검색하기 어려울 수 있으므로 사전순으로 정렬하겠습니다.

(Get-CWMetricList).Namespace | Select-Object -Unique | Sort-Object

훨씬 좋아졌네요! 다른 옵션으로는 차원 키-값 페어를 기준으로 지표를 검색할 수 있습니다. 약간 길어졌지만 수천 개의 지표를 검색하는 데 유용한 구조입니다. 또한 간단한 래퍼 PowerShell 함수를 작성하여 다음 DimensionFilter 객체 중 하나를 쉽게 생성할 수 있습니다.

$Filter = [Amazon.CloudWatch.Model.DimensionFilter]::new()
$Filter.Name = 'DomainName'
$Filter.Value = 'tsulli.loc'
Get-CWMetricList -Dimension $Filter

특정 지표의 이름을 알고 있는 경우 해당 이름과 일치하는 지표 목록을 쿼리할 수 있습니다. 같은 이름을 가진 여러 지표가 있고 다른 차원이 동일한 네임스페이스에 존재할 경우 여러 개의 결과가 반환될 수 있습니다. 또한 차원의 유무에 상관없이 여러 네임스페이스에 유사한 이름을 가진 지표가 존재할 수 있습니다.

Get-CWMetricList -MetricName UserCount

PowerShell에 기본 제공되는 일반 Where-Object 명령은 전체 이름을 정확히 모를 때 지표 또는 네임스페이스를 찾는 데 매우 유용합니다.

이 예에서는 이름에 “User”가 들어가는 지표를 필터링하는 방법을 보여 줍니다.

Get-CWMetricList | Where-Object -FilterScript { $PSItem.Name -match 'User' }

네임스페이스를 기준으로 지표를 필터링하는 것은 매우 쉽습니다. 지표 네임스페이스에 저장된 지표 중 “EBS”로 끝나는 지표를 검색해 보겠습니다.

Get-CWMetricList | Where-Object -FilterScript { $PSItem.Namespace -match 'EBS$' }

이 예는 PowerShell을 사용하여 CloudWatch에서 지표를 찾는 방법을 보여주는 좋은 예입니다. 계속해서 PowerShell을 사용하여 CloudWatch에서 실제 지표 데이터 요소를 가져오는 방법을 알아보겠습니다.

CloudWatch에서 지표 데이터 가져오기

개념

지표 데이터는 CloudWatch에 한정된 시간 동안 저장됩니다. 지표가 CloudWatch에서 만료되기 이전에, 계층화된 시스템에 따라 지표 데이터 요소(“statistics” 지표)를 집계하고 더 큰 범주의 지표 데이터 요소로 저장합니다. 예를 들어, 분 단위로 수집된 지표는 15일이 지난 후 집계하여 5분 지표로 저장합니다. 집계 프로세스와 보관 기간에 대한 자세한 내용은 Amazon CloudWatch 지표 문서를 참조하십시오.

지표 데이터 요소가 3시간이 경과하면 CloudWatch에서 데이터 집계가 시작됩니다(이 문서 작성 시점 기준). 지표 데이터 요소를 가장 세부적인 수준으로 유지하려면 데이터가 만료되기 이전에 지표 데이터를 내보내야 합니다. Amazon EC2 Container Service(ECS)에 배포된 PowerShell 애플리케이션 또는 AWS Lambda와 같은 서비스를 이용하여 이 내보내기 프로세스를 확장 가능한 방식으로 실행할 수 있습니다.

지표가 CloudWatch에 저장되는 최장 기간은 15개월입니다. 지표 데이터를 15개월을 초과하여 저장하려면 CloudWatch에서 지표에 대한 집계를 수행하여 Amazon DynamoDBAmazon S3, Amazon RDS 등과 같은 대체 리포지토리에 저장하기 전에 지표 데이터를 쿼리해야 합니다.

PowerShell 심층 분석

지금까지 CloudWatch 지표를 검색하고 보관하는 몇 가지 개념적 주제에 대해 살펴보았으므로 이제 데이터 요소를 검색하는 실제 PowerShell 명령에 대해 알아보겠습니다.

PowerShell용 AWS 도구에는 Get-CWMetricStatistic명령이 포함되어 있습니다. 이 명령은 AWS의 GetMetricStatistics API에 매핑됩니다. 이 명령을 사용하여 CloudWatch 지표에서 세부 데이터 요소를 검색할 수 있습니다.

대량일 수 있는 데이터 세트를 쿼리할 것이므로 이 명령에서는 몇 가지 파라미터만 지정하겠습니다. 검색하려는 지표 네임스페이스, 이름, 시작 시간, 종료 시간, 기간 및 통계를 매우 구체적으로 지정해야 합니다.

이전 60분에 해당하는 Active Directory UserCount 지표에 대한 지표 데이터 요소를 1분마다 찾아 보겠습니다. 자세히 알아볼 수 있도록 API 응답을 변수에 할당합니다. 여러분은 이 지표가 없을 수도 있지만, 저는 한 동안 이 지표를 수집하여 약 1주 분량의 데이터를 1분 단위로 확보했습니다. 물론, 이 지표는 기본 제공 집계 정책을 준수하므로 이 1분 데이터도 최대 15일 동안만 유효합니다.

$Data = Get-CWMetricStatistic -Namespace ActiveDirectory/tsulli.loc -ExtendedStatistic p0.0 -MetricName UserCount -StartTime ([DateTime]::UtcNow.AddHours(-1)) -EndTime ([DateTime]::UtcNow) -Period 60

보시다시피 명령이 다소 길지만 명령 및 파라미터 이름을 완성할 수 있도록 도와주는 PowerShell의 탭 완성을 사용하면 너무 힘들지 않게 명령을 입력할 수 있습니다.

여기서는 최근 1시간에 해당하는 데이터를 쿼리하고 있으므로 응답에 정확히 60개의 데이터 요소가 있어야 합니다. API 응답의 Datapoints 속성에서 PowerShell의 기본 제공 Count 속성을 검사하여 이를 확인할 수 있습니다.

$Data.Datapoints.Count

데이터 요소가 시간순으로 반환되지 않으므로 PowerShell을 사용하여 데이터 요소를 정렬하고 최신 데이터 요소를 가져오겠습니다.

$Data.Datapoints | Sort-Object -Property Timestamp | Select-Object -Last 1
Average            : 0
ExtendedStatistics : {[p0.0, 19]}
Maximum            : 0
Minimum            : 0
SampleCount        : 0
Sum                : 0
Timestamp          : 10/14/17 4:27:00 PM
Unit               : Count

이제 이 데이터를 가져와서 원하는 외부 스토어로 내보내 장기 보존할 수 있습니다. 이 API에 대한 자세한 내용은 직접 확인해 보시기 바랍니다.

GetMetricStatistics API에서 세부 옵션을 사용할 수 있으므로 문서를 끝까지 읽어보고 API를 직접 시험해 보시기 바랍니다. 앞에서 설명한 대로 데이터 요소를 CloudWatch 지표에서 대체 데이터 원본으로 내보내려면 이 API를 광범위하게 사용해야 합니다.

마무리

이 글에서는 PowerShell용 AWS 도구를 사용하여 Amazon CloudWatch에 지표를 작성하고, 지표를 검색 또는 쿼리하고, 지표 데이터 요소를 검색하는 방법을 살펴보았습니다. Amazon CloudWatch를 다양한 다른 서비스와 통합하여 목표를 달성할 수 있는 방법을 생각해 보실 것을 권장합니다.

지표 데이터를 CloudWatch에 저장한 후 해당 데이터에 대한 대시보드를 작성하고, 인프라 및 애플리케이션 문제에 대해 알려주는 CloudWatch 경보를 연결하고, 자동화된 수정 작업을 수행할 수 있습니다. 한계가 없으므로 빌더의 마음으로 창작 활동을 시작해 보십시오.

이 글은 AWS 개발자 블로그의 Writing and Archiving Custom Metrics using Amazon CloudWatch and AWS Tools for PowerShell 의 한국어 번역으로 AWS 솔루션 아키텍트인 Trevor Sullivan가 작성해 주셨습니다.