CodeBuild의 로그를 Lambda로 로그를 성형

경위



CodeBuild의 로그를 정형하고 메일 통지해야했습니다.

건설



이번에는 CodeBuild 실패 로그가 트리거되므로 CloudWatch Events에서
CodeBuild의 실패한 이벤트를 만듭니다.
거기에서 SNS를 통해 로그 그룹과 로그 스트림 이름을 Lambda에서 받고 로그를 어쩔 수 없습니다.



※AWS 아이콘이 업데이트되어 더욱 세련되게 되었습니다
이런 세세한 업데이트가 있는 것도 AWS의 매력이군요.
단지, 최신판에 Email의 아이콘이 없어진 것 같은···?

CloudWatch 이벤트




품목



이벤트 패턴
점검

서비스 이름
CodeBuild

이벤트 유형
CodeBuild Build State Change

특정 상태
FAILED

목표
SNS①


SNS①


  • 주제 이름: 선택
  • 구독: Lambda 엔드포인트(프로토콜: Lambda)

  • 람다




    설정 항목



    함수 만들기
    처음부터 만들기

    이름
    선택

    런타임
    Python3.6


    하나 이상의 템플릿에서

    역할 이름
    선택

    정책 템플릿①
    Amazon SNS 게시 정책

    정책 템플릿②
    CloudWatchLogsReadOnlyAccess

    트리거 추가
    SNS①

    타임아웃
    1분

    환경 변수
    SNSarn/SNS②의 Arn


    코드


    import json
    import boto3
    import os
    import time
    
    
    TOPIC_ARN = os.environ['SNSarn']
    
    def lambda_handler(event, context):
    
        message_unicode = event['Records'][0]['Sns']['Message']
        message_dist = json.loads(message_unicode)
    
        group_name = message_dist['detail']['additional-information']['logs']['group-name']
        stream_name = message_dist['detail']['additional-information']['logs']['stream-name']
    
        time.sleep(90)
    
        client = boto3.client('logs')
        logs = client.get_log_events(
            logGroupName=group_name,
            logStreamName=stream_name,
            startFromHead=True
        )
        body = logs['events']
        message = ""
        for line in body:
            log = '{}'.format(line['message'])
            message = message + log + '\n'
    
        Msg = message
    
        sub = '[Codebuild FAILED]'
    
        client = boto3.client('sns')
        response = client.publish(
            TopicArn=TOPIC_ARN,
            Message=Msg,
            MessageStructure='context',
            Subject=sub
        )
    

    SNS②


  • 주제 이름: 선택
  • 구독: 알림을 받을 이메일 주소

  • 마지막으로



    실제로 검토를 실시한 CodeBuild의 로그는 7000행으로,
    메일이 여러 번 오거나 내용이 부족했습니다.
    원인은 (환경 차이가 있다고 생각합니다만) CodeBuild에서 CloudWatch Logs로 로그가 출력될 때까지 약 1분 차이가 있는 것입니다.
    Lambda가 시작되면 로그가 모두 출력되지 않고 작동하지 않고 Lambda가 3 초 후에 timeout됩니다.
    그래서 파이썬 코드에서 잠을 썼고 람다의 타임 아웃을 3 초부터 늘렸습니다.

    그러면 SNS 본문에 기재 할 수있는 양을 초과하여 오류가 발생했기 때문에,
    일단, S3에 보존해, 통지하고 싶은 내용을 선별해 SNS 본문에 기재하는 내용을 좁혔습니다.

    고전했습니다만, 하고 싶은 일은 실현할 수 있었습니다.
    더 똑똑한 방법이 있으면 가르쳐 주시면 감사하겠습니다.

    좋은 웹페이지 즐겨찾기