RDS 유지 보수, PHD 또는 이메일로 통지되지 않는 것도 취득 & 통지 Lambda

6436 단어 RDSAWS
RDS의 유지보수 정보는 그 모든 것이 메일이나 PHD(Personal Health Dashboard)에 통지되는 것은 아닙니다(서포트 확인이 끝난 상태). 그러한 것도 파악하고 싶은 경우는 describe-pending-maintenance-actions 커멘드로 취득하는 방법이 있습니다.

그래서 describe-pending-maintenance-actions하고 결과가 비어 있지 않으면 SNS에 알리는 Lambda를 작성해 보았습니다. CloudFormation 템플릿 으로 정리하고 있습니다.

정기 실행해 두면, 지금까지 PHD나 메일만으로는 파악을 할 수 없었던 메인터넌스 정보도 주울 수 있습니다.

구성





이용 절차



SNS 준비



알림 대상 SNS 주제를 준비합니다.
ARN은 나중에 사용합니다.



이번에는 편하게 코드 쓰지 않고 Slack 통지하고 싶었으므로, 통지하고 싶은 Slack 채널의 통합 설정으로부터 메일 주소를 지불해, 그 주소를 SNS에 서브스크립션 등록했습니다.



Lambda 만들기 (CloudFormation 사용)



Notify_RdsMaintenancePendingActions.yml 을 사용하여 새 CloudFormation 스택을 만듭니다.



스택 이름과 알림 대상 SNS의 ARN을 입력합니다. AppName은 리소스의 접두사로 사용됩니다. 조건이 없으면 기본값으로 유지됩니다.



IAM 생성 권한을 체크하여 스택을 생성합니다.

실행 테스트



디폴트라고 「DescribeRdsMaintenancePendingActions」라고 하는 Lambda가 되어 있으므로, 테스트 실행해 보세요. RDS 펜딩 액션이 있으면 SNS에 알림이 날 것입니다.

SNS -> EMail -> Slack 예제



보류중인 유지 보수 작업이 두 가지 존재하는 지역에서 시도하면 다음과 같이 두 가지 알림이 날아 왔습니다.


정기 실행



EventBridge의 스케줄 실행을 이 Lambda와 관련시켜 두면 정기적인 체크를 할 수 있습니다.
CloudFormation에는 일정 실행 부분이 포함되어 있지 않으므로 수동으로 설정해야 합니다.

코드



CloudFormation에 다음 코드를 인라인으로 포함합니다. (Python3.9)
일단 평범한 것으로 동작을 보고 싶었기 때문에 필터 등은 하지 않고, 그대로 멘테의 수만 통지하고 있습니다.
import json
import boto3
import os

rds = boto3.client('rds')
sns = boto3.client('sns')
TOPIC_ARN = os.environ["TOPIC_ARN"]

def main(event, context):
    # Describe
    paginator = rds.get_paginator('describe_pending_maintenance_actions')
    iter = paginator.paginate()
    for res in iter:
        for action in res["PendingMaintenanceActions"]:
            # Publish
            message = json.dumps(action, default=str)
            print(f"publish {TOPIC_ARN=} {message=}")
            sns.publish(
                TopicArn=TOPIC_ARN,
                Subject="RDS Pending Maintenance Action",
                Message=message
            )

    # return
    return {
        'statusCode': 200,
        'body': "ok"
    }

좋은 웹페이지 즐겨찾기