Lambda: CloudWatch アラームで DB インスタンスを再起動する
こんにちは、ももんが大好きの小山です。きょうは、なんらかの理由によって接続数の増えすぎてしまった DB インスタンスを自動的に再起動する方法についてご紹介しようと思います。
目標
DB インスタンスの CloudWatch メトリクス「DB Connections」に対してアラームを設定し、アラームの SNS メッセージを Lambda で受け取ることによって DB インスタンスの再起動を実行します。
ビフォー
アフター
ステップ1: CloudWatch アラームの作成
Amazon RDS コンソールで設定したい DB インスタンスを見つけて、Show Monitoring をクリックします。
表示されたグラフの中から、DB Connections を選択しましょう。
右下の Create Alarm をクリックして...
赤枠の create topic をクリックして新しい SNS トピックを作成します。With these recipients ではメールアドレスを入力できますが、バカンスに水を差されたくない方は空欄のまま進みましょう。アラームとしたい条件を指定したら Create Alarm をクリックします。
CloudWatch アラームが設定できました!
ステップ2: Lambda 関数の作成
AWS Lambda コンソールを開いて、Create a Lambda function をクリックします。Select blueprint のページが表示されたら、右下の Skip を選択します。
Configure function のページでは、ランタイムとして Python 2.7 を選択して以下のコードを貼り付けます。
from __future__ import print_function import boto3 import json import logging client = boto3.client('rds') logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info("From SNS: " + event['Records'][0]['Sns']['Message']) message = json.loads(event['Records'][0]['Sns']['Message']) instance_to_reboot = message['Trigger']['Dimensions'][0]['value'] logger.info("Instance to Reboot: " + str(instance_to_reboot)) try: client.reboot_db_instance( DBInstanceIdentifier=instance_to_reboot, ForceFailover=False ) logger.info("Rebooting...") except: logger.info("Something went wrong.")
Role から * Basic execution role を選択すると、IAM ロールの作成ページへ移動できます。
Role Name を任意の名称に書き換えて、View Policy Document > Edit から以下のポリシーを貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1457431087000", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "*" ] }, { "Sid": "Stmt1457431134000", "Effect": "Allow", "Action": [ "rds:RebootDBInstance" ], "Resource": [ "*" ] } ] }
Allow をクリックして Lambda 関数の作成ページへ戻ったら、Next で進みましょう。
内容を確かめたら、Create function で完了します。おつかれさまでした!
テスト
古典的な方法を用いて、設定した条件まで DB Connections を増やしてみます。
アラームだぞ!!
心配いりません。作成した Lambda 関数が通知を受け取って、DB インスタンスの再起動を実行しました。
やった!
きちんとアラームが止んで、DB インスタンスのステータスも available に戻っています。
おわりに
いかがでしたか? きょうご紹介したように、難しそうなことも AWS のサービスを使うだけで簡単に実現できることがあります。皆で知恵を絞りあって、システムが自律的に動作し続けるような明るい未来を切り開きましょう!