Search

AWS boto3 SDK - EventBridge Scheduler + Lambda: one-time schedule 생성

카테고리
Dev-Ops
태그
Tech
게시일
2024/05/14
수정일
2024/07/12 04:06
시리즈
AWS-Study
1 more property

1. Intro

예전에 메시징 시스템을 개발하다 EventBridge를 활용한 경험이 있습니다. 이를 활용하는 방법에 대해 복습겸 포스트를 작성해봅니다. 이번 포스트에서 설계한 기능은 Lambda function을 예약 실행하기 위한 구조입니다. 이를 위해 EventBridge의 Scheduler를 활용하여 특정 시간에 반복되는 작업을 추가하거나, One-time schedule을 만들어 사용할 수 있는데, Lambda Function을 활용할 수 있는 PoC와 구조를 작성해보았습니다.

2. IAM

먼저 Lambda와 EventBridge Scheduler를 활용하기 위해서는 사용할 계정과 Lambda Function에 적용할 각각의 Role이 필요합니다.

User Role

EventBridge에서 scheduler를 사용하기 위해서는 다음과 같은 Permission이 필요합니다. 만약 AdminAccess 권한을 가지고 있다면 적용할 필요는 없습니다.
만약 권한이 적절히 설정돼 있지 않다면, 다음과 같은 boto3 에러를 확인할 수 있습니다.

Lambda Function Role

EventBridge Scheduler가 Lambda에 접근하여 코드를 실행하기 위해서는 접근제어를 설정해주어야 합니다.

Permissions

Trust relationships

3. Lambda

임의로 실행할 Lambda 코드를 작성해줍니다. 이번 포스트에서는 Lambda 코드를 중요하게 다루지는 않을 것이라 간단히 작성하였습니다.

Create Function

PoC

import json def lambda_handler(event, context): print(f"HELLO!!!!!!!!!!!!!!!!") print(f"Event : {event}") print(f"Context : {context}") return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
Python
복사

4. EventBridge - Scheduler

boto3를 이용하여 EventBridg의 스케줄러를 사용하기 위해서는 client는 scheduler 로 설정하여 사용해줍니다. PoC 코드는 다음과 같습니다.

PoC

import json import boto3 eventbridge = boto3.client( "scheduler", region_name="[REGION]", # Account need `AmazonEventBridgeSchedulerFullAccess` or `create event scheduler` aws_access_key_id="[ACCOUNT ACCESS KEY]", aws_secret_access_key="[ACCOUNT SECRET KEY]" ) eventbridge.create_schedule( Name="TEST-SCHEDULE-NAME", ScheduleExpression="at(2024-12-31T23:59:59)", ScheduleExpressionTimezone="Asia/Seoul", ActionAfterCompletion="DELETE", FlexibleTimeWindow={'Mode': "OFF"}, State="ENABLED", Target={ # ARN for access to Lambda function. "RoleArn": "arn:aws:iam::[ACCOUNT NUMBER]:role/AWS_EventBridge_Lambda_testLambdaFunction_Role", # Lambda function's ARN. "Arn": "arn:aws:lambda:[REGION]:[ACCOUNT NUMBER]:function:testLambdaFunction", # Actually your payload for Lambda function. "Input": json.dumps({"Payload": "I am PAYLOAD!!!!"}), } )
Python
복사
PoC에서 간단히 각 파라미터를 설명하면 다음과 같습니다.
Name : 스케줄러 이름(중복 불가)
ScheduleExpression (at 사용) : 정확히 해당 시간에 동작하도록 함
ScheduleExpressionTimezone : 실행시각 타임존
ActionAfterCompletion : 실행 후 상태 설정(NONE | DELETE)
FlexibleTimeWindow : 일정을 호출하는 기간을 구성함
State : 스케줄러 활성화
Target : 자세한 스케줄 실행 타겟
(람다 외 다른 것도 설정 가능하나, 이 포스트에서는 Lambda function을 다룸)
RoleArn : 실행하고자 하는 타겟의 Role에 대한 Arn
Arn : 실행하고자 하는 목표(Lambda function의 Arn)
Input : Payload 정보(string 값이 들어가야 하므로, 해당 부분은 json.dumps를 해야 함)

Result - CloudWatch

만약 다음과 같이 현재시간이 예약시간보다 클 경우(이미 지난 경우) Schedule을 새로 등록하게 되면, 약 40초 내외로 Schedule이 즉시 실행되는 것을 확인하였습니다.
현재시간 : 2024.05.01 12:00:00
예약시간 : 2024.05.01 11:59:00
Schedule이 바로 실행됨

5. References