Amazon EventBridge SchedulerでAmazon Elasticacheのレプリカを定期的に追加・削除してみた

EventBridge Schedulerの可能性は無限...!!

こんにちは。AWS事業本部トクヤマシュンです。

少し前に、Amazon EventBridge Schedulerがリリースされました。

これにより、サポートされているAWSの各種サービスのAPIに対して任意のタイミングでリクエストを自動実行できるようになりました。
従来はAWS LambdaとAmazon EventBridge Rulesを組み合わせていた定期処理も、Amazon EventBridge Schedulerだけを用いて簡単に実装することができるかもしれません。 可能性に満ちたサービスで胸熱ですね。
すでにDevelopersIOでも数多くの実装例のブログが書かれています。

本エントリでは、Amazon EventBridge Schedulerを用いてAmazon Elasticache for Redisのレプリカを増減させてみます。

何ができるようになるのか?

キャッシュの読み込み負荷が特定のタイミングにのみ高いことを事前に把握できている場合、Amazon Elasticache for Redisのレプリカをその時だけ一時的に増やして対応するケースがあるかと思います。

Amazon Elasticache for RedisクラスターはAuto Scalingに対応しているので、Scheduled Schalingを用いて任意のタイミングでレプリカを増減させることが可能です。
ただし、Elasticache for RedisクラスターのAuto Scalingには、2022年11月26日時点で次の様な前提条件があります。

ElastiCache for Redis クラスターの Auto Scaling

前提条件
ElastiCache for Redis の Auto Scaling は、以下に制限されています。
Redis エンジンバージョン 6.0 以降を実行する Redis (クラスターモードが有効) クラスター
インスタンスタイプファミリー - R5、R6g、M5、M6g
インスタンスサイズ - Large、XLarge、2XLarge
ElastiCache for Redis の Auto Scaling は、グローバルデータストア、Outposts、または Local Zones で実行しているクラスターではサポートされません。
ElastiCache for Redis の AWS Auto Scaling は、中国 (北京)、中国 (寧夏)、AWS GovCloud (米国西部) および AWS GovCloud (米国東部) のリージョンでは利用できません。

そのためクラスターモードが無効であったり、インスタンスタイプファミリーがm系、t系、r6gd系であった場合にはAuto Scalingは利用できません。
このような場合にも、Amazon EventBridge Schedulerを使えば任意のタイミングでレプリカを増減させることができます。

やってみる

では早速実施してみます。

検証シナリオ

次のシナリオでAmazon EventBridge Schedulerの動きを確認してみます。

  • Amazon Elasticache for Redisクラスター
    • クラスターモード:オフ
    • ノードタイプ:cache.t3.micro
    • 初期状態のレプリカ数:0
  • 作成スケジュール
    • スケジュール名:ElasticacheReplicaIncreaseScheduler
    • スケジュール名:ElasticacheReplicaDecreaseScheduler

検証の都合から上記のようなスケジュールを設定しています。
実際のユースケースでは、WebサイトのPVが多く想定されるタイミングでレプリカを一時的に増やすスケジュールを設定する、などになるかと思います。

Elasticache for Redisの設定

次のようなElasticache for Redisクラスターを作成します。

  • クラスター名:test
  • クラスターモード:オフ
  • ノードのタイプ:cache.t3.micro
  • ノード数:1(プライマリノードのみで、レプリカ数は0)

IAM Roleの設定

Amazon EventBridge Schedulerで利用するためのIAM Roleを作成します。
ElasticacheReplicaSchedulerRoleという名前で、下記の権限を設定します。

許可ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeVpcs",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeSubnets",
                "elasticache:IncreaseReplicaCount",
                "elasticache:DecreaseReplicaCount"
            ],
            "Resource": "*"
        }
    ]
}

信頼されたエンティティ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Amazon EventBridge Schedulerの設定

レプリカ追加用のスケジュールと、レプリカ削除用のスケジュールの2つを作成します。

レプリカ追加用のスケジュール

下記を満たすスケジュールを作成します。

  • スケジュール名:ElasticacheReplicaIncreaseScheduler
    • 毎日19:40に動作
    • レプリカ数を1に増やす

Amazon Eventbridge画面

コンソール画面からAmazon Eventbridgeにアクセスし、左メニューのスケジュールを選択し、スケジュールを作成ボタンをクリックします。

スケジュールの詳細の指定画面

下記を設定して次へボタンを押します。

  • スケジュール名と説明
    • スケジュール名
      • ElasticacheReplicaIncreaseScheduler
    • スケジュールグループ
      • default
  • スケジュールのパターン
    • 頻度
      • 定期的なスケジュール
    • スケジュールの種類
      • cronベースのスケジュール
    • cron式
      • 40 19 * * ? *
    • フレックスタイムウィンドウ
      • (UTC +09:00) Japan

ターゲットの選択画面

下記を設定して次へボタンを押します。

  • ターゲットAPI
    • すべてのAPIから、IncreaseReplicaCountを選択
  • 入力
{
  "ApplyImmediately": "true", 
  "ReplicationGroupId": "test", 
  "NewReplicaCount": 1 
}

設定画面

下記を設定して、次へボタンを押します。

  • スケジュールを有効化
  • 既存のロールを使用
    • 先ほど作成したElasticacheReplicaSchedulerRoleを選択

スケジュールの確認と作成画面

内容を確認し、スケジュールを作成ボタンを押してスケジュールを作成します。

これでレプリカ追加用のスケジュール作成は完了です。

レプリカ削除用のスケジュール

次に、下記を満たすスケジュールを作成します。

  • スケジュール名:ElasticacheReplicaDecreaseScheduler
    • 毎日20:00に動作
    • レプリカ数を0に減らす

Amazon Eventbridge画面

先ほどと同様にAmazon Eventbridgeの画面から作成を行います。

スケジュールの詳細の指定画面

下記を設定して次へボタンを押します。

  • スケジュール名と説明
    • スケジュール名
      • ElasticacheReplicaDecreaseScheduler
    • スケジュールグループ
      • default
  • スケジュールのパターン
    • 頻度
      • 定期的なスケジュール
    • スケジュールの種類
      • cronベースのスケジュール
    • cron式
      • 00 20 * * ? *
    • フレックスタイムウィンドウ
      • (UTC +09:00) Japan

ターゲットの選択画面

下記を設定して次へボタンを押します。

  • ターゲットAPI
    • すべてのAPIから、DecreaseReplicaCountを選択
  • 入力
{
  "ApplyImmediately": "true", 
  "ReplicationGroupId": "test", 
  "NewReplicaCount": 0 
}

設定画面

下記を設定して、次へボタンを押します。

  • スケジュールを有効化
  • 既存のロールを使用
    • 先ほど作成したElasticacheReplicaSchedulerRoleを選択

スケジュールの確認と作成画面

内容を確認し、スケジュールを作成ボタンを押してスケジュールを作成します。

これで設定は完了です。

動作確認

19:40になったら、レプリカが追加されるかを確認します。

AWS CloudTrailを確認したところ、次の2つのイベントを確認することができました。

  • 19:40:45
    • IncreaseReplicaCount
  • 19:41:15
    • CreateNetworkInterface

ほぼ指定した時刻にイベントが発生しています。
Amazon Elasticacheのコンソールを確認してみると、レプリカの作成が始まっていることが確認できました。

次に、レプリカの削除を確認します。

20:00あたりのAWS CloudTrailの履歴を確認したところ、次の2つのイベントを確認することができました。

  • 20:00:28
    • DecreaseReplicaCount
  • 20:05:30
    • DeleteNetworkInterface

DeleteNetworkInterfaceは、レプリカが削除された後にENIの削除が動くため、20:05にAPIリクエストが行われていると想定されます。
Amazon Elasticacheのコンソールを確認してみると、レプリカが削除できていることが確認できました。

Amazon EventBridge SchedulerによるElasticacheのレプリカの追加・削除動作を確認することができました。

趣味のスパイスカレー

私の趣味はスパイスカレー作りで、ブログに投稿していってます。
相変わらずAWSには全然関係ありませんが、カレー作りも技術が必要ということで、技術ブログの一環としてお付き合いいただけますと幸いです。

  • カキとナスと豆腐のココナッツカレー
  • ニラ鶏キーマ

旬のカキを使ったココナッツカレーは、クリーミーでこの季節ならではの味わい。とても美味しくできました。
奥に見えるのがニラ鶏キーマで、こちらは少しジャンキーな感じに仕上げてご飯が進みました。

最後に

ElasticacheのレプリカをAmazon EventBridge Schedulerを用いて増減させてみました。
とても簡単に設定できるので、気になる方はぜひ設定してみてください。
本ブログがどなたかのお役にたてば幸いです。