본문 바로가기
AWS

[AWS, Java] Cloudwatch 경보를 AWS sdk for Java로 만들기

by 이페코장인 2024. 7. 9.

Cloudwatch Alarm (경보)란?

Cloudwatch에서 다양한 이벤트에 대한 지표, 로그, 경보 등을 만들 수 있다. 쉽게 말하자면, 내가 설정한 AWS에서 발생한 일에 대해 모니터링을 할 여러 수단들이 마련되어 있다는 뜻이다. 이 중 경보(alarm)은 내가 설정한 어떤 일이 발생했을 때, 이메일 송신과 같은 방법으로 알람을 받을 수 있게 설정하는 도구다.

 

위 사진처럼 AWS 콘솔 - cloudwatch 에서 경보 탭을 클릭하여, 경보를 쉽게 만들 수 있다. 그러나 콘솔에서 경보를 만드는 것 뿐만이 아니라, AWS sdk for Java를 이용하여 스프링 프로젝트에서도 경보를 다룰 수도 있다. 나는 회사의 프로젝트에서 자동으로 경보를 생성하는 알고리즘이 필요했기에 이 방법을 사용하게 되었는데, 레퍼런스 코드가 찾기 어려워서 실행착오를 반복하게 되었다. 내 코드를 여기에 공유하여, 다른 사람들은 쉽게 cloudwatch alarm을 자바에서 사용할 수 있기 바란다.

 

 

1. Dependency 추가

가장 먼저, AWS sdk for Java의 cloudwatch관련 라이브러리를 스프링 프로젝트에서 사용할 수 있도록 dependency를 추가해 준다.

    //cloudwatch
    implementation 'software.amazon.awssdk:cloudwatch:2.20.28'

 

 

2. Cloudwatch Client 생성

다음, cloudwatch관련 설정들과 메소드를 설정해 줄 자바 클래스를 만든다. 알아보기 쉽도록 이름을 CloudwatchConfig으로 설정하는 것이 좋다.

@Slf4j
@Configuration
@RequiredArgsConstructor
public class CloudWatchConfig {
    @Value("${cloud.aws.access-key}")
	private String accessKey;

	@Value("${cloud.aws.secret-key}")
	private String secretKey;

    @Bean
    public CloudWatchClient cloudWatchClient() {
        AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create(accessKey, secretKey);
        return  CloudWatchClient.builder()
                .credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials))
                .region(Region.US_EAST_1) // 원하는 리전으로 설정하기!
                .build();
    }

accessKey, secretKey는 AWS IAM 사용자 계정에서 발급받은 키를 사용하면 된다. 그리고 키를 넣어서 cloudwatch client를 생성하는 Bean을 만들면 되는데, 이 때 region을 반드시 본인이 지표를 볼 리전으로 설정해야 제대로 작동한다. 어느 리전을 사용할 지 헷갈린다면, 직접 AWS 콘솔의 cloudwatch섹션으로 접속해서, 내가 원하는 지표를 어느 리전에서 볼 수 있는지 직접 확인해 보고, 설정하면 된다. 나는 cloudfront의 지표들이 필요했는데, cloudfront지표들은 무조건 US-east-1에서만 볼 수 있어서 리전을 설정하였다.

 

 

3. 경보 생성 메소드 만들기

Cloudwatch Alarm은 다음과 같이 크게 세 가지 부품으로 구성되어 있다.

 

 

1. Metrics (지표)

2. Threshhold (조건 임계값)

3. Alarm Actions (경보 작동 시 수행될 작업)

 

 

위의 세 부품에 어떤 값을 사용할 지 정확히 인지하고 있다면 경보를 쉽게 만들 수 있다.

나는 cloudfront에서 배포된 웹사이트의 트래픽이 일정 수준을 넘어가면 경보가 작동하고, 이메일이 수신되도록 설정하였다.

    public void createAlarm(Website website) {
        CloudWatchClient cw = cloudWatchClient();
        PutMetricAlarmRequest request = PutMetricAlarmRequest.builder()
                .alarmName("DemoAlarm") // 내가 설정할 알람 이름
                .namespace("AWS/CloudFront")
                .metricName("BytesDownloaded") // 측정할 지표
                .period(24 * 60 * 60) // 측정 단위
                .dimensions(Dimension.builder()
                        .name("DistributionId")
                        .value(website.getDistributionId()).build(),
                        Dimension.builder()
                        .name("Region")
                        .value("Global")
                        .build())
                .statistic(Statistic.SUM) // 트래픽의 합계를 구하므로 sum
                .threshold(100 * 1000d) // 1MB
                .comparisonOperator("GreaterThanOrEqualToThreshold") // 크거나 같을 경우
                .evaluationPeriods(1) // 최근 n개를 측정 대상으로 삼는다
                .alarmActions("arn:aws:sns:us-east-1:398991120381:CloudFront_Distribution_DownloadBytes") // SNS주제의 arn주소
                .build();
        PutMetricAlarmResponse response = cw.putMetricAlarm(request);
        log.info(response.toString());
    }

 

여기서 각 변수에 어떤 내용이 들어가야 하는지 잘 정리된 문서가 없어서 헤메게 되는데, 직접 콘솔에서 경보를 생성할 때 나오는 항목들을 참고하면 쉽게 채울 수 있다.

콘솔 화면과 내가 정리한 표를 참고하면서 위의 항목들을 채우면 된다.

 

변수 이름 콘솔에서 나오는 항목 (+설명)
alarmName 경보의 이름을 임의로 지어주기
namespace 지표 - 네임스페이스의 값
metricName 지표 - 지표 이름의 값
period 지표 - 기간 (지표로 평가할 시간 간격을 초 단위로 입력. 예를 들어, 24시간마다 트래픽을 평가한다면 24 * 60 * 60초를 입력)
dimensions   지표 - distribution id, region 등 모니터링하는 대상의 정보
  name distribution id, region과 같이 정보의 변수명
  value 정보의 실제 값
statistic 지표 - 통계 (평균, 합계, 최대, 최소 등에서 원하는 값 선택. 24시간동안의 총 트래픽을 원한다면 SUM 선택)
threshold 조건 - 임계값 (경보의 기준이 될 값, double로 입력)
comparisonOperator 조건 - 정의 (임계값과 어떤 비교를 하여 경보가 작동할 것인지 선택)
evaluationPeriods 조건 - 추가 구성
alarmActions 작업 구성 - 다음으로 알림 전송 (경보가 작동할 시, 작동할 작업의 AWS arn주소로 엔드포인트를 설정한다)

 

콘솔에서 경보 생성할 때 나오는 화면들:

1. 지표
2. 조건
3. 경보 작동 시 작업

 

실제로 테스트용 경보를 생성해 보면, 경보 생성에 필요한 항목값들을 자동으로 만들어 주기에 콘솔을 적극적으로 활용하는 것을 추천한다. 

'AWS' 카테고리의 다른 글

[AWS, Java, Spring] Presigned Url로 S3에 이미지 업로드하기  (0) 2024.08.22