Trusted Advisor의 상태 변경을 Slack에 알리는 Lambda 함수를 serverless로 작성

개요



이 기사에서는 AWS Trusted Advisor의 상태 변경을 Slack에 알리기 위해 Python에서 Lambda 함수를 작성하고 serverless framework에서 배포하는 방법을 설명합니다.

AWS Trusted Advisor의 상태 변경을 알리는 의미



AWS Trusted Advisor는 AWS 인프라의 구성을 최적화하기 위해 '비용 최적화', '서비스 제한', '보안' 등의 항목에 적절한 조언을 해주는 서비스입니다.

예를 들어, RDS 수동 스냅샷의 기본 제한 수는 100이므로 수동 스냅샷 수가 80에 도달하면 AWS Trusted Advisor가 "서비스 제한"항목에 대해 경고합니다.

관리자는 AWS Management Console에서 세부 정보를 확인할 수 있으며 Email에서 주간 점검 결과를 받을 수 있습니다.

그러나, 보안이나 서비스 제한 등 운용에 영향을 주는 항목에 관해서는, 경고가 발행되면 즉시 통지되도록 해 두는 것으로, 공유나 대응의 스피드가 빨라진다.

AWS는 Trusted Advisor의 상태 변경을 감지하는 CloudWatch Events를 제공합니다( Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링 ). 따라서 이 CloudWatch Events를 이용하여 알림 시스템을 구축하는 것이 좋다.

AWS Trusted Advisor
Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링

Lambda 함수를 만들어 보자!



작업



CloudWatch Events 샘플 JSON 확인



CloudWatch Events의 JSON을 확인하고 통지하는 메시지는 어떻게 할지 생각할 필요가 있다.
Trusted Advisor 검사 결과를 Amazon CloudWatch Events로 모니터링의 "Trusted Advisor에 대한 CloudWatch 이벤트 규칙을 만들려면:"의 단계를 계속합니다. 아래 그림과 같이 입력합니다.

(나의 경우는 스테이터스가 「OK」일 때는 통지하지 않게 하고 있다.)


샘플 JSON 파일이 표시되므로 복사하여 개발 및 테스트에 사용합니다.


유용한 항목은 개인적으로 다음과 같습니다.


JSON 키 이름
설명

status변경 후 상태
resource_id리소스 ID
detail.check-name체크 항목명
detail.check-item-detail체크 세부정보


Slack 알림을 위한 코드 작성



실제로 SLack에 통지하기 위한 코드를 작성해 간다.
나는 파이썬에 익숙하기 때문에 파이썬으로 썼다.

필요한 라이브러리 설치



필요한 라이브러리는 requests 로, 미리 pip로 인스톨 해 둔다.
$ pip install requests
$ pip freeze > requirements.txt # デプロイ時に使用

requirements.txt
certifi==2018.8.24
chardet==3.0.4
idna==2.7
requests==2.19.1
urllib3==1.23

실행 코드



handler.py
# -*- coding: utf-8 -*-

import json
import requests
import os


def webhook_icon(status=''):
    if status == 'INFO':
        return ':information_source:'
    elif status == 'WARN':
        return ':warning:'
    else:
        return ':rotating_light:'


def attachement_color(status=''):
    if status == 'INFO':
        return '#CCCCCC'  # 灰
    elif status == 'WARN':
        return '#FFFF00'  # 黄
    else:
        return '#FF0000'  # 赤


def alert(event, _context):
    detail = event.get('detail', {})
    status = detail.get('status', 'ERROR')
    resource = detail.get('resource_id')
    check_name = detail.get('check-name')
    check_detail = detail.get('check-item-detail')

    requests.post(os.getenv('SLACK_WEBHOOK_URL'), data=json.dumps({
        "text": "<!channel> *AWS Trusted Advisorのステータス変更を検知しました*",
        "icon_emoji": webhook_icon(status=status),
        "attachments": [
            {
                "fallback": check_name,
                "color": attachement_color(status=status),
                "author_name": "Trusted Advisor",
                "author_link": "https://console.aws.amazon.com/trustedadvisor/home?#/dashboard",
                "title": check_name,
                "fields": [
                    {
                        "title": "ステータス",
                        "value": status,
                        "short": False
                    },
                    {
                        "title": "リソース",
                        "value": resource,
                        "short": False
                    }
                ]
            },
            {
                "title": '詳細',
                "fallback": check_name,
                "color": attachement_color(status=status),
                "text": "```\n{0}\n```".format(check_detail)
            }
        ]
    }))

Webhook 아이콘은 Trusted Advisor의 상태에 따라
  • ERROR 그렇다면
  • WARN 그렇다면
  • INFO 그렇다면

  • 하고 있습니다.
    또, 통지시의 Slack의 라인의 색을
  • ERROR 그렇다면 빨간색
  • WARN 그렇다면 노란색
  • INFO 그렇다면 재

  • 하고있다.

    메시지 작성에서 참고로 한 사이트
    Message Formatting
    Attaching content and links to messages | Slack

    serverless 설정



    Serverless Framework에서 AWS Lamda 함수 생성 이라는 기사가 매우 도움이 되었습니다.
    serverless의 인스톨등은 이쪽 참고로 해 주시면. .

    여기에서는 serverless의 설정 파일 serverless.yml 만 기재한다.
    service: trusted-advisor
    
    provider:
      name: aws
      runtime: python3.6
      logRetentionInDays: 7 # Lambda関数のログの保持期間は7日とする
    
      stage: prod
      region: us-east-1 # リージョンは米国東部 (バージニア北部)にしなければならない
    
    plugins:
      # デプロイ前に`npm install serverless-python-requirements`しておく必要あり
      # pipでインストールしたパッケージをrequirements.txtに記載しておくことで、デプロイパッケージに含めてくれるプラグイン
      - serverless-python-requirements
    
    functions:
      alert:
        handler: handler.alert
        description: Trusted Advisorのステータス変更をSlackに通知する
        environment:
          SLACK_WEBHOOK_URL: https://hooks.slack.com/services/XXXXXXXXX # Slack WebhookURLを設定
        events:
          - cloudwatchEvent: # CloudWatch Eventの指定
              event:
                source:
                  - "aws.trustedadvisor"
                detail-type:
                  - "Trusted Advisor Check Item Refresh Notification"
                detail:
                  status: # 通知するステータスを指定
                    - ERROR
                    - INFO
                    - WARN
    

    배포


    $ serverless deploy -v # ymlの設定間違っていないか確認
    $ serverless deploy # デプロイ実行!
    

    Lambda 함수 테스트로 알림 확인



    배포가 완료되면 AWS Management Console의 Lambda 페이지에서 샘플 JSON에서 테스트를 실행하고 통보되는지 확인합니다.

    상태가 ERROR이면 다음과 같은 알림이 왔습니다.


    이것으로 완성.
    serverless의 CLoudWatch Events 설정을 사용자 정의하면 알림 조건을 좁힐 수 있으므로,
    시도해 보면 좋을지도.

    좋은 웹페이지 즐겨찾기