CloudWatch Log 총 용량 계산하기
CloudWatch Log 의 총 용량의 사용량을 알아야 얼마 정도 비용이 나가는지를 추정할 수 있다. CloudWatch Log 화면에서 총 용량을 보여주면 고맙겠지만 그런게 없다보니 비용이 얼마정도 나가는지도 모르게된다.
Python 을 이용해서 총 용량을 계산해보자.
nextToken
AWS SDK 를 사용하는데 있어 항상 나오는 것이 nextToken 이다. AWS 는 무제한으로 API Call 을 하도록 허용하지도 않고 결과의 모두를 출력해주지 않는다. 다음을 보자.
1 2 |
client = session.client('logs') response = client.describe_log_groups(limit=50) |
describe_log_groups 메소드에 인자값으로 limit 가 있다. 이 값은 Default 값이 있다. 문제는 이 인자값을 50 이상을 지정할 수가 없다는 것이다. CloudWatch Log 개수가 50개 이상이라면 딱 50개 만 출력이되는데, 나머지를 출력하고 싶다면 nextToken 인자를 주면 된다.
1 2 |
client = session.client('logs') response = client.describe_log_groups(limit=50, nextToken=nxtToken) |
일종의 Pagenation 개념으로 다음 페이지를 넘기며 출력을 하도록 하면 전체 CloudWatch Log 를 가지고 올 수 있다.
storedBytes
CloudWatch Log 에 SDK 에 리턴값은 Dictionary 로 나온다. 여기에는 logGroups 키로 하는 리스트형태의 Dictionary 인데, 여기에는 logGroupName, storedBytes 이며 storedBytes 값을 다 더하면 된다.
1 2 3 4 |
for group in response['logGroups']: print(f'logGrupName: {group['logGroupName']}, size: {group['storedBytes']}') totalStoredBytes += group['storedBytes'] nxtToken=response['nextToken'] |
이런식으로 totalStoredBytes 에 전체용량을 저장하고 출력하면 된다.
전체소스
전체 소스는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import boto3 region = 'ap-northeast-2' session = boto3.session.Session(profile_name='systemv', region_name=region) client = session.client('logs') nxtToken="first" totalStoredBytes=0 while nxtToken: if nxtToken=="first": response = client.describe_log_groups(limit=50) else: response = client.describe_log_groups(limit=50, nextToken=nxtToken) try: for group in response['logGroups']: print(f'logGrupName: {group['logGroupName']}, size: {group['storedBytes']}') totalStoredBytes += group['storedBytes'] nxtToken=response['nextToken'] except KeyError: break print(f'Total Bytes: {totalStoredBytes}') |
좀 더 개선된 코드를 생각해 볼 수 있다. 그건 여러분이들 해보라.