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