반복 작업의 필요성
Schedule이란 일정 주기별로 반복되는 Job을 처리하는 것을 의미합니다.
주기는 다음과 같은 것들이 있을 수 있습니다.
- 매시, 매일, 매주, 매월, 매년
- 격주, 격월
- 특정 시간, 특정 요일, 특정 일자 등등
반복되는 작업들은 어떤 것들이 있을까요?
- 어제의 사이트 통계를 다음날 아침 Slack에 뿌려주기
- 일주일에 한번 특정 사이트를 크롤링해서 데이터 저장하기
- 생일인 고객에게 쿠폰을 발행해서 메시지 보내기
이런 작업들을 일일이 수동으로 처리하기는 매우 어렵습니다.
이때 자동화된 스케줄러가 필요합니다.
리눅스의 Crontab
이런 Schedule을 처리하는 대표적인 프로그램이 Linux에서 제공하는 crontab입니다.
리눅스 shell에서 "crontab -e" 명령을 사용하여 편집모드에서 설정을 하게되면,
일정 주기별로 반복 수행하는 형태입니다.
AWS 에서 Scheduler 사용하기
Cloud 환경이 되면서 오면서 crontab을 사용하는 것이 어려워졌습니다.
쿠버네티스, AWS ECS등의 도커 기반 오케스트레이션 플랫폼을 사용하게 되면서, 인스턴스의 관리를 사용자가 아닌 플랫폼이 맡게 되기 때문입니다. 이로 인해 사용자가 직접 서버를 수정하는 일이 대부분 사라지게 되었습니다.
crontab을 대신할 수 있도록 AWS에서는 Amazon Event Bridge라는 서비스를 제공하고 있습니다.
Amazon Event Bridge와 AWS Lambda를 조합하면 다양한 구현이 가능합니다.
Amazon EventBridge는 crontab과 거의 유사한 방식으로 aws console에서 구현이 가능합니다.
스케줄러 샘플 구현
Amazon Event Bridge와 Lambda를 이용해 API를 호출하는 서비스를 구현하는 방법을 샘플을 통해 알아봅니다.
순서는 다음과 같습니다.
- (API를 호출하는) Lambda Function 만들기
- Amazon EventBridge에 Schedule 등록하기
Lambda Function 만들기
- AWS Lambda에서 함수를 생성합니다.
- Python 3.10과 arm을 이용하도록 셋팅합니다.
- 코드를 다음과 같이 작성합니다.
import json
import requests
def lambda_handler(event, context):
print('calling...')
url = "https://api.sample.com/..."
header = {
'Content-Type': 'application/json; charset=UTF-8',
'User-Agent': ...
}
res = requests.get(
url,
headers,
data={}
)
print(res.content)
return {
'statusCode': 200,
'body': ...
}
- requests 라이브러리는 aws에서 기본 제공이 아니기 때문에 Layer를 만들어 추가해 주어야 합니다.
- Layer는 반드시 python 폴더를 만드시고 해당 폴더에서 pip install로 추가해야 합니다.
mkdir python
cd python
pip install requests -t .
- python 폴더를 압축합니다. (python.zip)
- Lambda 메뉴에서 계층을 선택 후 계층 생성 버튼을 클릭합니다.
- upload에서 python.zip 파일을 추가합니다.
Amazon EventBridge에 Scheduler 등록하기
- Amazon EventBridge 서비스에서 좌측 메뉴의 Scheduler - 일정 메뉴 선택
- 일정 생성 버튼 클릭
- cron 형식으로 일정 패턴 등록
- 대상 선택에서 AWS Lambda를 선택
- Invoke를 선택하고, 생성한 Lambda function을 선택하면 됩니다.
이렇게 하면 매일 아침 9시에 API를 호출하는 Schedule을 사용할 수 있습니다.
'DevOps' 카테고리의 다른 글
Amazon Linux 2023에 Docker 설치하기 (0) | 2024.10.27 |
---|---|
AWS Build시 오류 해결 방법 - FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory (0) | 2024.09.19 |
이미지 썸네일 자동 생성 - AWS S3+Lambda (0) | 2023.05.01 |
Github Desktop - 사용법 #2 (0) | 2022.10.30 |
배포자동화(CI/CD) 2 - 멀티 컨테이너 배포 (nginx proxy) (0) | 2022.08.06 |
배포자동화(CI/CD) - Github Actions/Nuxtjs/Docker/EC2 (12) | 2022.03.13 |
AWS Route53 서브 도메인 설정 방법 (0) | 2022.02.20 |
Github Desktop 5분컷 - Git 개념 & 사용법 (1) | 2021.11.07 |