Amazon ElastiCacheのリザーブドノードの柔軟性についておさらいしてみた

Amazon ElastiCacheのリザーブドノードの柔軟性についておさらいしてみた

コンバンハ、千葉(幸)です。

2024年10月にAmazon ElastiCache のリザーブドノードでサイズ柔軟性がサポートされました。

https://aws.amazon.com/jp/blogs/news/new-size-flexibility-for-amazon-elasticache-reserved-nodes/

簡単に言えば、こう変わったということです。

  • 例えばcache.r7g.xlargeのリザーブドノード1台分を購入していた場合……

    • [従来] リザーブドノードが適用されるのは cache.r7g.xlarge のノードのみ

    • [今後] cache.r7g.largeのノード2台分にも、cache.r7g.2xlargeのノード 0.5台分にも、その他のサイズにも適用される

リザーブドノードの柔軟性について、同じく2024年10月に登場した、新たなエンジン Valkey も含めて少し整理してみます。

先にまとめ

  • リザーブドノードのサイズ柔軟性は、「購入したリザーブドノード」と「稼働するノード」の以下が同一である場合に有効
    • AWSリージョン
    • ノードファミリー
  • 原則エンジンを跨いだリザーブドノード適用はできないが、Redis OSSエンジンのリザーブドノードはValkeyエンジンのノードに適用できる
  • リザーブドノードのサイズ柔軟性は以下の両方で有効
    • スタンダード(すべて前払い、一部前払い、前払いなし)
    • レガシー(重度使用、中度使用、軽度使用)

リザーブドノードのサイズ柔軟性とは何か

リザーブドノードのサイズ柔軟性とは、より柔軟なノードのスケールを可能にしてくれる仕組みです。

例えば以下のケースを考えましょう。

  • cache.r6gd.xlargeのリザーブドノードを1台分購入しており、稼働しているノードもcache.r6gd.xlarge1台
  • しばらく稼働していく中でスペックが不足していることがわかり、cache.r6gd.2xlargeに変更した

ここでサイズ柔軟性がない場合は、購入したcache.r6gd.xlargeのリザーブドノードが稼働中のノードに適用されず、空振りすることになります。(すべてオンデマンドノードとして料金がかかる。)

cache.r6gd.xlargeとcache.r6gd.2xlargeは異なるノードサイズであるために適用対象外となります。

サイズ柔軟性がある場合は、同一のノードファミリー内であれば異なるサイズにもリザーブドノードが適用されます。

ri2
予約ノード - Amazon ElastiCache より

今回の例で言えば、cache.r6gd.2xlargeで稼働するノードの料金は以下の通りとなります。

  • オンデマンド料金の50%がリザーブドノードによって相殺される
  • 残りの50%分は変わらずオンデマンド料金が発生する

逆にcache.r6gd.xlargeのリザーブドノード1台分でcache.r6gd.largeのノード2台分のオンデマンド料金を賄う、ということもできます。

従来はリザーブドノード購入後にノードサイズの変更を行うことにハードルがありましたが、サイズ柔軟性の導入によりその障壁が少なくなりました。

似たような考え方は Amazon EC2 や Amazon RDSのリザーブドインスタンスで従来から存在しており、Amazon ElastiCacheのリザーブドノードで満を持して対応した、というわけです。

Amazon ElastiCache とリザーブドノードについて整理

Amazon ElastiCache の概念について、いくつかの観点で整理しておきます。

  • エンジンが「Memcached」か「Redis OSS」か「Valkey」か
  • 形式が「サーバーレス」か「独自のクラスター」か
  • ElastiCache ノードの料金形態が「オンデマンドノード」か「リザーブドノード」か
  • リザーブドノードのオファリングタイプが「スタンダード」か「レガシー」か

ElastiCache type

今回のアップデートである「リザーブドノードのサイズ柔軟性」の適用対象はピンク色に編みかけしている部分です。

簡単に言えば、「エンジンの種類によらず」「レガシーなオファリングタイプも含めた」リザーブドノードにおいてサイズの柔軟性が適用される、ということです。

(「独自のクラスター」はちょっとわかりづらい表現ですが、「サーバーレス」でない場合のことを指します。「セルフデザイン(ノードべース)」と表されることもあります。サーバーレスの場合は独自の料金形態なので、オンデマンドノード/リザーブドノードという分かれ方はしません。)

エンジンを跨いだリザーブドノードの適用

原則、リザーブドノードが適用されるのは指定したエンジンのみです。

例えばMemcachedで購入したリザーブドノードはMemcachedで稼働するノードにのみ適用対象となります。(さらに、「リージョンが同一」「ノードファミリー」が同一という条件が付きます。)

購入したリザーブドノードと稼働しているノードの組み合わせごとに適用できるかどうかをまとめたものが以下です。

リザーブドノード 稼働ノード 適用可否
Redis OSS Redis OSS できる
Redis OSS Memcached できない
Redis OSS Valkey できる(20%引き)
Memcached Redis OSS できない
Memcached Memcached できる
Memcached Valkey できない
Valkey Redis OSS できない
Valkey Memcached できない
Valkey Valkey できる

基本的にエンジンを跨いだ適用はできません。一点だけ、Redis OSSのリザーブドノードを購入した場合にValkeyのノードに適用ができます。

Valkeyの料金はRedis OSSの20%引きとなるようにデザインされており、リザーブドノードの正規化係数でもそれがあらわれています。

Node size Normalized units (Redis OSS, Memcached) Normalized units (Valkey)
micro 0.5 0.4
small 1 .8
medium 2 1.6
large 4 3.2
xlarge 8 6.4
2xlarge 16 12.8
4xlarge 32 25.6
6xlarge 48 38.4
8xlarge 64 51.2
10xlarge 80 64
12xlarge 96 76.8
16xlarge 128 102.4
24xlarge 192 153.6

Reserved nodes - Amazon ElastiCacheより

例えば、largeサイズのRedis OSSのリザーブドノードを購入した場合、(リージョンやノードファミリーの条件を満たせば)largeで稼働するValkeyのノードのオンデマンド料金をすべて相殺した上で、20%(ここでは0.8)のあまりが生じます。

余った分は、他に稼働している条件を満たすノードがあればそちらのオンデマンド料金に適用されます。

スタンダードなリザーブドノードとレガシーなリザーブドノード

Amazon ElastiCacheのリザーブドノードのオファリングタイプにはスタンダードなものとレガシーなものがあります。

2021年なので古い情報ですが、以下のブログでまとめたことがあります。

ElastiCache のリザーブドノードについてまとめてみた | DevelopersIO

ElastiCache
2021年11月時点の表

2024年11月現在新規に購入できるのはほとんどスタンダードタイプのもののみです。cache.m4,cache.r4,cache.t2のリザーブドノードを購入する場合、レガシータイプなタイプのうち、重度使用のみを選択できます。

AWSドキュメントでは以下の通り「すべてのリザーブドノードはサイズ柔軟性がある」と記述があり、レガシーなものも含めて柔軟性があると判断できます。

All reserved nodes are size flexible.

Reserved nodes - Amazon ElastiCache

Amazon ElastiCache リザーブドノードのオファリングを確認したい

現時点で購入できるリザーブドノードを一覧で取得したい、ということがあるかもしれません。その場合は以下コマンドを使用しましょう。

例えば実行するコマンドの例は以下です。出力結果が多いので、エンジンを指定してフィルタリングするといいでしょう。

aws elasticache describe-reserved-cache-nodes-offerings \
  --product-description #エンジンを指定。redis,memcached,valkeyのいずれか\
  --no-cli-pager \
  --region ap-northeast-1 \
  --query "sort_by(ReservedCacheNodesOfferings, &CacheNodeType)[].{
      ReservedCacheNodesOfferingId: ReservedCacheNodesOfferingId,
      CacheNodeType: CacheNodeType,
      Duration: Duration,
      FixedPrice: FixedPrice,
      RecurringChargeAmount: RecurringCharges[0].RecurringChargeAmount,
      OfferingType: OfferingType}" \
  --output table

出力例は以下です。

$ aws elasticache describe-reserved-cache-nodes-offerings \
>   --product-description valkey \
>   --no-cli-pager \
>   --region ap-northeast-1 \
>   --query "sort_by(ReservedCacheNodesOfferings, &CacheNodeType)[].{
>       ReservedCacheNodesOfferingId: ReservedCacheNodesOfferingId,
>       CacheNodeType: CacheNodeType,
>       Duration: Duration,
>       FixedPrice: FixedPrice,
>       RecurringChargeAmount: RecurringCharges[0].RecurringChargeAmount,
>       OfferingType: OfferingType}" \
>   --output table
-----------------------------------------------------------------------------------------------------------------------------------------
|                                                  DescribeReservedCacheNodesOfferings                                                  |
+---------------------+-----------+-------------+--------------------+------------------------+-----------------------------------------+
|    CacheNodeType    | Duration  | FixedPrice  |   OfferingType     | RecurringChargeAmount  |      ReservedCacheNodesOfferingId       |
+---------------------+-----------+-------------+--------------------+------------------------+-----------------------------------------+
|  cache.m4.10xlarge  |  31536000 |  6524.8     |  Heavy Utilization |  1.192                 |  96ab1e46-4c51-4994-a964-227e0dbc6ab3   |
|  cache.m4.10xlarge  |  94608000 |  14180.8    |  Heavy Utilization |  0.864                 |  ef3b67ee-4894-4321-9919-41a31170af39   |
|  cache.m4.2xlarge   |  94608000 |  2836.0     |  Heavy Utilization |  0.173                 |  20feb036-973b-4f14-bdf0-c172719dfe67   |
|  cache.m4.2xlarge   |  31536000 |  1304.8     |  Heavy Utilization |  0.238                 |  b6d5e759-541c-416c-85b8-e93536305699   |
|  cache.m4.4xlarge   |  94608000 |  5672.8     |  Heavy Utilization |  0.346                 |  27184296-4a3f-403f-a04e-26204a092733   |
|  cache.m4.4xlarge   |  31536000 |  2609.6     |  Heavy Utilization |  0.476                 |  854e89e7-4c5e-401a-a85a-b99fbd2fbf26   |
|  cache.m4.large     |  94608000 |  708.8      |  Heavy Utilization |  0.042                 |  2ecb3c25-e8ec-4cf5-acba-dfaaf8458e52   |
|  cache.m4.large     |  31536000 |  326.4      |  Heavy Utilization |  0.06                  |  fbf4a8bd-a38f-4e54-9007-06e1ad99f6a8   |
|  cache.m4.xlarge    |  31536000 |  652.0      |  Heavy Utilization |  0.119                 |  c218d61f-3f27-4f6d-a6f2-e4418876cabb   |
|  cache.m4.xlarge    |  94608000 |  1418.4     |  Heavy Utilization |  0.086                 |  cfa21d59-76c7-47f4-9a99-6de84e0c5401   |
|  cache.m5.12xlarge  |  31536000 |  0.0        |  No Upfront        |  2.632                 |  5fa5d8c6-3db3-432d-818d-91e17a33df16   |
|  cache.m5.12xlarge  |  31536000 |  10980.8    |  Partial Upfront   |  1.254                 |  67785c25-29fd-49fe-9d2c-c493272a48db   |
|  cache.m5.12xlarge  |  94608000 |  0.0        |  No Upfront        |  1.999                 |  691e70f4-498e-4fd3-91e5-aee329356e19   |
|  cache.m5.12xlarge  |  94608000 |  24326.4    |  Partial Upfront   |  0.926                 |  8cb0ee38-ef25-489f-b33c-471c312d8a7f   |
|  cache.m5.12xlarge  |  31536000 |  21521.6    |  All Upfront       |  0.0                   |  9bff4751-2ade-4031-b1d8-1fc7ea6eecfe   |
|  cache.m5.12xlarge  |  94608000 |  45733.6    |  All Upfront       |  0.0                   |  c3029574-723b-47dc-b0dc-c0737a8d8a4e   |
|  cache.m5.24xlarge  |  94608000 |  48652.8    |  Partial Upfront   |  1.851                 |  2ae319f4-979d-437d-a0da-ac66cda2fa91   |
|  cache.m5.24xlarge  |  31536000 |  43044.0    |  All Upfront       |  0.0                   |  362121ea-13b0-4a1c-9959-af5b5513d850   |
|  cache.m5.24xlarge  |  31536000 |  21960.8    |  Partial Upfront   |  2.507                 |  bc64c5b6-f4a9-46d5-932d-0b17ec45ac87   |
|  cache.m5.24xlarge  |  94608000 |  0.0        |  No Upfront        |  3.999                 |  e0419c3a-a02e-4a20-ae27-607ee938600a   |
|  cache.m5.24xlarge  |  94608000 |  91466.4    |  All Upfront       |  0.0                   |  e8121e2b-90b3-478f-baca-16d305798bc0   |
|  cache.m5.24xlarge  |  31536000 |  0.0        |  No Upfront        |  5.265                 |  f6532b66-20e6-4806-abe5-9fb2165a06e0   |
|  cache.m5.2xlarge   |  31536000 |  1830.4     |  Partial Upfront   |  0.209                 |  005535dd-6be6-4dc8-9cf7-0d8c20057327   |
|  cache.m5.2xlarge   |  31536000 |  0.0        |  No Upfront        |  0.438                 |  2f7b3b2c-6fa6-4c22-a071-159d2625bc2a   |
|  cache.m5.2xlarge   |  94608000 |  0.0        |  No Upfront        |  0.334                 |  3561e7e1-41c5-4753-8559-110dafb8a196   |
|  cache.m5.2xlarge   |  31536000 |  3587.2     |  All Upfront       |  0.0                   |  8390ada5-c98c-4958-b3af-02eca9d49984   |
|  cache.m5.2xlarge   |  94608000 |  7622.4     |  All Upfront       |  0.0                   |  8f0b8e0d-c696-4f01-a6ce-4a522d6e928c   |
|  cache.m5.2xlarge   |  94608000 |  4054.4     |  Partial Upfront   |  0.154                 |  df4a76f7-cf36-449e-8c43-aea3554f86af   |
|  cache.m5.4xlarge   |  94608000 |  8108.8     |  Partial Upfront   |  0.309                 |  08f74a39-dc7a-4884-a1a1-36bb7464dae1   |
....以下300行以上続く

列は左から順に以下を表します。

  • キャッシュノードタイプ
  • 期間(秒で表示。1年か3年かを表す)
  • 前払い料金
  • オファリングタイプ
  • 時間ごとの料金
  • オファリングID

2024年11月現在では、レガシータイプのリザーブドノードは一部のみ重度使用のものが購入できる状態のようです。

終わりに

Amazon ElastiCacheのリザーブドノードのサイズ柔軟性についておさらいしてみました。

Redis OSSのリザーブドノードはValkeyのノードに適用できる、というところが少しトリッキーだなと感じました。改めてまとめてみて少しスッキリしました。

どなたかの参考になれば幸いです。

以上、チバユキ (@batchicchi)がお送りしました。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.