Datadog 및 Lambda를 사용하여 ElastiCache 작업 알림

개시하다


Amazon ElastiCache에서 를 다시 시작하거나 장애가 발생하면 이벤트로 기록됩니다.
관리 콘솔은 ElastiCache > イベント에 기록된 이벤트를 다음과 같이 확인할 수 있습니다.
ElastiCache > イベント
이런 엘라스티카치의 활동에 대해 슬라스티카치에게 알리는 방법에 대해 여러 번 시도해 봤기 때문에 기재했다.

Slack 알림 방법


이번에 시도한 방법은 다음과 같은 네 가지가 있다.
메서드
메모
Datadog의 AWS Integration->Datadog Monitor->Slack
통지까지 몇 분 걸린다
ElastiCache -> SNS -> Datadog Monitor -> Slack
- 데이터 dog의 API 키를 처리하기 어렵습니다. - 이벤트를 필터할 수 없습니다.
ElastiCache -> SNS -> Chatbot -> Slack
원래 알릴 수가 없어요.
ElastiCache -> SNS -> Lambda -> Slack
- 즉시 알림 - 이벤트 필터링 가능
Datadog에서 전체를 감시하는 것을 전제로 앞부분의 두 가지 방법은 정보를 데이터dog에 집중시킨다.
후반부의 두 가지 방법은 데이터 집합에 얽매이지 않고 슬랙 알림 방법을 시도하고 있다.

1. Datadog의 AWS Integration->Datadog Monitor->Slack


Datadog의 AWS Integration이 활성화되면 ElastiCache의 활동이 Datadog과 자동으로 협력됩니다.
다음은 DatadogMonitors > New Monitor > Event과 선택할 때의 화면으로 ElastiCache의 이벤트를 보여 줍니다.
ElastiCacheのEvent
이러한 이벤트를 감지하고 Slack 알림을 실행하려면 Datadog에 다음 새 모니터를 생성합니다.
  • Match events containingfailover
  • 로 설정
  • fromAmazon ElastiCache
  • 로 설정
  • tagsource_identifier:{ElastiCacheの名前}
  • 로 설정
  • 통지 목적지를 슬랙
  • 으로 설정
    Monitor
    모니터를 제작한 후 검증으로 ElastiCache의 고장 전이가 수동으로 발생한다.
    다음은 수동 장애 조치 후 얼마 지나지 않아 관리 콘솔을 통해 확인된 ElastiCache의 활동입니다.
    ElastiCacheのEvent
    그리고 이 고장 전이 사건은 Datadog의 모니터에 의해 검출되었고 Datadog에서 Slack에 다음과 같이 통지되었습니다.
    Slack
    그러나 ElastiCache의 사건 발생 시간(23:43)과 슬랙의 발언 시간(23:51)을 비교해 보면 슬랙이 통지한 시간은 고장 발생 후 약 8분이라는 것을 알 수 있다.
    Datadog의 AWS Integration에서 Elasti Cache의 활동이 자동으로 연합된 것은 사실이지만 Datadog에 대한 반응은 몇 분 정도 걸릴 것 같다.
    이에 따라 Datadog의 모니터 테스트도 해당 시간이 지연됐고, 결과 슬랙 알림 시간도 고장 발생 수 분 뒤였다.

    2. ElastiCache -> SNS -> Datadog Monitor -> Slack


    ElastiCache에서는 파트너의 SNS 이슈를 지정할 수 있으며, SNS를 통해 이벤트를 다른 사람에게 알릴 수 있다.
    ElastiCacheの通知ARN
    여기서 ElastiCache의 파트너 SNS의 알림 주소를 Datadog의 종점으로 삼고 Datadog Monitor에서 슬랙을 알립니다.
    우선 표준형 SNS 화제를 만들자.
    SNS 주제에 대한 액세스 정책은 다음과 같습니다.
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": "SNS:Publish",
          "Resource": "{自身のSNSトピックARN}",
          "Condition": {
            "StringEquals": {
              "AWS:SourceOwner": "{自身のAWSアカウントID}"
            }
          }
        }
      ]
    }
    
    다음은 해당 SNS 주제에 대한 필터링입니다.
    서브루틴 프로토콜 선택 HTTPS, 끝점 기재Datadog의 공식 문서
  • https://app.datadoghq.com/intake/webhook/sns?api_key=<API KEY>
  • (Datadog의 영역이 US인 경우)
    https://app.datadoghq.com/account/settings#api에서 데이터 dog의 API 키를 가져옵니다.
    サブスクリプション
    결론적으로 엘라스티카치에서 발생한 사건은 SNS를 통해 데이터 독에 반영된다.
    다음은 Datadog, 선택Monitors > New Monitor > Event할 때의 화면이지만, ElastiCache의 활동이 SNS를 통해 반영되었다는 것을 알 수 있다.
    Datadogに反映したSNS
    Datadog의 모니터로 슬랙 알림을 감지하고 진행하기 위해 Datadog에서 다음과 같은 새로운 모니터를 제작한다.
  • Match events containing를 공백으로 설정(공백의 이유는 뒤에 서술)
  • fromAmazon SNS
  • 로 설정
  • tagtopic:{SNSトピックのの名前}
  • 로 설정
  • 통지 목적지를 슬랙
  • 으로 설정
    Monitor
    모니터를 제작한 후 재검증으로 수동으로 일라스티카치의 고장이 발생했을 때 Datadog에서 이를 감지하고 슬랙에 다음과 같은 통지를 보냈다.
    DatadogからのSlack通知
    그러나 이 방법은 SNS 구독의 단점 표시줄에 데이터 독의 API 키를 숨기지 않기 때문에 API 키를 참고할 수 있는 사람을 제한하기에는 적합하지 않다.
    SNSサブスクリプションのエンドポイント欄
    또 이번에는 Datadog Monitor가 다음 JSON에서 특정 활동 종류만 걸러내는 방법을 알지 못했다.
    {
        "ElastiCache:イベント名": "ElastiCache名"
    }
    
    따라서 Match events containing를 빈 칸으로 삼았지만 결과적으로 모든 Elasti Cache 이벤트가 슬랙에 통지되어 실용성이 부족했다.

    3. ElastiCache -> SNS -> Chatbot -> Slack


    이 경로를 통해 슬랙에 알릴 수 없습니다.
    AWS Chaatbot은 ElastiCache의 활동을 지원하지 않는 것 같고, Chaatbot의 부분은 후술한 Lambda를 사용해야 한다.
  • Amazon SNS에서 AWS Chatbot의 알림을 통해 원활하게 진행되지 않는 이유 및 처리 방법
  • (Chaatbot도 이벤트에 대한 필터를 포함하고 ElastiCache를 지원한다면 Lambda의 원본 코드를 관리하지 않는 장점을 고려할 수 있다)

    4. ElastiCache -> SNS -> Lambda -> Slack


    이 경로에서는 람다의 소스 코드를 관리해야 하지만 문제 없이 슬랙에 알릴 수 있습니다.
    다음은 파이썬 람다의 코드 예입니다.이번에는 행사 종류의 축소 처리가 사랑스럽지만, 그런 인코딩을 추가하면 임의의 행사만 알릴 수 있을 것 같습니다.
    또한 Slack의 Webhook URL은 환경 변수에서 매개변수 저장소에 미리 저장되어 있습니다.
    import boto3
    import json
    import os
    import urllib.request
    
    def lambda_handler(event, context):
        ssm = boto3.client('ssm')
    
        ssm_res = ssm.get_parameter(
            Name = os.environ['PARAMETER_STORE_PATH_WEBHOOK_URL'],
            WithDecryption = True
            )
        url = ssm_res['Parameter']['Value']
    
        data = {
            'text': event['Records'][0]['Sns']['Message']
        }
    
        headers = {
            'Content-Type': 'application/json',
        }
        
        req = urllib.request.Request(url, json.dumps(data).encode(), headers)
        
        with urllib.request.urlopen(req) as res:
            res_body = res.read().decode()
        
        print(res_body)
    
    매개변수 스토어를 참조하려면 Lambda에 지정된 IAM 스크롤 막대에 다음 권한을 추가합니다.
    // 略
            {
                "Effect": "Allow",
                "Action": [
                    "sts:AssumeRole",
                    "ssm:GetParameter"
                ],
                "Resource": "*"
            }
    // 略
    
    Lambda로 코드를 디버깅한 후 ElastiCache의 장애 복구가 수동으로 발생하면 SNS를 통해 시작된 Lambda가 Slack에 대해 다음과 같이 알립니다.
    (하나의 통지를 통일한 것처럼 보이지만 실제로는 세 번으로 나뉜다.)
    Slack
    ElastiCache의 이벤트 열에 표시된 이벤트 발생 시간과 비교하여 즉시 알릴 수도 있습니다.
    ElastiCacheのイベント欄

    끝맺다


    이상은 ElastiCache의 이벤트를 Slack에 알리는 여러 가지 검증입니다.
    실용성 면에서 마지막으로 소개한 ElastiCache -> SNS -> Lambda -> Slack가 가장 좋다.
    이 기사를 참고할 수 있었으면 좋겠어요.

    참고 자료

  • Datadog에서 AWS SNS(RDS/ElastiCache 이벤트) 수신-vague memory
  • ElastiCache 이벤트 표시
  • 이벤트 알림 및 Amazon SNS
  • 좋은 웹페이지 즐겨찾기