AWS Service health dashboard RSS를 읽고 업데이트가 있으면 AWS Lambda를 통해 Slack에 알림

추가



퍼스널 헬스 대시보드가 ​​되어 있으므로, 그쪽을 베이스로 생각하는 편이 좋아지고 있습니다.
htps : // 아 ws. 아마존. 이 m / jp / b ぉ gs / 네 ws / 아 ws ぺr 소나 l 헤아 lth-이다 sh 보아 rd /

목적



AWS의 서비스 상태 대시보드를 일부러 보지 않고도 알림을 받을 수 있다면 편리합니다.
AWS Lambda의 스케줄 이벤트에서 RSS를 읽으러 갔고, Lambda 스케줄 기간 중에 update 정보가 있으면 그 정보를 slack에 던지는 봇적인 녀석을 만들어 보았습니다.
slack에 rss를 integration을 하는 기능이 있습니다만, 1-rss/1-account가 되기 때문에 수에 제한이 있는 무료 유저라면 1-계정으로 복수를 읽는 편이 계좌 효율이 좋을까 생각했습니다.

사용하는 것



Slack: 게시용
AWS Lambda: RSS 확인
Amazon S3: 구독할 RSS 정의

사전 준비



당연히 Slack을 가지고 있다고 가정합니다. Slack에 slack Incoming WebHooks를 만듭니다.

상위에서 얻은 웹 후크 URL을 적어주세요.
htps // // 뽀오 ks. scck. 코 m/세 rゔぃ세 s/
같은 모양이라고 생각합니다.

AWS 측 설정



S3에 설정 파일 배치



우선 인간적으로 읽기 쉬운 json으로 해 보았습니다.
서비스명이라든지, 서비스마다 AWS라든지의 접두사가 있거나 없었기 때문에, 가장 빠른 RSS 피드를 복사해 주는 편이 좋을까 생각해, 이하의 형태로 하고 있습니다.
Key에 서비스명을 적당하게 설정해 주세요. 표시에만 사용하기 때문에 적당하고 좋습니다. .
rss 피드는 서비스 건강 대시보드을 참조하고 rss 피드 URL을 설정하십시오.

setup.json
{
    "Tokyo":{
        "EC2":"https://status.aws.amazon.com/rss/ec2-ap-northeast-1.rss",
        "S3":"https://status.aws.amazon.com/rss/s3-ap-northeast-1.rss",
        "Lambda":"https://status.aws.amazon.com/rss/lambda-ap-northeast-1.rss",
        "IoT":"https://status.aws.amazon.com/rss/awsiot-ap-northeast-1.rss"
    },
    "Other":{
        "Console":"https://status.aws.amazon.com/rss/management-console.rss",
        "Route53":"https://status.aws.amazon.com/rss/route53.rss"
    }

}

우선 S3의 버킷으로 설정합니다. 이번에는 은닉 정보가 전혀 없기 때문에 설정 예는 참조 풀 오픈으로 하고 있습니다.
버킷 이름과 폴더를 포함한 경로 이름을 메모합니다.
버킷 이름은 조금 지웠습니다. 경로는 첫 번째 "/"가 필요하지 않습니다. 이번 예에서는 SHD/SHD_setup.json입니다.


AWS Lambda



이번에는 파이썬으로 만들고 있습니다. slack 게시물과 rss 피드 분석에는 유용한 패키지가 있지만 AWS Lambda에서 실행하는 것을 고려하여 표준 패키지로만 작성합니다. 다음 변수는 사용자 환경에 맞게 설정하십시오.

SLACK_URL: 위에서 얻은 slack webhook용 URL
BUCKET : 설정 파일을 넣은 S3 버킷 이름
S3_FILE : 버킷 아래의 구성 파일 경로 이름
DURATION : 감시 간격 = Lambda의 스케줄을 어느 정도의 감각으로 움직이는지를 초로 (본 예에서는 5 분 간격을 상정)

Configuration triger에서의 이벤트 설정은 다음과 같은 느낌입니다.
rate 로 5분 간격을 지정해 주세요



다음을 실행 시간을 python2.7로, Lambda의 editor에 복사하십시오.
role에 필요한 권한은 표준 Lambda 실행 = lamda_basic_execution에서만 가능합니다.
rss의 report time의 PST/PDT를 고려했습니다.

SHD_check.py
################################
# Check AWS Service Health Dashboard
#  Someting item post within 1-hour
###############################
import xml.etree.ElementTree as ET
import urllib2
import sys
import json
import time
import datetime
import boto3

#Slack_Webhook
SLACK_URL='YOUR_SLACK_URL'

#For setup.json
BUCKET='YOUR_BUCKET'
S3_FILE='S3_FILE'
LOCAL_SETUP_FILE='/tmp/SHD_setup.json'

# Check duration interval
DURATION = 500

# Initial global setup
s3 = boto3.client('s3')
now = datetime.datetime.now()

################################
# Slack post
################################
def post2Slack(msg):
    try:
        payload = {
            "text":msg
        }
        payload_json = json.dumps(payload)
        req = urllib2.Request(SLACK_URL, data=payload_json)
        res = urllib2.urlopen(req)

        return

    except Exception as e:
        print 'Slack Post Error'
        print e.message

###############################
# Serup file Download from S3
###############################
def read_Setup():
    try:
        s3.download_file(BUCKET, S3_FILE, LOCAL_SETUP_FILE)
        f = open(LOCAL_SETUP_FILE, "r")
        setfile = json.load(f)
        f.close()

        return setfile

    except Exception as e:
        print "Setup file init Error"
        print e.message
        exit()

###############################
# consider timezone
#   rss report timezone is PDT/PST
#   return changetime
###############################
def changeToUTC(pubtime, tz):
    if tz == "PDT":
        diff = 7
    elif tz == "PST":
        diff = 8
    else:
        diff = 0

    pubtime += datetime.timedelta(hours = diff)

    return pubtime


###############################
# rss_update check
#   No update:NULL
#   Update : rss description filed
#-----------------------------------
# Item filed: 0:tile, 1:link, 2:pubDate, 3:guid, 4:description
###############################
def rss_update(xml_path):
    try:
        feed = ET.fromstring(urllib2.urlopen(xml_path).read())

        for item in feed.iter('item'):
            description = item[4].text
            pubdate = item[2].text

            if 'None' != pubdate:
                date = pubdate.split(',')
                element_date = date[1].split(' ')
                while element_date.count("") > 0:
                    element_date.remove("")
                pub = element_date[2]+'-'+element_date[1]+'-'+element_date[0]+' '+element_date[3]
                stime = datetime.datetime.strptime(pub, '%Y-%b-%d %H:%M:%S' )
                timezone = element_date[4]
                UTC_pubtime = changeToUTC(stime, timezone)

                delta = now - UTC_pubtime
                delta_sec = delta.total_seconds()

                check_time = delta_sec - DURATION
                if check_time < 0:
                    return description

        return

    except Exception as e:
        print "Get RSS error"
        print e.message
        exit()

#################################
#main
#################################
def lambda_handler(event, context):
    J_setfile = read_Setup()

    regions = J_setfile.keys()
    try:
        updates={}
        for region in regions:
            services = J_setfile[region].keys()
            for service in services:
                rss = J_setfile[region][service]
                print '%s:%s' % (region, service)

                res = rss_update(rss)
                if res :
                    post_msg = region+':'+service+':'+res
                    post2Slack(post_msg)
                #else:
                    #post_msg = region+':'+service+' No update in this duration'
                    #post2Slack(post_msg)


    except Exception as e:
        print "Error in main"
        print e.message
        exit()


문제 없음 경로는 주석 처리 중이지만 문제 없음을 표시하려면 else 경로의 주석 처리를 제거하십시오.

면책



본 투고는, 개인의 의견으로, 소속하는 기업이나 단체는 관계 없습니다.
또 게재하고 있는 sample 프로그램의 동작에 관해서도 보장하지 않으므로, 참고 정도로 해 주세요.

좋은 웹페이지 즐겨찾기