ElastiCache ServerlessをCloudFormationとAWS CLIで構築してみた
Amazon ElastiCache Serverlessはトラフィックパターンに応じてキャパシティがスケールし、高可用なクラスターがプロビジョンされます。 サーバーレスなため、ノードタイプやシャード数やレプリカ数などの指定は不要です。
AWSの公式ドキュメントで紹介されている、サーバーレス版ElastiCache for Redisの作成手順は極限までシンプルです *1。
aws elasticache create-serverless-cache \ --serverless-cache-name CacheName \ --engine redis
とはいえ、実環境ではデフォルト値をカスタマイズする必要もあるでしょう。そのようなユースケース向けに、AWS CLIとCloudFormationでAmazon ElastiCache Serverlessを構築する手順を紹介します。
API について
ElastiCache Serverlessを作成するために ElastiCache::CreateServerlessCache
という新しい API が割り当てられています。
クラスターの参照・変更・削除やスナップショット操作にもサーバーレス版の新しいAPIが割り当てられています。
主要パラメーター
ElastiCacheがサーバーレスになったことで、ユーザーが気をつけるべきパラメーターはスケール上限を指定する CacheUsageLimits
だけです。
このパラメーターでは
- データ上限
- CPU
を指定します。
項目 | パラメーター | 範囲 | デフォルト値 | 単位 |
---|---|---|---|---|
データ上限 | DataStorage | 1-5000 | 5000 | GB |
計算上限 | ECPUPerSecond | 1,000-15,000,000 | 15,000,000 | ECPU |
ECPUは ElastiCache Processing Unitを表し、コマンドが消費したvCPUとデータサイズの大きい方を元にECPUを消費します。
デフォルトは上限値であり、利用者は CacheUsageLimits
を設定することで、上限を下げる事ができます。
試算は難しいため、実際のワークロードで CloudWatch MetricのElastiCacheProcessingUnits
を確認し、利用費も考慮しながら上限値を設定しましょう。
データサイズが DataStorage
の上限に達すると Eviction やOut Of Memory (OOM)が発生し、ECPUが ECPUPerSecond
の上限に達するとスロットリングが発生します。このあたりは直感どおりかと思います。
参考
- https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.corecomponents.html
- https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Scaling.html
設定できないパラメーター
ElastiCacheがサーバーレスになったことで、クラスター管理にまつわる多くのパラメーターを指定できなくなりました。
サーバーレス版は垂直にも水平にもスケールするため
- ノードタイプ
- シャード数
などの指定は不要です。
サーバーレス版はAWSが高可用性・対障害姓を担保しているため
- レプリカ数
- マルチAZ化
などの指定は不要です。
サーバーレス版はマイナーバージョンのアップグレードやパッチもダウンタイムなしに自動で適用するため、マイナーアップグレードの自動適用を指定するオプションも存在しません。
ElastiCache Serverless automatically applies the latest MINOR and PATCH software version to your cache, without any impact or downtime to your application. No action is required on your end.
https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/VersionManagement.html
デプロイしてみる
以上を踏まえて、次のような設定のサーバーレス版のElastiCache for Redisを AWS CLIとCloudFormationで作成します。
項目 | 値 |
---|---|
エンジン | Redis |
エンジンバージョン | 7 |
データサイズ上限 | 1GB |
ECPU上限 | 1000 |
AWS CLIでデプロイ
aws elasticache create-serverless-cache \ --serverless-cache-name redis-svl-cli \ --description desc \ --engine redis \ --major-engine-version 7 \ --cache-usage-limits DataStorage='{Maximum=1,Unit=GB}',ECPUPerSecond='{Maximum=1000}' \ --security-group-ids sg-123 \ --subnet-ids '["subnet-aaa","subnet-bbb","subnet-ccc"]' \ --snapshot-retention-limit 7 \ --daily-snapshot-time "17:30" \ --tags Key=Envg,Value=Dev
CloudFormationでデプロイ
AWSTemplateFormatVersion: "2010-09-09" Resources: SampleCluster: Type: AWS::ElastiCache::ServerlessCache Properties: ServerlessCacheName: redis-svl-cfn Description: desc Engine: redis MajorEngineVersion: 7 CacheUsageLimits: DataStorage: Maximum: 1 Unit: GB ECPUPerSecond: Maximum: 1000 SecurityGroupIds: - sg-123 SubnetIds: - subnet-aaa - subnet-bbb - subnet-ccc SnapshotRetentionLimit: 7 DailySnapshotTime: "17:30" Tags: - Key: Env Value: Dev
ElastiCache for Redisの構成ごとのパラメーターを比較
ElastiCache for Redisは以下の3パターンが存在します(MemoryDB for Redisは除外)。
- (初代)非クラスター型
- クラスター型
- self-designed : ユーザーがプロビジョン
- serverless : re:Invent 2023で発表
これらをキャッシュ作成APIごとにパラメーターを比較してみましょう。
サーバーレス版がダントツでシンプルですね。
非クラスター型
create-cache-cluster --cache-cluster-id <value> [--replication-group-id <value>] [--az-mode <value>] [--preferred-availability-zone <value>] [--preferred-availability-zones <value>] [--num-cache-nodes <value>] [--cache-node-type <value>] [--engine <value>] [--engine-version <value>] [--cache-parameter-group-name <value>] [--cache-subnet-group-name <value>] [--cache-security-group-names <value>] [--security-group-ids <value>] [--tags <value>] [--snapshot-arns <value>] [--snapshot-name <value>] [--preferred-maintenance-window <value>] [--port <value>] [--notification-topic-arn <value>] [--auto-minor-version-upgrade | --no-auto-minor-version-upgrade] [--snapshot-retention-limit <value>] [--snapshot-window <value>] [--auth-token <value>] [--outpost-mode <value>] [--preferred-outpost-arn <value>] [--preferred-outpost-arns <value>] [--log-delivery-configurations <value>] [--transit-encryption-enabled | --no-transit-encryption-enabled] [--network-type <value>] [--ip-discovery <value>] [--cli-input-json | --cli-input-yaml] [--generate-cli-skeleton <value>] [--debug] [--endpoint-url <value>] [--no-verify-ssl] [--no-paginate] [--output <value>] [--query <value>] [--profile <value>] [--region <value>] [--version <value>] [--color <value>] [--no-sign-request] [--ca-bundle <value>] [--cli-read-timeout <value>] [--cli-connect-timeout <value>] [--cli-binary-format <value>] [--no-cli-pager] [--cli-auto-prompt] [--no-cli-auto-prompt]
self-designed型
create-replication-group --replication-group-id <value> --replication-group-description <value> [--global-replication-group-id <value>] [--primary-cluster-id <value>] [--automatic-failover-enabled | --no-automatic-failover-enabled] [--multi-az-enabled | --no-multi-az-enabled] [--num-cache-clusters <value>] [--preferred-cache-cluster-azs <value>] [--num-node-groups <value>] [--replicas-per-node-group <value>] [--node-group-configuration <value>] [--cache-node-type <value>] [--engine <value>] [--engine-version <value>] [--cache-parameter-group-name <value>] [--cache-subnet-group-name <value>] [--cache-security-group-names <value>] [--security-group-ids <value>] [--tags <value>] [--snapshot-arns <value>] [--snapshot-name <value>] [--preferred-maintenance-window <value>] [--port <value>] [--notification-topic-arn <value>] [--auto-minor-version-upgrade | --no-auto-minor-version-upgrade] [--snapshot-retention-limit <value>] [--snapshot-window <value>] [--auth-token <value>] [--transit-encryption-enabled | --no-transit-encryption-enabled] [--at-rest-encryption-enabled | --no-at-rest-encryption-enabled] [--kms-key-id <value>] [--user-group-ids <value>] [--log-delivery-configurations <value>] [--data-tiering-enabled | --no-data-tiering-enabled] [--network-type <value>] [--ip-discovery <value>] [--transit-encryption-mode <value>] [--cluster-mode <value>] [--serverless-cache-snapshot-name <value>] [--cli-input-json | --cli-input-yaml] [--generate-cli-skeleton <value>] [--debug] [--endpoint-url <value>] [--no-verify-ssl] [--no-paginate] [--output <value>] [--query <value>] [--profile <value>] [--region <value>] [--version <value>] [--color <value>] [--no-sign-request] [--ca-bundle <value>] [--cli-read-timeout <value>] [--cli-connect-timeout <value>] [--cli-binary-format <value>] [--no-cli-pager] [--cli-auto-prompt] [--no-cli-auto-prompt]
serverless型
create-serverless-cache --serverless-cache-name <value> [--description <value>] --engine <value> [--major-engine-version <value>] [--cache-usage-limits <value>] [--kms-key-id <value>] [--security-group-ids <value>] [--snapshot-arns-to-restore <value>] [--tags <value>] [--user-group-id <value>] [--subnet-ids <value>] [--snapshot-retention-limit <value>] [--daily-snapshot-time <value>] [--cli-input-json | --cli-input-yaml] [--generate-cli-skeleton <value>] [--debug] [--endpoint-url <value>] [--no-verify-ssl] [--no-paginate] [--output <value>] [--query <value>] [--profile <value>] [--region <value>] [--version <value>] [--color <value>] [--no-sign-request] [--ca-bundle <value>] [--cli-read-timeout <value>] [--cli-connect-timeout <value>] [--cli-binary-format <value>] [--no-cli-pager] [--cli-auto-prompt] [--no-cli-auto-prompt]
参考
脚注
- デフォルトのVPC・サブネット・セキュリティグループを活用 ↩