Justin의 개발 로그
article thumbnail

CloudWatch의 사용자 지표에 대해 이해하려면 아래 링크를 먼저 확인

https://aws.amazon.com/ko/premiumsupport/knowledge-center/cloudwatch-custom-metrics/

 

CloudWatch에서 사용자 지정 지표 생성

정상 조건의 경우 이 변수는 0입니다. 두 조건이 모두 충족되는 상황에서는 값이 1로 설정됩니다. 그런 다음 이러한 파라미터를 중심으로 사용자 지정 경보를 구축하여 시스템에 문제가 있는 상황을 경고합니다.

aws.amazon.com

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/mon-scripts.html

 

Monitoring Memory and Disk Metrics for Amazon EC2 Linux Instances - Amazon Elastic Compute Cloud

Monitoring Memory and Disk Metrics for Amazon EC2 Linux Instances You can use Amazon CloudWatch to collect metrics and logs from the operating systems for your EC2 instances. CloudWatch Agent You can use the CloudWatch agent to collect both system metrics

docs.aws.amazon.com

 

이해를 돕기 위해 쉬운 샘플부터 해 봅시다.

  • EC2-Instance에 접속 합니다.

$vi send_metric_data.sh

#!/bin/bash
die() { status=$1; shift; echo "FATAL: $*"; exit $status; }
EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"

#입력받은 값을 CloudWatch로 전송하기 위해 변수에 담습니다.
VALUE=$1

aws cloudwatch put-metric-data --metric-name test-metric-justin1 --dimensions Instance=$EC2_INSTANCE_ID  --namespace "Custom" --value $VALUE

 

[접은 글]169.254.169.254는 뭐지???

 

$chmod -x send_metric_data.sh

$./send_metric_data.sh 98

 

  • 만약 아래와 같은 에러가 나면 기존 region을 지정합니다.
    You must specify a region. You can also configure your region by running "aws configure".

$ aws configure set region ap-northeast-2

 

$./send_metric_data.sh 100

 

  • 방금 날린 값이 CloudWatch에 전송되었는지 확인해 봅시다.

 

 

 

 

자 그럼, 제대로된 로그를 날려 봅시다. 메모리와 CPU에 대한 로그를 전송할 예정입니다.

 

1. IAM > 정책 생성

 

정책명 : CloudWatchLogs

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "cloudwatch:PutMetricData",
                "logs:DescribeLogStreams",
                "ec2:DescribeTags"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

 

2. IAM > 역할에 정책 연결

 

 

3. EC2 인스턴스에 역할 연결

EC2 인스턴스에 역할을 연결할 때는 INSTANCE PROFILE ARN 이름을 찾아 선택해야 합니다.

 

AWS IAM에 대해 좀 더 알고 싶다면...

더보기

IAM 식별자 부연 설명

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns

 

 

  • IAM : Identity and Access Management
  • ARN : Amazon Resource Name(아마존 리소스 이름)
  • AWS 계정 - 계정 자체:

    arn:aws:iam::123456789012:root

  • 계정의 IAM 사용자:

    arn:aws:iam::123456789012:user/Bob

  • 조직 차트를 반영하는 경로를 갖는 다른 사용자:

    arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob

  • IAM 그룹:

    arn:aws:iam::123456789012:group/Developers

  • 경로를 포함하는 IAM 그룹:

    arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_A/Developers

  • IAM 역할:

    arn:aws:iam::123456789012:role/S3Access

  • 관리형 정책:

    arn:aws:iam::123456789012:policy/ManageCredentialsPermissions

  • EC2 인스턴스와 연결될 수 있는 인스턴스 프로파일:

    arn:aws:iam::123456789012:instance-profile/Webserver

  • IAM에서 'Bob'으로 식별되는 연동 사용자:

    arn:aws:sts::123456789012:federated-user/Bob

  • 역할 세션 이름 'Mary'로 역할 'Accounting-Role'을 수임하는 누군가의 활성 세션:

    arn:aws:sts::123456789012:assumed-role/Accounting-Role/Mary

  • 사용자 이름 Bob에 할당된 멀티 팩터 인증 디바이스:

    arn:aws:iam::123456789012:mfa/Bob

  • 서버 인증서

    arn:aws:iam::123456789012:server-certificate/ProdServerCert

  • 조직 차트를 반영하는 경로를 갖는 서버 인증서:

    arn:aws:iam::123456789012:server-certificate/division_abc/subdivision_xyz/ProdServerCert

  • 자격 증명 공급자(SAML 및 OIDC):

    arn:aws:iam::123456789012:saml-provider/ADFSProvider

    arn:aws:iam::123456789012:oidc-provider/GoogleProvider 

 

 

 

4. EC2 인스턴스에 아래 작업 진행

/* Perl 모듈 설치 */
sudo yum -y install perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https

/* 모니터링 스크립트 다운로드 */
curl http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip -O
 
/* 압축해제 */
unzip CloudWatchMonitoringScripts-1.2.1.zip

/* 압축파일 삭제 */
rm CloudWatchMonitoringScripts-1.2.1.zip

/* 압축 해제 후 생성된 폴더로 이동 */
cd aws-scripts-mon


/* cloud watch에 로그 전송
* mem-util : MemoryUtilization %
* mem-used : MemoryUsed MB
* mem-avail : MemoryAvailable MB
* disk-path : diskpath
* disk-space-util : DiskSpaceUtilization %
* disk-space-used : DiskSpaceUsed MB
* disk-space-avail : DiskSpaceAvailable MB
* disk-space-units : Disk Unit setting
* /
$HOME/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-used-incl-cache-buff --mem-avail --swap-used --disk-path=/ --disk-space-util --disk-space-used --disk-space-avail --disk-space-units=Megabytes


crontab -e

# 주기적으로 cloud watch에 전송 (2분/15분)
*/2 * * * * $HOME/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-used-incl-cache-buff --mem-avail --swap-used

*/15 * * * * $HOME/aws-scripts-mon/mon-put-instance-data.pl --disk-path=/ --disk-space-util --disk-space-used --disk-space-avail --disk-space-units=Megabytes



/* crontab 재시작 */
  sudo /etc/init.d/crond restart

 

* 명령이 처리되지 않고 아래와 같은 오류 발생 시 아래 명령어로 SHA 라이브러리를 설치한다.

Can't locate Digest/SHA.pm in @INC (@INC contains: /

yum update
yum -y install perl-Digest-SHA.x86_64

 

5. AWS > Console > CloudWatch Dashboard 생성

 

위젯추가 > 행 시간별 지표

 

 

메모리 지표는 InstanceId 선택, 파일 시스템 용량은 

 

구성 예)

 

 

- - 끝 - -

 

P.S. Perl 핵심 코드 설명

 

  • 아래 쉘명령어로 디스크 사용량, 전체용량, 남은 용량을 알 수 있다.

$ /bin/df -k -l -P /
Filesystem     1024-blocks    Used Available Capacity Mounted on
/dev/nvme0n1p1    41217324 9423420  31693656      23% /

 

###Perl 소스에서 필드에 매핑되는 값#####

# fields[0] = /dev/nvme0n1p1

# felds[1] = 41217324

# felds[2] = 9423420

##########################

  • Perl 소스(mon-put-instance-data.pl)에서 아래와 같은 소스를 보면, 쉘 명령에서 받은 결과값을 변수에 할당 후 add_metric 함수를 이용해 전송할 값을 json으로 담는다.

 

if ($report_disk_space)
{
  my @df = `/bin/df -k -l -P $df_path`;
  shift @df;

  foreach my $line (@df)
  {
    my @fields = split('\s+', $line);
    # Result of df is reported in 1k blocks
    my $disk_total = $fields[1] * KILO;
    my $disk_used = $fields[2] * KILO;
    my $disk_avail = $fields[3] * KILO;
    my $fsystem = $fields[0];
    my $mount = $fields[5];

 

    if ($report_disk_util) {
      my $disk_util = 0;
      $disk_util = 100 * $disk_used / $disk_total if ($disk_total > 0);
      add_metric('DiskSpaceUtilization', 'Percent', $disk_util, $fsystem, $mount);
    }
    if ($report_disk_used) {
      add_metric('DiskSpaceUsed', $disk_units, $disk_used / $disk_unit_div, $fsystem, $mount);
    }
    if ($report_disk_avail) {
      add_metric('DiskSpaceAvailable', $disk_units, $disk_avail / $disk_unit_div, $fsystem, $mount);
    }
  }
}

 

  my $response = CloudWatchClient::call_json('PutMetricData', \%params, \%opts);
  my $code = $response->code;
  my $message = $response->message;

 

 

profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!