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주소로 엔드포인트를 설정한다) |
콘솔에서 경보 생성할 때 나오는 화면들:
실제로 테스트용 경보를 생성해 보면, 경보 생성에 필요한 항목값들을 자동으로 만들어 주기에 콘솔을 적극적으로 활용하는 것을 추천한다.
'AWS' 카테고리의 다른 글
[AWS, Java, Spring] Presigned Url로 S3에 이미지 업로드하기 (0) | 2024.08.22 |
---|