AWS Health API에서 AWS 장애 정보를 가져와 MS Teams에 전송
이번에는 AWS에서 발생한 장애 정보를 가능한 한 신속하게 MS Teams에 공유하는 방법을 긴급히 정리했습니다.
이 기사에서 전달할 내용을 가져오기 전에 AWS 람다에서 RSS를 주기적으로 읽기Service Health Dashboard하고 장애가 발생하면 MS Teams POST로 보냅니다.
다만 RSS의 URL은 서비스와 권역별로 분리돼 있고, 권역에 따라 서비스의 GA 상황도 다르며, GA 이후 자동으로 대상을 확보하는 등도 고려하고 있다.이 근처에 RSS URL이 지정되어 있죠(HTTP 200) 없죠(HTTP 404) GET에 가면 200 이외의 경우는 처리하지 않고 자주 제작됩니다.
하지만 신규 추가 서비스라면 싫더라도 수정이 필요하다.
※ 즉, 그 수정이 유출되면 얼마가 지나도 장애 정보 취득 대상이 되지 않습니다
그래서 AWS Health API에 주목했습니다.
AWS Health API는 AWS가 지원하는 비즈니스 프로그램이나 Enterprise 프로그램이라면 사용할 수 있는 API로 상기 서비스 Health Dashboard에 표시된 고장 정보와Personal Health Dashboard에 표시된 계정별 고장 및 유지보수 정보를 얻을 수 있다.
AWS Health API의 사양은 다음과 같습니다.
그러면 AWS Health API를 실행하여 AWS 고장 정보를 얻어 MS Teams POST에 전달하는 방법을 알려드리겠습니다.
AWS Lambda에서 MS Teams POST로의 사전 준비
이것은 자화자찬의 미증입니다. 이것근방을 확인해 주셨으면 좋겠습니다.
Lambda 함수
환경 변수
Microsoft Teams의 Incoming Webhook의 끝점 URI를 지정합니다.
필요한 모듈
https로 Microsoft Teams의 Incoming Webhook에 POST를 진행하기 위해서.
이 기사에서는 Lambda Layer에서 Requests가 생성되어 설정되어 있습니다.
IAM Role
AWS Health의 다양한 작업, 리소스에 대한 라이센스 설정
실행 간격
Amazon Event Bridge를 통해 일정 규칙을 설정하고 고정 속도로 5분 설정
클라우드워치 이벤트로 제작된 경우도 마찬가지다.
rate식의 예는 다음과 같다.
rate(5 minutes)
시간 초과
기본 3초부터 변경합니다.최대 15분으로 설정되면필요에 따라 단축하다.
코드
import json
import requests
import os
import datetime
import boto3
teams = os.getenv('teams', '')
def postTeams(title, msg):
try:
payload = {
"title": title,
"text": msg
}
payload_json = json.dumps(payload)
res = requests.post(teams, data=payload_json)
print(res)
return
except Exception as e:
print("Teams post Error")
print(e.message)
def lambda_handler(event, context):
toDateTime = datetime.datetime.now()
fromDateTime = toDateTime - datetime.timedelta(seconds=360)
health = boto3.client('health', region_name='us-east-1')
try:
jpevents=health.describe_events(
filter={
'regions': [
'ap-northeast-1',
'ap-northeast-3',
'global'
],
'lastUpdatedTimes':[
{
'from': fromDateTime,
'to': toDateTime
}
]
}
)['events']
for jpevent in jpevents:
if jpevent['eventScopeCode'] == 'PUBLIC':
response = health.describe_event_details(
eventArns=[
jpevent['arn']
]
)['successfulSet'][0]
#makeTitle
title=response['eventDescription']['latestDescription'].split('\n\n')[0]
#makeMsg
eDescription=response['eventDescription']['latestDescription'].split('\n\n')[-1]
eRegion=response['event']['region']
eService=response['event']['service']
post_msg = "# **■対象リージョン**: "+ eRegion + " **■対象サービス**: "+eService+"\r\n\r\n# **■事象**:\r\n\r\n"
post_msg = post_msg + eDescription.replace('|', '\r\n\r\n \r\n\r\n').replace('。','。\r\n\r\n').replace('. ','. \r\n\r\n')
postTeams(title, post_msg)
except Exception as e:
print("Teams post Error")
print(e.message)
postTeams()
MS Teams의 Incoming Webhook의 끝점 URI와 전송된 메시지의 제목과 텍스트 부분을 매개 변수로 지정하여 내용에 따라 MS Teams에 전송하는 함수
lambda_handler()
실행되면 현재 시간보다 360초 전의 날짜와 시간을 계산해 이 값에서 지금까지 발생한 도쿄 지역(ap-northeast-1)과 오사카 지역(ap-northeast-3)을 계산해 AWS 헬스에서 글로벌 서비스의 고장, 사건 정보를 얻는다.
그런 다음 해당 정보가 PUBLIC인지 여부를 판단하고 PUBLIC인 경우 각 이벤트에 대한 자세한 정보를 가져옵니다.
얻은 정보에 따라 MS Teams에 보내는 메시지 형식이 정돈됩니다.
성형할 때 줄바꿈선(¥n¥n)에 따라 배열하고 0번째 배열을 제목으로 하고 마지막 배열(-1개)은 본문에 삽입한다.현재 상황은 고장·이벤트 업데이트 때마다 줄을 바꾸어 분리하고 마지막 배열은 최신 업데이트입니다.
동작 확인
데이터 시간 변수와 from DateTime 변수의 적절한 시간입니다.datetime () 지정을 통해 확인할 수 있습니다.
다음은 MS Teams에서 동작 확인을 위한 출력의 예입니다.
Reference
이 문제에 관하여(AWS Health API에서 AWS 장애 정보를 가져와 MS Teams에 전송), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hirosys/articles/0df48100c94fc7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)