AWS Step Functionsを使用して、自動的に開始されたRDS DBインスタンスを停止してみる


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

Amazon RDSのDBインスタンスは一時的に停止していても、7日後に自動的に再起動してしまいます。AWSによる再起動のことを忘れて、びっくりする額の請求が来たことがある人もいるのではないでしょうか。

 

スナップショットから復元する手間を考えたら、一時的に停止しておきたいけど、起動したときのコストを考えて7日後に手動で停止するのは面倒ですよね。

 

今回紹介する構築例は、AWS Step Functionsを使用して、自動的に開始されたRDSインスタンスを停止する仕組みです。

 

この記事はこんな方におすすめ

  • RDSのコストに悩んでいる方
  • 自動起動したDBインスタンスを手動で停止している方
  • DBインスタンスの自動起動に冷や汗をかいたことがある方

 

 

AWS Step Functionsを使用して、DBインスタンスを停止してみる

■AWS Step Functionsとは

StepFunctions アイコン

 

AWS Step Functionsは、デベロッパーがAWSのサービスを利用して分散型アプリケーションを構築し、プロセスを自動化し、マイクロサービスのオーケストレーション、データと機械学習のパイプラインを構築できるようにするビジュアルワークフローサービスです。(AWS サービス概要より)

 

ビジュアルワークフローとは、以下の画像がわかりやすいかと思います。下の画像は今回の構築で使用したStepFunctionsステートマシンのワークフローとタスクを視覚化した図です。

 

saitou-autostartrds-workflow

 

 

●AWS Step Functionsユースケース

Step Functionsを利用することで、タスクひとつひとつのコードの書き込みを減らし、アプリケーションの迅速な構築と更新に集中することができます。以下に挙げるのは、AWS Step Functionsの一般的なユースケースです。

 

  1. 関数オーケストレーション
  2. 分岐
  3. エラー処理
  4. ヒューマン・イン・ザ・ループ
  5. 並列処理
  6. 動的並列処理

 

今回作成するステートマシンは特定の順序でLambda関数を実行するワークフローを作成するので、関数オーケストレーションに分類されるかと思います。ワークフローの各ステップがどのように動いているかが確認できるため、運用面でもわかりやすいです。

 

 

■構築例紹介

RDS自動停止構築図

 

今回のAWS Step Functionsを使用して、自動的に開始されたRDSインスタンスを停止する仕組みは、上の画像の構築図をもとに作成していきます。構築の概要は以下の通りです。

 

 

~使用するAWSサービス~

 

  • Amazon SNS
  • Amazon RDS
  • AWS IAM
  • AWS Lambda
  • AWS Step Functions

 

~仕組みの流れ~

 

  1. DBインスタンスが自動的に起動したらRDSイベントサブスクリプションからAmazon SNSに通知
  2. Amazon SNSによって、フィルタリング兼Step Functions実行用Lambda関数をトリガー
  3. Step Functionsステートマシンは、自動起動したDBインスタンスの状態を確認し、利用可能状態になるまで待ち、利用可能状態になったら停止用Lambda関数にトリガーしDBインスタンスを停止

 

 

■SNSトピック作成

まずはSNSトピックを作成します。RDSイベントサブスクリプションの通知をLambda関数にプッシュするためのトピックです。

 

設定値は以下の通りです。

 

 

項目 設定値
タイプ スタンダード
名前 saito-rds-event-notifications-topic(任意)
表示名 saito-rds-event-notifications-topic

 

 
サービス検索画面で「SNS」と打ち、Amazon Simple Notification Serviceのコンソール画面に行きます。左ペインの「トピック」を押し、「トピック作成」をクリックしてください。

 

saitou-autostartrds-sns

saitou-autostartrds-sns

 

↓タイプは標準を選択します。FIFOを選択すると、作成したトピックはイベントサブスクリプションの通知送信先に指定ができません。

 

saitou-autostartrds-sns

 

↓値を入力しましたら、「トピックの作成」を押しましょう。

 

saitou-autostartrds-sns

saitou-autostartrds-sns

 

“トピック saitou-rds-event-notifications-topic が正常に作成されました。”で表示されたら完了です。

 

 

■RDSイベントサブスクリプション作成

次にRDSイベントサブスクリプションを作成します。Amazon RDSの停止やスタートなどのイベントが発生したときの通知を、Amazon SNSにプッシュするためのイベントサブスクリプションです。

 

設定値は以下の通りです。

 

項目 設定値
名前 saito-RdsAutoRestartEventSubscription(任意)
ARN 作成したSNSトピック
ソースタイプ インスタンスイベント
インスタンスを含みます すべてインスタンス
イベントカテゴリを含みます 特定のイベントカテゴリを選択
特定のイベントカテゴリ notification(通知)

 

 

RDSのコンソール画面に行きます。

 

saitou-autostartrds-RDS

 

↓左ペインから「イベントサブスクリプション」をクリックし、「イベントサブスクリプションを作成」を押してください。

 

saitou-autostartrds-RDS

saitou-autostartrds-RDS

saitou-autostartrds-RDS

 

↓Amazon RDSは一時停止状態の最大期間である7日間に達すると、DBインスタンスが自動的に再起動したことを示すイベントを生成します。

 

この特定のRDSイベント(RDS-EVENT-0154)は、「通知(notification)」カテゴリに属します。他にも“DBインスタンスが停止”はRDS-EVENT-0087、“DBインスタンスがスタート”はRDS-EVENT-0088です。詳しくは、AWS公式ドキュメントの“DB インスタンスイベント”を参照してください。

 

saitou-autostartrds-RDS

 

↓入力が完了しましたら、「作成」をクリックしてください。

 

saitou-autostartrds-RDS

 

 

“イベントサブスクリプション saito-RdsAutoRestartEventSubscription が正常に作成されました”と表示されましたら完了です。

 

 

■IAMロール・ポリシー作成

Lambda関数とStepFunctionsステートマシンにアタッチするIAMロールを作成します。Lambda関数に付与する権限は、以下の通りです。

 

  • AWS Step Functionsステートマシンの実行
  • DBインスタンスの状態の取得
  • DBインスタンスの停止
  • CloudWatch Logsへのアクセス許可

 

 

まずはLambda関数にアタッチするIAMロールのIAMポリシーを作成します。設定値は以下の通りです。

 

項目 設定値
名前 saito-rds-auto-restart-lambda-policy(任意)
説明 For AWS Lambda

 

 

サービス検索画面で「IAM」と打ち、IAMのコンソール画面に行きます。

 

saitou-autostartrds-IAM

 

↓左ペインから「ポリシー」を押し、「ポリシーを作成」をクリックしてください。

 

saitou-autostartrds-IAM

 

↓「JSON」タブを押し、以下のJSONドキュメントを貼り付けてください。

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "rds:AddTagsToResource",
                "rds:ListTagsForResource",
                "rds:DescribeDBInstances",
                "states:StartExecution",
                "rds:StopDBInstance"
            ],
            "Resource": "*"
        }
    ]
}

 

貼り付けが完了しましたら、「次のステップ: タグ」を押します。

 

saitou-autostartrds-IAM

 

↓タグは任意で作成し、「次のステップ: 確認」をクリックしてください。

 

saitou-autostartrds-IAM

saitou-autostartrds-IAM

 

↓値の入力が完了しましたら、「ポリシーの作成」を押してください。

 

saitou-autostartrds-IAM

 

 

次にIAMロールを作成します。設定値は以下の通りです。

 

項目 設定値
信頼されたエンティティタイプ AWSのサービス
ユースケース Lambda
許可ポリシー AWSLambdaBasicExecutionRole

 

 

IAMのコンソール画面の左ペインにある「ロール」を押し、「ロールを作成」をクリックしてください。

 

saitou-autostartrds-IAM

 

↓信頼されたエンティティを選択し、「次へ」を押しましょう。

 

saitou-autostartrds-IAM

 

↓ポリシーの検索窓でAWS管理ポリシー「AWSLambdaBasicExecutionRole」を検索し、チェックを付けて追加します。

AWSLambdaBasicExecutionRole

 

saitou-autostartrds-IAM

 

↓もう一つ、先ほど作成したIAMポリシーを追加しましょう。検索窓で「saito-rds-auto-restart-lambda-policy」と検索し、該当のポリシーにチェックを入れて、「次へ」をクリックしてください。

 

saitou-autostartrds-IAM

 

↓名前は「saito-rds-auto-restart-lambda-role」と入力し、“ステップ2許可を追加する”の項目にポリシーが2つあることができましたら、「ロールを作成」を押しましょう。

 

saitou-autostartrds-IAM

saitou-autostartrds-IAM

saitou-autostartrds-IAM

 

“Role saito-rds-auto-restart-lambda-role created.”と表示されましたら完了です。

 

次にAWS Step Functionsステートマシン用のIAMポリシーを作成します。AWS Step FunctionsにLambda関数を呼び出す許可を与えます。

 

saitou-autostartrds-IAM

 

↓「JSON」タブを押し、以下のJSONドキュメントを貼り付けてください。

 

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}
]
}

 

saitou-autostartrds-IAM

 

↓名前「saito-rds-auto-restart-stepfunctions-policy」入力し、「ポリシーの作成」を押してください。

 

saitou-autostartrds-IAM

 

 

IAMロール・ポリシーの作成は以上です。

 

 

■Lambda関数作成

Lambda関数を作成します。構築図を見ていただくとわかる通り、Lambda関数を3つ用意します。

 

saitou-autostartrds 構築図2

 

 

【Lambda用途別】

 

  1. Step Functions実行用(start-statemachine-execution-lambda)
  2. DBインスタンスの状態確認用(retrieve-rds-instance-state-lambda)
  3. DBインスタンス停止用(stop-rds-instance-lambda)

 

まずは①Step Functions実行用のLambda関数を作成します。

 

設定値は以下の通りです。

 

 

項目 設定値
関数の作成 一から作成
関数名 saito-start-statemachine-execution-lambda
ランタイム Python 3.9
アーキテクチャ x86_64
実行ロール 既存のロールを使用する
既存のロール 作成したIAMロール

 

 

サービス検索画面で「Lambda」と打ち、Lambdaのコンソール画面に行きます。

 

saitou-autostartrds-Lambda1

 

↓左ペインの「関数」を押し、「関数の作成」をクリックしてください。

 

saitou-autostartrds-Lambda1

saitou-autostartrds-Lambda1

 

↓値の入力が完了しましたら、「関数の作成」を押しましょう。

 

saitou-autostartrds-Lambda1

 

↓作成した関数“saito-start-statemachine-execution-lambda”の詳細画面で、「コード」を押し、以下のPythonコードを貼り付けてください。コードの内容は、SNSからプッシュされたRDSの通知内容をフィルタリングし、StepFunctionsステートマシンを実行するか判断します。実行する場合は、RDSのDBインスタンスIDをステートマシンに渡します。

 

import json
import boto3
import logging
import os

#Logging
LOGGER = logging.getLogger()
LOGGER.setLevel(logging.INFO)

#Initialise Boto3 for RDS
rdsClient = boto3.client('rds')

def lambda_handler(event, context):

    #log input event
    LOGGER.info("RdsAutoRestart Event Received, now checking if event is eligible. Event Details ==> ", event)

    #Input event from the SNS topic originated from RDS event notifications
    snsMessage = json.loads(event['Records'][0]['Sns']['Message'])
    rdsInstanceId = snsMessage['Source ID']
    stepFunctionInput = {"rdsInstanceId": rdsInstanceId}
    rdsEventId = snsMessage['Event ID']

    #Retrieve RDS instance ARN
    db_instances = rdsClient.describe_db_instances(DBInstanceIdentifier=rdsInstanceId)['DBInstances']
    db_instance = db_instances[0]
    rdsInstanceArn = db_instance['DBInstanceArn']

    # Filter on the Auto Restart RDS Event. Event code: RDS-EVENT-0154. 

    if 'RDS-EVENT-0154' in rdsEventId:

        #log input event
        LOGGER.info("RdsAutoRestart Event detected, now verifying that instance was tagged with auto-restart-protection == yes")

        #Verify that instance is tagged with auto-restart-protection tag. The tag is used to classify instances that are required to be terminated once started. 

        tagCheckPass = 'false'
        rdsInstanceTags = rdsClient.list_tags_for_resource(ResourceName=rdsInstanceArn)
        for rdsInstanceTag in rdsInstanceTags["TagList"]:
            if 'auto-restart-protection' in rdsInstanceTag["Key"]:
                if 'yes' in rdsInstanceTag["Value"]:
                    tagCheckPass = 'true'
                    #log instance tags
                    LOGGER.info("RdsAutoRestart verified that the instance is tagged auto-restart-protection = yes, now starting the Step Functions Flow")
                else:
                    tagCheckPass = 'false'

        #log instance tags
        LOGGER.info("RdsAutoRestart Event detected, now verifying that instance was tagged with auto-restart-protection == yes")

        if 'true' in tagCheckPass:

            #Initialise StepFunctions Client
            stepFunctionsClient = boto3.client('stepfunctions')

            # Start StepFunctions WorkFlow
            # StepFunctionsArn is stored in an environment variable
            stepFunctionsArn = os.environ['STEPFUNCTION_ARN']
            stepFunctionsResponse = stepFunctionsClient.start_execution(
            stateMachineArn= stepFunctionsArn,
            name=event['Records'][0]['Sns']['MessageId'],
            input= json.dumps(stepFunctionInput)

        )

    else:

        LOGGER.info("RdsAutoRestart Event detected, and event is not eligible")

    return {
            'statusCode': 200
        }

 

 

saitou-autostartrds-Lambda1

saitou-autostartrds-Lambda1

 

↓コードを貼り付けましたら、「Test」をクリックします。

 

saitou-autostartrds-Lambda1

 

↓イベント名は「test」と入力し、「保存」を押しください。

 

saitou-autostartrds-Lambda1

 

↓次に「Deploy」をクリックしてください。

 

saitou-autostartrds-Lambda1

 

 

作成したStep Functionsステートマシン実行用のLambda関数は、SNSにトリガーされますので、トリガーの追加をしましょう。「関数の概要」から「トリガーを追加」をクリックしてください。

 

saitou-autostartrds-Lambda1

 

 

↓設定値は以下の通りです。値の入力が完了しましたら、「追加」を押してください。

 

項目 設定値
ソースタイプ SNS
SNSトピック 作成したSNSトピック

 

saitou-autostartrds-Lambda1

↓“正常に追加されました”と表示されましたら、完了です。

saitou-autostartrds-Lambda1

 

 

続いて、DBインスタンスの状態確認用のLambda関数を作成します。手順はさきほどほぼ同じなので、設定値とコードだけ記載しておきます。違いはトリガーの追加がありません。

 

設定値は以下の通りです。

 

項目 設定値
関数の作成 一から作成
関数名 saito-retrieve-rds-instance-state-lambda(任意)
ランタイム Python 3.9
アーキテクチャ x86_64
実行ロール 既存のロールを使用する
既存のロール 作成したIAMロール

 

 

Pythonコードは以下を使用します。コードの内容は対象のDBインスタンスの状態を確認します。

 

import json
import logging
import boto3

#Logging
LOGGER = logging.getLogger()
LOGGER.setLevel(logging.INFO)

#Initialise Boto3 for RDS
rdsClient = boto3.client('rds')

def lambda_handler(event, context):

    #log input event
    LOGGER.info(event)

    #rdsInstanceId is passed as input to the lambda function from the AWS StepFunctions state machine.  
    rdsInstanceId = event['rdsInstanceId']
    db_instances = rdsClient.describe_db_instances(DBInstanceIdentifier=rdsInstanceId)['DBInstances']
    db_instance = db_instances[0]
    rdsInstanceState = db_instance['DBInstanceStatus']
    return {
        'statusCode': 200,
        'rdsInstanceState': rdsInstanceState,
        'rdsInstanceId': rdsInstanceId
    }

 

 

トリガーの追加は不要です。

 

最後にDBインスタンス停止用のLambda関数を作成します。

 

設定値は以下の通りです。

 

項目 設定値
関数の作成 一から作成
関数名 saito-stop-rds-instance-lambda(任意)
ランタイム Python 3.9
アーキテクチャ x86_64
実行ロール 既存のロールを使用する
既存のロール 作成したIAMロール

 

 

Pythonコードは以下を使用します。コードの内容は、利用可能状態のDBインスタンスを停止するものです。

 

import json
import logging
import boto3

#Logging
LOGGER = logging.getLogger()
LOGGER.setLevel(logging.INFO)

#Initialise Boto3 for RDS
rdsClient = boto3.client('rds')

def lambda_handler(event, context):

    #log input event
    LOGGER.info(event)

    rdsInstanceId = event['rdsInstanceId']

    #Stop RDS instance
    rdsClient.stop_db_instance(DBInstanceIdentifier=rdsInstanceId)

    #Tagging

    return {
        'statusCode': 200,
        'rdsInstanceId': rdsInstanceId
    }

 

 

Lambda関数を3つ作成できましたら、完了です。

 

 

■Step Functionsステートマシン作成

構築の最後の手順です。AWS Step Functionsステートマシンを作成します。

 

今回作成するステートマシンは、以下のワークフローでステップしていきます。

 

  • Lambda関数を呼び出して、DBインスタンスの状態を取得します。
  • 次に、Lambda関数は状態のパラメータを返します。パラメータ値が「available(利用可能)」の場合、ステートマシンは停止用Lambda関数を呼び出すアクションに進みます。
  • パラメータ値が「利用可能」でない場合は、ステートマシンは5分間待機してから、DBインスタンスの状態を再度チェックします。
  • ステートマシンはパラメータ値が「停止」になるまで5分ごとにインスタンスの状態をポーリングし続け、そののちにステートマシンの実行が正常に完了します。

 

 

それではStep Functionsステートマシンを作成していきます。設定値は以下の通りです。

 

項目 設定値
ステートマシンを定義する コードでワークフローを記述
タイプ 標準

 

 

サービスの検索窓で「stepfunctions」と検索し、Step Functionsのコンソール画面に行きます。

 

saitou-autostartrds-Stepfunction

 

↓左ペインの「ステートマシン」をクリックし、「ステートマシンの作成」を押してください。

 

saitou-autostartrds-Stepfunction

saitou-autostartrds-Stepfunction

 

↓“定義”の項目では、以下のJSONドキュメントを貼り付けてください。JSONドキュメント内で変更箇所がありますので、自身が作成した該当のLambda関数のARNに修正しましょう。

 

【変更箇所】
7行目<retrieve-rds-instance-state-lambda ARN>
28行目<stop-rds-instance-lambda ARN>
33行目<retrieve-rds-instance-state-lambda ARN>

 

{
  "Comment": "stop-rds-instance-statemachine: Automatically shutting down RDS instance after a forced Auto-Restart",
  "StartAt": "retrieveRdsInstanceState",
  "States": {
    "retrieveRdsInstanceState": {
      "Type": "Task",
      "Resource": "<retrieve-rds-instance-state-lambda ARN>",
      "Next": "isInstanceAvailable"
    },
    "isInstanceAvailable": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.rdsInstanceState",
          "StringEquals": "available",
          "Next": "stopRdsInstance"
        }
      ],
      "Default": "waitFiveMinutes"
    },
    "waitFiveMinutes": {
      "Type": "Wait",
      "Seconds": 300,
      "Next": "retrieveRdsInstanceState"
    },
    "stopRdsInstance": {
      "Type": "Task",
      "Resource": "<stop-rds-instance-lambda ARN>",
      "Next": "retrieveRDSInstanceStateStopping"
    },
    "retrieveRDSInstanceStateStopping": {
      "Type": "Task",
      "Resource": "<retrieve-rds-instance-state-lambda ARN>",
      "Next": "isInstanceStopped"
    },
    "isInstanceStopped": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.rdsInstanceState",
          "StringEquals": "stopped",
          "Next": "notifyDatabaseAdmin"
        }
      ],
      "Default": "waitFiveMinutesStopping"
    },
    "waitFiveMinutesStopping": {
      "Type": "Wait",
      "Seconds": 300,
      "Next": "retrieveRDSInstanceStateStopping"
    },
    "notifyDatabaseAdmin": {
      "Type": "Pass",
      "Result": "World",
      "End": true
    }
  }
}

 

 

Lambda関数のARNはLambda関数コンソール画面から、該当の関数の詳細画面で確認できます。

 

saitou-autostartrds-Stepfunction

saitou-autostartrds-Stepfunction

 

 

ドキュメントを貼り付けると、ワークフローとタスクが視覚化されます。問題なければ、「次へ」をクリックしてください。

 

saitou-autostartrds-Stepfunction

 

↓“詳細を指定”ページでは、以下の設定値を入力してください。

 

項目 設定値
ステートマシン名 saito-stop-rds-instance-statemachine(任意)
実行ロール 新しいロールの作成

 

saitou-autostartrds-Stepfunction

 

↓値の入力が完了しましたら、「ステートマシンの作成」を押してください。

 

saitou-autostartrds-Stepfunction

saitou-autostartrds-Stepfunction

 

 

“ステートマシンは正常に作成されました”と表示されましたら完了です。

 

続いて、ステートマシン作成と同時にIAMロールが新しく作成されていますので、最初の方の手順で作成したIAMポリシーをアタッチします。

 

IAMのコンソール画面に行き、左ペインの「ロール」をクリックし、作成したStep Functionsステートマシン名を検索窓に入力してください。わたしの場合は「saito-stop-rds-instance-statemachine」です。

 

 

saitou-autostartrds-Stepfunction IAMロールアタッチ

 

↓表示されたロールをクリックし、詳細画面で「許可を追加」から「ポリシーをアタッチ」を押しましょう。

 

saitou-autostartrds-Stepfunction IAMロールアタッチ

 

↓ポリシー検索窓で「saito-rds-auto-restart-stepfunctions-policy」と入力し、表示されたポリシーにチェックを入れ、「ポリシーをアタッチ」をクリックしてください。

rds-auto-restart-stepfunctions-policy

 

saitou-autostartrds-Stepfunction IAMロールアタッチ

saitou-autostartrds-Stepfunction IAMロールアタッチ

 

 

もう一つ変更する箇所があります。

 

Step Functionsステートマシン実行用のLambda関数で、
環境変数を追加しなければいけません。

 

AWS Lambdaのコンソール画面に行きます。左ペインから「関数」を押し、「start-statemachine-execution-lambda」の名がついた関数をクリックしてください。

 

saitou-autostartrds-Stepfunction Lambda環境変数修正

 

↓詳細画面の「設定」タブから、「環境変数」を押し、「編集」をクリックしてください。

 

saitou-autostartrds-Stepfunction Lambda環境変数修正

 

↓「環境変数の追加」を押し、以下のキーと値を入力してください。

 

項目 設定値
キー STEPFUNCTION_ARN
作成したStep FunctionsステートマシンのARN

 

 

saitou-autostartrds-Stepfunction Lambda環境変数修正

 

↓入力が完了しましたら、「保存」を押しましょう。

 

saitou-autostartrds-Stepfunction Lambda環境変数修正

saitou-autostartrds-Stepfunction Lambda環境変数修正

 

 

以上で、構築が完了しました

 

 

■動作確認

RDS自動停止構築図

 

AWS Step Functionsを使用して、自動的に開始されたRDSインスタンスを停止させる構築が完了しましたので、動作確認をしていきましょう。

 

今回の構築ではリージョン内にあるDBインスタンスを無差別に停止するわけではありません。

 

Step Functionsステートマシン実行用のLambda関数に貼り付けたPythonコードを見てください。

 

saitou-autostartrds-Stepfunction Lambda環境変数修正

 

キー:auto-restart-protection、値:yesのタグがつけられたDBインスタンスだけ対象になるようにフィルタリングされます。

 

動作確認用にテスト用DBインスタンスを用意し、以下のタグを追加し、起動しておきましょう。

 

項目 設定値
キー auto-restart-protection
yes

 

saitou-autostartrds-RDS

saitou-autostartrds-RDS

 

 

次にLambda関数がSNSにトリガーされたと想定し、JSONドキュメントを使いテストします。以下はSNSからのサンプルイベントです。JSONドキュメント内のインスタンスIDをテスト用DBインスタンスのIDに変更し、「テストタブ」の「イベントJSON」に貼り付け、「保存」を押してください。

 

※9行目の"MessageId"はテストをするごとに、末尾の文字を別の文字に置き換えましょう。同じIDで2回以上テストは実行できません。

 

【変更箇所】
12行目の2カ所を実際のDBインスタンスIDに変更

 

   {
    "Records": [
        {
        "EventSource": "aws:sns",
        "EventVersion": "1.0",
        "EventSubscriptionArn": "<RDS Event Subscription ARN>",
        "Sns": {
            "Type": "Notification",
            "MessageId": "10001-2d55da-9a73-5e42d46748c0",
            "TopicArn": "<SNS Topic ARN>",
            "Subject": "RDS Notification Message",
            "Message": "{\"Event Source\":\"db-instance\",\"Event Time\":\"2020-07-09 15:15:03.031\",\"Identifier Link\":\"https://console.aws.amazon.com/rds/home?region=<region>#dbinstance:id=<RDS instance id>\",\"Source ID\":\"<RDS instance id>\",\"Event ID\":\"http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/USER_Events.html#RDS-EVENT-0154\",\"Event Message\":\"DB instance started\"}",
            "Timestamp": "2020-07-09T15:15:03.991Z",
            "SignatureVersion": "1",
            "Signature": "YsuM+L6N8rk+pBPBWoWeRcSuYqo/BN5v9D2lyoSg0B0uS46Q8NZZSoZWaIQi25TXfHY3RYXCXF9WbVGXiWa4dJs2Mjg46anM+2j6z9R7BDz0vt25qCrCyWhmWtc7yeETrlwa0jCtR/wxXFFexRwynqlZeDfvQpf/x+KNLrnJlT61WZ2FMTHYs124RwWU8NY3pm1Os0XOIvm8rfv3ywm1ccZfP4rF7Lfn+2EK6a0635Z/5aiyIlldNZxbgRYTODJYroO9INTlF7NPzVV1Y/K0E9aaL/wQgLZNquXQGCAxPFWy5lxJKeyUocOWcG48KJGIBUC36JJaqVdIilbZ9HvxTg==",
            "SigningCertUrl": "https://sns.<region>.amazonaws.com/SimpleNotificationService-a86cb10b4e1f29c941702d737128f7b6.pem",
            "UnsubscribeUrl": "https://sns.<region>.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=<arn>",
            "MessageAttributes": {}
        }
        }
    ]
    }

 

saitou-autostartrds-test

saitou-autostartrds-test

saitou-autostartrds-test

 

↓JSONドキュメントの貼り付けと保存が完了したら、「コード」タブを押し、「Test」を実行してください。

 

saitou-autostartrds-test

 

↓問題がなければ、“Succeeded”と表示されます。

 

saitou-autostartrds-test

 

↓Step Functionsステートマシンの詳細画面を確認してみましょう。ステータスが“実行中”になっています。

 

saitou-autostartrds-test

 

↓メッセージIDを押してみると、視覚化されたワークフローが確認でき、成功や実行中が色分けされていることで、今どのような状況なのかが一目でわかります。

 

saitou-autostartrds-test

 

↓現在はDBインスタンスの“停止”が確認できるまで、5分ごとに状態確認をするタスクが実行中です。

 

saitou-autostartrds-test

 

↓DBインスタンスを見ると“停止中”なので、Step Functionsステートマシンは動いています。

 

saitou-autostartrds-test

 

↓ビジュアルフローだと現在の状況はつかめますが過程がわかりづらいです。しかし、ステートマシン詳細画面では、タスクの実行開始から現在までのフローもすべて確認することができます。

 

saitou-autostartrds-test

 

↓数分経つとDBインスタンスが停止しました。

 

saitou-autostartrds-test

 

↓Step Functionsステートマシンを見ると、ワークフローは“End”となり、ステータスも“成功”と表示されています。

 

saitou-autostartrds-test

saitou-autostartrds-test

 

追記:7日後

2022年11月22日に一時的に停止したRDSは、11月28日に自動的に起動されたようです。

 

わたしがRDSの状態をマネージメントコンソールで確認したときには、すでに一時的に停止の状態になっていました。

 

RDSが自動的に起動

 

StepFunctionsステートマシンを確認してみると、“2022年11月28日 月曜日 午後 6:55”に開始され、ステータスが成功と表示されています。

 

RDSが自動的に起動

RDSが自動的に起動

RDSが自動的に起動

 

自動的に開始されたRDSを無事に停止することができました。停止や起動を通知するメール設定をしていなかったので、わたしが起動に気づいたのはだいぶ後です。しかし、StepFunctions&Lambdaのおかげで、自動的に停止することができました。

 

今回の検証は以上です。

 

 

まとめ:AWS Step Functionsを使用して、DBインスタンスを停止してみる

テスト・開発環境や自己学習のためにRDS DBインスタンスを起動したけど、停止をし忘れて数万円の請求が来ることがあります。

 

自動で停止できる仕組みを導入し、ワークロードの負荷を低減しつつ、コストも抑えていきたいですよね。今回使用したAWS Step Functionsは、実行タスクの工程が視覚化されてわかりやすく、今どういった状況なのかが一目でわかります。ぜひ利用してみてください。
 

 

 

参考リンク:AWS Architecture Blog,AWS公式ドキュメント「AWS Step Functionsとは」

 

 

↓ほかの協栄情報メンバーもAWS Step Functionsに関する記事を公開しています。ぜひ参考にしてみてください。

 

■StepFunctionsを利用して別アカウントへオブジェクトをコピーする構築ハンズオン(INAMURA)
https://cloud5.jp/object-transfer-used-stepfunctions/

 

■ハンズオン(AWS Step Functionsの実践)(okano)
https://cloud5.jp/tryawsstepfunctions/

Last modified: 2022-11-30

Author