AWS의 장애 정보 확인(2012/6/13 업데이트)

19789 단어 RSS문제 해결AWS
(2020년 6월 13일 갱신) 후반부에 기재된 JSON은 늘 갱신에 시체가 있다고 생각하고 상황이 [RESOLVED]로 변한 후에 등록한다.
4월 20일 저녁 AWS 도쿄구의 SQS와 람다에서 장애가 발생했다.
AWS도 무적은 아니다.
장애가 있을 때 바로 알아차리고 싶어요.

Service Health Dashboard 확인


AWS가 고장 났을 때 이쪽 사이트에서 방송을 합니다.
https://status.aws.amazon.com/
이쪽 웹사이트인 RSS도 발송됐으니 RSS 리더가 미리 체크하면 되요.
그렇지만
각 서비스마다 체크해야 하는 RSS 파일이 나뉘어져 있습니다!!!
'Tokyo'로 검색해도 120건...모든 수동 등록은 불가능하다.
(슬랙에 알림이나 현재 물건을 보내는 것을 고려했지만 120건을 수동으로 등록할 수 없습니다.)

모든 RSS 파일이 요약된 RSS 파일 작성


람다에서 주기적으로 복제하는 작전이에요.못할 일이 없다.
만들어진 파일도 S3에 저장돼 있어 밖에서 볼 수 있다.
이 예에서는 Service Health Dashboard 태그를 지정하여 처리합니다.
Asia Pacific 태그 수가 많아 한 번에 5분 정도 걸립니다.
import os
import requests
from bs4 import BeautifulSoup

base_url = 'https://status.aws.amazon.com'

rss_template = ('<?xml version="1.0" encoding="UTF-8"?>'
                '<rss version="2.0">'
                '  <channel>'
                '    <title><![CDATA[AWS Service Status]]></title>'
                '    <link>http://status.aws.amazon.com/</link>'
                '    <description><![CDATA[AWS Service Status]]></description>'
                '  </channel>'
                '</rss>'
                )

def get_rss_list(block):
    print('start get_rss_list')
    res = requests.get(base_url)
    aws_soup = BeautifulSoup(res.text, 'lxml')

    tables = aws_soup.find(id=block).find_all('table')

    links = []

    for tr in tables[1].find('tbody').find_all('tr'):
        tds = tr.find_all('td')
        links.append({'service': tds[1].text, 'url': tds[3].find('a').get('href')})

    return links

def get_rss_item(rss_url):
    print(rss_url)
    response = requests.get(rss_url)
    return response.text

def add_rss_item(rss_text, rss_path, service_name, output_soup):
    rss = BeautifulSoup(rss_text, 'xml')
    items = rss.find_all('item')
    for item in items:        
        category = rss.new_tag('category')
        category.append(service_name)
        item.append(category)
        output_soup.find('channel').append(item)

def put_object(rss_string, block):
    import boto3
    client = boto3.client('s3')
    client.put_object(
        ACL='public-read',
        Body=rss_string.encode('utf-8'),
        Bucket=os.getenv('S3_BUCKET'),
        Key='aws-status'+block+'.rss',
        ContentType='application/rss+xml'
    )

def lambda_handler(event, context):
    block = event['block']
    print(block)

    output_soup = BeautifulSoup(rss_template, 'xml')

    for rss in get_rss_list(block):
        url = base_url + rss['url']
        text = get_rss_item(url)
        add_rss_item(text, url, rss['service'], output_soup)

    put_object(str(output_soup), block)

전역 장애 정보를 얻을 수 있는 JSON의 존재


열심히 만든 끝에 전 구역의 고장 정보를 얻을 수 있는 JSON 파일이 있다는 것을 알게 되었다.역시 클라스메트호드.동경하다.
[소절] AWS가 과거에 발생한 고장 역사를 확인하는 방법|Developers.IO
https://dev.classmethod.jp/articles/service-health-status-history/
https://status.aws.amazon.com/data.json
그 JSON이야.RSS와 거의 동일한 정보를 얻을 수 있습니다.
이걸 RSS로 만들면 좋을 것 같은데.
처리 시간도 30초 안에 끝나기 때문에 API Gateway로 RSS를 보낼 수 있다.
import requests
from bs4 import BeautifulSoup
from bs4.element import CData
from datetime import datetime, date, time, timezone, timedelta

rss_template = ('<?xml version="1.0" encoding="UTF-8"?>'
                '<rss version="2.0">'
                '  <channel>'
                '    <title><![CDATA[AWS Service Status]]></title>'
                '    <link>http://status.aws.amazon.com/</link>'
                '    <description><![CDATA[AWS Service Status]]></description>'
                '  </channel>'
                '</rss>'
                )

item_template = ('<item>'
                 '    <title></title>'
                 '    <link>http://status.aws.amazon.com/</link>'
                 '    <pubDate></pubDate>'
                 '    <guid isPermaLink="false"></guid>'
                 '    <description></description>'
                 '    <category></category>'
                 '</item>')

def lambda_handler(event, context):
    soup = BeautifulSoup(rss_template, 'xml')

    r = requests.get('https://status.aws.amazon.com/data.json')
    json = r.json()

    JST = timezone(timedelta(hours=+9), 'JST')

    for item in json['archive']:
        title = item['summary']
        pubDate = item['date']
        pubDate = datetime.fromtimestamp(int(item['date']),JST).strftime('%a, %d %b %Y %H:%M:%S %Z')
        guid = item['service'] + item['date']
        description = item['description']
        category = item['service_name']

        item = BeautifulSoup(item_template, 'xml')
        item.title.append(title)
        item.pubDate.append(pubDate)
        item.guid.append(guid)
        item.description.append(CData(description))
        item.category.append(category)

        soup.find('channel').append(item)

    response = {
        'statusCode': 200,
        'isBase64Encoded': False,
        'headers': {'Content-Type': 'text/xml;charset=UTF-8'},
        'body': str(soup)
    }

    return response

사이트도 해봤어요.


data.제이슨이 이력서를 확인하는 사이트를 사용해 보세요.
4월 20일 도쿄 지역의 고장 이후 버지니아의 EC2, 4/22의 클라우드 프론트도 고장이 났다.

단지 JSON 성형을 받았을 뿐, 데이터.json이 CORS와 관련된 것을 얻었기 때문에 API Gateway의 HTTP API 제작을 통해 CORS가 효과적인 HTTP 프록시를 통합시켜 회피합니다.

좋은 웹페이지 즐겨찾기