AWS/운영관련 개발

[boto3] Your pagination token does not match your request

데이터엔지니어 주형권 2023. 7. 27. 16:25
반응형

boto3 아이콘

 

 

안녕하세요. 주형권입니다.

AWS의 boto3를 이용하여 데이터 레이크 운영을 위한 개발을 하던 와중에 제목과 같은 에러를 발견하고 해결 방법에 대해서 정리 하였습니다. 우선 국내 블로그 및 외국 블로그에도 정확하게 나온 곳이 없어서 도움이 될 것 같아서 빠르게 글을 작성 하였습니다.


 

무엇을 하려고 하였는가?

저희는 AWS 환경에서 데이터레이크를 구축하고 있는 만큼 boto3를 정말 많이 씁니다. 그렇게 하다보니 boto3의 여러가지 기능에 대해서 많이 사용하고 있는데요. 그중에 CloudTrail에 관련하여 boto3를 통해서 데이터를 가져오려고 하였습니다. 

 

trail = boto3.client('cloudtrail')

 

boto3에서 CloudTrail을 가져오는 방법이 여러가지가 있는데, 이중에 lookup_events를 사용하여 특정 이벤트와 날짜만 조금씩 가져와서 모니터링 DB에 데이터를 적재 하려고 하였습니다. (모니터링 시스템이 궁금하신 분은 데이터레이크 모니터링 시스템 도베르만을 참고해주세요. )

 

response = trail.lookup_events(LookupAttributes=[{'AttributeKey': 'EventName','AttributeValue': 'StartQueryExecution' },],
        StartTime=datetime.combine(datetime.today() - timedelta(minutes=660), datetime.min.time()),
        EndTime=datetime.combine(datetime.today() + timedelta(minutes=30), datetime.min.time()),
        )

 

위의 내용과 같이 response를 가져와서 적재하면 끝나겠지만... lookup_events는 next_token으로 다음 페이지를 보고 계속해서 가져와야 합니다. response를 받을 수 있는 최대 건수는 50건이 제한이라서 만약에 가져오는 값이 50건이 넘을 경우 next_token을 넣고 While로 가져와야 합니다. (While로 가져오는 내용은 여기에...)

 

페이징을 번호로 하는게 아니고 next_token을 계속해서 넣고 None으로 나올때까지 계속 불러야 하는 구조 입니다. 

next_token 설명

 

하지만 response로 데이터를 가져와서 While에 next_token을 넣으면 아래와 같이 오류가 발생 합니다.

Your pagination token does not match your request

어떻게 해결 하였는가?

처음에 해결은 next_token을 정상적으로 받오지 못하는가? 였습니다. 

response syntax

 

그래서 next_token을 모두 하나씩 찍어서 While에 넣지 않고 수동으로 찍었는데, 마찬가지의 에러가 발생 하였습니다. 그래서 무언가 모든 조건을 제거하고 next_token만 넣을때는 정상적으로 작동 하였습니다. 그래서 찾은 결론은 바로 StartTime / EndTime 였습니다. 분명히 에러 메시지에는 token이 다르고 하였지만 정확히 보면 lookup_events를 실행 할때 조건이 다릅니다.

 

StartTime=datetime.combine(datetime.today() - timedelta(minutes=660), datetime.min.time()),
EndTime=datetime.combine(datetime.today() + timedelta(minutes=30), datetime.min.time()),

 

위의 코드를 보면 datetime.today()로 변하는 날짜를 가져옵니다. 그래서 내가 처음에 데이터를 가져오고 next_token을 가져오고 다시 While을 돌때 StartTime과 EndTime이 변하기 때문에 조건이 변하므로 기존의 next_token 값으로 데이터를 가져오려고 할때 이미 지금의 세션은 다른 세션인 것 입니다. 그래서 token의 값이 다르다고 나옵니다. 

 

start_date = (datetime.now()-timedelta(hours=10)).strftime('%Y-%m-%d %H:%M:%S')
end_date = (datetime.now()+timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S')

 

그래서 이 에러를 해결 하려면 위와 같이 StartTime / EndTime 를 변수로 받아서 똑같은 고정값으로 던져야 합니다. 이렇게 하면 에러가 없어집니다. 이렇게 하여 간단하게(?) 많은 삽질로 해결 하였습니다. 별로 어려운 내용은 아닌데, 삽질 시간을 줄이기 최대한 줄이기 위하는 마음으로 내용을 공유 합니다. 

 

감사합니다.

반응형