클라우드 서비스를 이용하다보면 이벤트 발생에 맞춘 로직 수행이나 주기적인 자동화를 수행해야할 경우가 존재한다.
예를 들어, 워크로드 상에 존재하는 작업들의 이벤트 기반 상호작용이나 매일 새벽에 하루동안의 로그들을 바탕으로 보고서를 작성하는 등의 작업이 있을 것이다.
이러한 작업을 위해 Eventbridge의 Rule과 Scheduler를 이용할 수 있다.
이번에는 Eventbridge의 구성요소와 이들을 활용한 간단한 자동화를 구성해보도록 한다.
Eventbridge
이벤트를 Application 요소들과 연결할 수 있는 서버리스 '이벤트 버스' 서비스, 이전에는 Cloudwatch Events로 불렸고, 현재는 Eventbridge로 명칭이 변경되었다고 한다.
S3, EC2와 같은 AWS 서비스들에서 발생하는 이벤트를 감지해서 여러 Application과 연결할 수 있는 서비스이다.
AWS 서비스와 더불어 서드파티 SaaS App, 커스텀 App들로 부터 발생하는 이벤트를 소스로 사용할 수도 있다.
이벤트
Eventbridge에서의 이벤트는 AWS 서비스 / 서드파티 SaaS App / 커스텀 App에서 발생되는 '변화', AWS에서는 각 서비스들을 수행(API 호출)하면 이벤트가 발생된다.
이러한 이벤트는 이벤트 버스와 파이프로 전송되는 JSON 객체로 정의된다.
이벤트 버스
이벤트가 수신되고 타겟으로 전달되는 파이프라인(라우터), 이벤트 버스는 region-specific(각 리전별로 구분됨)하고, Eventbridge로 오는 모든 이벤트는 이벤트 버스와 연결된다.
Eventbridge에는 기본적으로 default 이벤트 버스가 존재하고, 이 버스를 통해 현재 계정의 모든 AWS 이벤트를 수신하도록 되어있다. (default 이벤트 버스도 region-specific)
여러개의 이벤트 버스를 구성해 이벤트 트래픽을 분산할 수 있고, 하나로 통합된 이벤트 버스를 통해 다른 리전이나 다른계정의 이벤트들을 중앙 집중식으로 구성할 수 있다.
Rule
이벤트 버스로 전송된 이벤트를 소스로 하여 Target에 수행할 동작을 정의한 것
정의한 Rule에 일치하는 이벤트가 발생하면, Rule에 정의한 Target으로 이벤트가 라우팅된다.
Rule은 Target에 전송할 이벤트를 지정하기 위해 이벤트 패턴을 포함한다.
이벤트 패턴은 이벤트 JSON으로부터 필터링을 진행하기에 마찬가지로 JSON 형식으로 구성된다.
한가지 예시로, 아래와 같은 패턴은 test-bucket이라는 이름의 버킷에 object가 생성되는 경우의 이벤트 패턴이다.
{
"source": ["aws.s3"],
"detail-type": ["Object Created"],
"detail": {
"bucket": {
"name": ["test-bucket"]
}
}
}
Eventbridge 스키마나 Eventbridge에서 자체적으로 제공하는 템플릿도 존재하고, 직접 JSON을 작성할 수 있다.
실습
간단하게 Rule을 통해 EC2 인스턴스의 변경 이벤트를 수신받을 수 있는 알림 아키텍처를 구성해본다.
먼저, EC2는 인스턴스의 상태가 변경되면 "EC2 Instance State-change Notification" 이벤트를 Eventbridge로 전송한다.
해당 이벤트의 디테일 내용은 아래와 같다.
{
"id":"7bf73129-1428-4cd3-a780-95db273d1602",
"detail-type":"EC2 Instance State-change Notification",
"source":"aws.ec2",
"account":"123456789012",
"time":"2021-11-11T21:29:54Z",
"region":"us-east-1",
"resources":[
"arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"
],
"detail":{
"instance-id":"i-abcd1111",
"state":"pending"
}
}
이러한 이벤트를 Eventbridge에서 Rule을 생성해 Lambda를 트리거하도록 설정하도록 한다.
Slack에 메시지를 전송할 Lambda를 먼저 생성해준다.
이후, Eventbridge에서 EC2 상태변화 이벤트를 소스로, Lambda를 타겟으로 하는 Rule을 생성한다.
이벤트 패턴은 위와 같은 이벤트를 가져와야 하기에 "aws.ec2"를 source로, "detail-type"을 "EC2 Instance State-change Notification"으로 작성한다.
그리고 Rule의 대상(Target)은 slack으로 메시지를 전송할 Lambda를 지정하여, Rule에 해당하는 이벤트가 발생하면 lambda가 트리거되도록 한다.
하단 '추가 설정'의 '대상 입력 구성'은 [Rule의 소스를 통해 Eventbridge로 넘어온 이벤트의 내용을 어떻게 Target으로 전송해줄 것인가]에 대한 설정이다.
'일치하는 이벤트'는 이벤트 내용이 그대로 Target으로 전송되고, 이외의 설정들은 이벤트의 특정 부분만 뽑아서 전송해줄 수 있다.
Rule을 모두 구성한 뒤, 실제로 임의의 인스턴스를 생성하고 종료하면 Eventbridge Rule을 바탕으로 동작하는 것을 확인할 수 있다.
Scheduler
미리 설정한 '일정'을 바탕으로 작업을 Trigger할 수 있는 스케쥴러
앞서 설명한 Rule과는 달리 스케쥴러로써 지정한 일정마다 Rule을 트리거할 수 있다.
일정 이벤트 패턴은 크게 일회성, 반복 일정으로 나뉜다.
일회성은 지정한 기간/시간에 한 번만 발생하며, 반복은 구성한 날짜/시간에 반복적으로 발생시킨다.
반복 일정은 Cron 표현식과 rate 표현식을 구성해 작성할 수 있다.
실행 값과 단위만 표현 가능한 rate에 비해 cron 표현식은 비교적 세밀하게 표현이 가능하다.
Eventbridge Scheduler에서 사용가능한 cron 표현식은 조금 더 다양하다.
공식 Docs에서 사용가능한 cron syntax를 확인할 수 있다.