RDSメンテナンス、PHDやメールで通知されないものも取得&通知するLambda


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 の例

ペンディング中のメンテナンスアクションが2つ存在するリージョンで試すと、以下のように2つ通知が飛んできました。

定期実行

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"
    }