AWS Support와의 추억을 언제까지나 유지할 수 있도록 했습니다.

AWS Support 모두 사용하고 계십니까?



내가 가장 좋아하는 서비스 중 하나가 AWS Support라는 사실을 알고 있다고 생각합니다.
시험에 나갈게요.

좋아.
이 AWS Support를 사용하여 문의한 것(기표한 것)은, 기표 후 12개월간은 사용할 수 있다는 것.
htps : // 아 ws. 아마존. 코 m / jp / p 레미 m 쏘 rt / 후 qs /

Q: 사례 기록의 보존 기간은 얼마입니까?

서포트 케이스의 이력은, 작성 후 12개월간 이용하실 수 있습니다.

라고 하는 것은, 기표로부터 12개월 경과하면, AWS Support 와의 추억이 없어져 버린다! ?
경미한 질문이나 초중요한 장해에의 문의도 전부 없어져 버린다! ?

그것은 왠지 싫다, 라고.
그리고, 우리의 여러 쑥쑥 엔지니어스로부터 같은 타이밍에 이야기를 받았으므로,
물건은 시도하고 AWS Support와의 추억을 남겨 두려고 노력했습니다.

조리법



등장인물


  • AWS Support

  • AWS Support와의 추억 지원 사례

  • AWS Lambda
  • Python 3.x에서 Lambda 함수를 만듭니다.
  • IAM Role은 적절히 붙여 주세요.
  • Amazon CloudWatch Logs 쓰기 및 Amazon DynamoDB 읽기 및 쓰기 시스템을 부여합니다.

  • Amazon DynamoDB
  • 추억을 가져 오는 곳 (SupportCases 테이블)
  • 자라는 추억을 기억하는 곳 (notResolvedCases 테이블)


  • 구성도




    ※ AWS Support의 단순 아이콘이 보이지 않았기 때문에 Forums 아이콘으로 대용하고 있습니다.

    Amazon CloudWatch Events



    이번은 10일에 1번 캡처하므로 이하와 같은 설정으로 했습니다.


    아래의 Lambda 함수를 만든 다음 설정하십시오.

    완성된 Amazon CloudWatch Events는 이런 느낌입니다.


    Amazon DynamoDB 테이블



    SupportCases 테이블




    키 이름
    설정


    case_id
    기본 키

    timeCreated
    정렬 키


    notResolvedCases 테이블




    키 이름
    설정


    case_id
    기본 키

    timeCreated
    정렬 키


    AWS Lambda의 Lambda 함수



    에러 핸들링은 하고 있지 않으므로, 어디까지나 참고・・・

    lambda_function.py
    import json
    import boto3
    import datetime
    
    dynamodb = boto3.resource('dynamodb')
    s_table = dynamodb.Table('SupportCases')
    n_table = dynamodb.Table('notResolvedCases')
    
    # AWS Support の エンドポイントは米国東部(us-east-1)
    support = boto3.client('support', 'us-east-1')
    
    # 10日に1度動くために実行時点から10日前の0時0分とする。
    now = datetime.datetime.now()
    lastUpdate = '{0:%Y}-{0:%m}-{0:%d}T00:00:00.000Z'.format(now - datetime.timedelta(days=10))
    
    def lambda_handler(event, context):
        # 前回見た際に、resolved になっていないものがあったかを確認
        notResolvedIds = getNotResolvedIds()
    
        # resolved になっていなかったものがあれば更新する
        if len(notResolvedIds) >= 1:
            upDateNotReslvedIds(notResolvedIds)
    
        # 前回取得から今回までの間の追加・更新分を取得
        supportCases = describeSupportCases()
    
        # あれば更新する
        if len(supportCases) >= 1:
            addSupportCases(supportCases)
    
        return
    
    def getNotResolvedIds():
        # notResolvedCases テーブルから resolved になっていない
        # サポートケースの caseId を取得する
        case_ids=[]
        response = n_table.scan()
        for i in response['Items']:
            case_ids.append(i['case_id'])
    
        return case_ids
    
    def upDateNotReslvedIds(notResolvedIds):
        # case_idを指定して resolved にいなかったサポートケースを取得する
    
        response=support.describe_cases(
            caseIdList=notResolvedIds,
            includeResolvedCases=True,
            language='ja'
        )
    
        for i in response['cases']:
            # resolved になっていなかったサポートケースの情報を更新する
            response = s_table.put_item(
                Item={
                    'case_id': i['caseId'],
                    'display_id': i['displayId'],
                    'subject': i['subject'],
                    'serviceCode': i['serviceCode'],
                    'categoryCode': i['categoryCode'],
                    'severityCode': i['severityCode'],
                    'timeCreated': i['timeCreated'],
                    'status': i['status'],
                    'communications': i['recentCommunications']['communications']
                }
            )
    
            # 更新時に resolvedになっていたら、notResolvedCasesテーブルから情報を消す
            if i['status'] == "resolved":
                response = n_table.delete_item(
                    Key={
                        'case_id': i['caseId'],
                        'timeCreated': i['timeCreated']
                    }
                )
    
    def describeSupportCases():
        # 指定日(例:10日前)から実行時点までのサポートケースを取得する
        response = support.describe_cases(
            afterTime=lastUpdate,
            includeResolvedCases=True,
            language='ja'
        )
    
        return response
    
    def addSupportCases(supportCases):
        # 取得したサポートケースを SupportCases テーブルに格納する
        for i in supportCases['cases']:
            response = s_table.put_item(
                Item={
                    'case_id': i['caseId'],
                    'display_id': i['displayId'],
                    'subject': i['subject'],
                    'serviceCode': i['serviceCode'],
                    'categoryCode': i['categoryCode'],
                    'severityCode': i['severityCode'],
                    'timeCreated': i['timeCreated'],
                    'status': i['status'],
                    'communications': i['recentCommunications']['communications']
    
                }
            )
            # status が resolved 以外だったら notResolvedCases テーブルに記録する
            if i['status'] != "resolved":
                response = n_table.put_item(
                Item={
                    'case_id': i['caseId'],
                    'timeCreated': i['timeCreated'],
                    'status': i['status'],
                }
            )
    

    이것이 움직이면 어떻게 될 것인가?



    간단하게 정리하면 이하와 같다. .
  • Amazon CloudWatch Events가 발화됨
  • AWS Lambda가 움직이고 Lambda 함수 실행
  • notResolvedCases 테이블에 정보가 있는지 확인
  • 있는 경우 지원 사례의 ID를 기반으로 정보를 얻습니다.
  • 검색된 정보를 SupportCases 테이블로 업데이트
  • 지원 사례의 상태가 resolved(해결됨)가 되면 notResolvedCases 테이블에서 제거
  • 런타임 10일 전부터 런타임까지의 기간을 지정하여 AWS Support에서 지원 사례 정보를 검색합니다.
  • 검색된 지원 사례 정보를 SupportCases 테이블에 저장합니다.
  • 이 경우 지원 사례의 상태가 resolved (해결됨)가 아니면 notResolvedCases 테이블에 정보를 씁니다.


  • 끝.

    요약



    12개월 정도밖에 기억할 수 없는 AWS Support와의 추억을 이렇게 저장해 두면,
    앞으로는 아래의 예와 같은 표시 방법으로 언제까지나 즐길 수 있습니다.
  • Amazon QuickSight
  • Amazon CloudSearch
  • Amazon API Gateway + AWS Lambda + Amazon S3로 WebUI에서 보기
  • 좋은 웹페이지 즐겨찾기