継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

EventBridge Scheduler と Step Functions を使って時限式で Aurora 削除を実現する

タダです.

試しに使った Aurora クラスターとインスタンスを時限式で削除したいなと思い,EventBridge と Step Functions を使った自動削除の仕組みを試してみたので,この記事にまとめます.なお,今回の時限式削除はいつどのリソースを削除しているかの記録を残さないことを前提にしています.

仕組みの概要

Aurora Clone など試しに作った Aurora を指定の時刻になったら勝手に削除してくれる仕組みでは EventBridge Scheduler で指定時刻に Step Functions をキックするのと削除対象の情報をインプットとして渡し,Step Functions はインプットに基づいて削除をします.それぞれのサービスで AWS API をサポートしているため,Lambda等でコードを書く必要がないのが特徴です.

Aurora を削除する State Machine を作る

EventBridge Scheduler から渡されるパラーメータに基づいて実行する State Machine を作ります.以下がそのための ASL になります.DbInstanceIdentifier に指定されたインスタンスを削除し,インスタンスと関連付けられたクラスターも合わせて削除するフローになっています.

{
  "Comment": "Delete Aurora Cluster and instance",
  "StartAt": "DeleteDBInstance",
  "States": {
    "DeleteDBInstance": {
      "Type": "Task",
      "Parameters": {
        "DbInstanceIdentifier.$": "$.DbInstanceIdentifier",
        "SkipFinalSnapshot": true
      },
      "Resource": "arn:aws:states:::aws-sdk:rds:deleteDBInstance",
      "Next": "DeleteDBCluster",
      "ResultSelector": {
        "DbClusterIdentifier.$": "$.DbInstance.DbClusterIdentifier"
      },
      "OutputPath": "$.DbClusterIdentifier"
    },
    "DeleteDBCluster": {
      "Type": "Task",
      "Parameters": {
        "DbClusterIdentifier.$": "$",
        "SkipFinalSnapshot": true
      },
      "Resource": "arn:aws:states:::aws-sdk:rds:deleteDBCluster",
      "End": true
    }
  }
}

図にするとこんな State になる

加えて,Step Functions の IAM ロールに以下の権限を付与します.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds:DeleteDBInstance",
                "rds:DeleteDBCluster"
            ],
            "Resource": [
                "arn:aws:rds:[リージョン名]:[アカウント番号]:db:[インスタンス名]",
                "arn:aws:rds:[リージョン名]:[アカウント番号]:cluster:[クラスター名]"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBInstances",
                "rds:DescribeDBClusters"
            ],
            "Resource": "*"
        }
    ]
}

Step Functions をキックする EventBridge Scheduler の作成

Aurora を作る時に EventBridge Scheduler で1度しか実行しないリソースを作ります.しかもEventBridge Scheduler のオプションでは実行後にイベントを削除する指定ができるため,ワンショットなイベントを作ることが可能です.

AWS CLI で設定する例

aws scheduler create-schedule --name aurora-schedule-telete \
--schedule-expression "at(2024-05-26T13:00:00)"  \
--target '{"Arn":"[Step Functions の ARN]","RoleArn":"[EventBridge Scheduler の IAM ロール ARN]", "input": {\"DbInstanceIdentifier\": \"[削除するインスタンス名]\"}}' \
--schedule-expression-timezone "Asia/Tokyo"
--flexible-time-window '{ "Mode": "OFF"}' \
--action-after-completion "DELETE"

docs.aws.amazon.com

この設定で 2024/05/26の13時に Step Functions に { "DbInstanceIdentifier": "[削除するインスタンス名]" } というパラメータを渡して実行するようになり,実行後該当の EventBridge Scheduler は削除されます.以上が時限式削除の仕組みで必要なリソースです.コードを何も書くことなくフローが作れてしまいました.

まとめ

EventBridge Scheduler と Step Functions を使った時限式 Aurora 削除の仕組みを試してみたので設定に必要な情報をまとめました.