ElastiCache クラスターとノードの一覧を必要な情報に絞って AWS CLI で CSV 出力してみた

ElastiCache のクラスターの考え方が Redis と Memcached で異なることを知りました。

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

かなりピンポイントですが、ElastiCache クラスターについてこういう一覧を作りたい機会がありました。

エンジンの種類、バージョン、ノードタイプを一覧で見たい。

AWS CLI でやってみたよ、という話です。同じことをしたい方が 3 人くらいはいると思うので、参考になれば幸いです。

ElastiCache クラスターを一覧出力するコマンド

以下を実行しました。

$ aws elasticache describe-cache-clusters\
  | jq -r '
   ["クラスター/ノード名","ノードタイプ","エンジン","バージョン","ノード数"],
   (.CacheClusters[] | [.CacheClusterId, .CacheNodeType, .Engine, .EngineVersion, .NumCacheNodes]) | @csv'

jq で CSV 形式で出力する、といういつものパターンです。大好きです。

出力結果のイメージは以下の通りです。

"クラスター/ノード名","ノードタイプ","エンジン","バージョン","ノード数"
"sample-cache-001","cache.m5.large","redis","2.8.22","1"
"sample-cache-002","cache.m5.large","redis","2.8.22","1"
"sample-cache-dev-001","cache.m5.large","redis","2.8.22","1"
"sample-cache-dev-002","cache.m5.large","redis","2.8.22","1"
"sample-cache-pro","cache.m3.medium","memcached","1.4.14","1"
"sample-cache-test","cache.t1.micro","memcached","1.4.14","1"
"sample-redis-001","cache.m3.medium","redis","3.2.10","1"
"sample-redis-002","cache.m3.medium","redis","3.2.10","1"
"exapmle-001","cache.m3.medium","redis","2.8.24","1"
"exapmle-002","cache.m3.medium","redis","2.8.24","1"
"exapmle-003","cache.m3.medium","redis","2.8.24","1"
"exapmle-004","cache.m3.medium","redis","2.8.24","1"
"exapmle-005","cache.m3.medium","redis","2.8.24","1"
"exapmle-006","cache.m3.medium","redis","2.8.24","1"
"exapmle-007","cache.m5.4xlarge","redis","5.0.6","1"
"exapmle-008","cache.m5.4xlarge","redis","5.0.6","1"
...

describe-cache-clusters

今回実行した AWS CLI コマンドは以下です。

アウトプットのサンプルは以下で、ハイライト部をフィルタしています。

{
    "CacheClusters": [
    {
            "CacheClusterId": "my-cluster-003",
            "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
            "CacheNodeType": "cache.r5.large",
            "Engine": "redis",
            "EngineVersion": "5.0.5",
            "CacheClusterStatus": "available",
            "NumCacheNodes": 1,
            "PreferredAvailabilityZone": "us-west-2a",
            "CacheClusterCreateTime": "2019-11-26T01:22:52.396Z",
            "PreferredMaintenanceWindow": "mon:17:30-mon:18:30",
            "PendingModifiedValues": {},
            "NotificationConfiguration": {
                "TopicArn": "arn:aws:sns:us-west-2:xxxxxxxxxxx152:My_Topic",
                "TopicStatus": "active"
            },
            "CacheSecurityGroups": [],
            "CacheParameterGroup": {
                "CacheParameterGroupName": "default.redis5.0",
                "ParameterApplyStatus": "in-sync",
                "CacheNodeIdsToReboot": []
            },
            "CacheSubnetGroupName": "kxkxk",
            "AutoMinorVersionUpgrade": true,
            "SecurityGroups": [
                {
                    "SecurityGroupId": "sg-xxxxxd7b",
                    "Status": "active"
                }
            ],
            "ReplicationGroupId": "my-cluster",
            "SnapshotRetentionLimit": 0,
            "SnapshotWindow": "06:30-07:30",
            "AuthTokenEnabled": false,
            "TransitEncryptionEnabled": false,
            "AtRestEncryptionEnabled": false,
            "ARN": "arn:aws:elasticache:us-west-2:xxxxxxxxxxx152:cluster:my-cache-cluster",
            "ReplicationGroupLogDeliveryEnabled": false,
            "LogDeliveryConfigurations": [
                {
                    "LogType": "slow-log",
                    "DestinationType": "cloudwatch-logs",
                    "DestinationDetails": {
                        "CloudWatchLogsDetails": {
                            "LogGroup": "test-log"
                        }
                    },
                    "LogFormat": "text",
                    "Status": "active"
                }
            ]
        }
    ]
}

ElastiCache のクラスターとは何か

ここまで見てきて、ElastiCache のクラスターってなんだ?というの分からなくなってきました。コマンドはdescribe-cache-clustersですが、結果はクラスター内のノード単位で出力されています。

今回の環境はマネジメントコンソールでは以下のように見えます。クラスターの中に複数のノードがあると表現されています。

ElastiCache_Management_Console_node

個別のクラスターの詳細を確認すると、以下のように複数のノードからなることが分かります。AWS CLI ではここでのノードのひとつひとつがCacheClusterIdとして返されています。

ElastiCache_Management_Console_cluster

マネジメントコンソール上での「クラスター名」がコマンドのCacheClusterIdの結果となり、NumCacheNodesで「2」が返ってくることを想定していた自分は少し面食らいました。

ElastiCache のクラスターはクラスターじゃない時もある

マネジメントコンソールにおいては、ElastiCache for Redis の以下構成は全てクラスターと表現されます。

  • 単一のノード
  • クラスターモード無効(単一のシャード)で1つ以上のレプリカノードが存在する
  • クラスターモード有効で1つ以上のシャード上それぞれで 1つ以上のレプリカノードが存在する

そしてややこしいことに、ここでの「クラスター」はコンソール上の表示と API/CLI 上で扱われる時とで名称が変わります。

それを表したのが以下図(上記リンクより引用)で、ノード数が複数の場合、コンソールで「クラスター」と表示されているのは API/CLI では「レプリケーショングループ」と表現されます。

Amazon_ElastiCache_for_Redis_doc

今回の例では、単一のシャード上でプライマリノードとレプリカノードが存在する構成でした。

ちなみに、既存の環境の「クラスター」のクラスターモードが有効か無効かは以下手段で確認できます。

describe-cache-clusters の「クラスター」が指すもの

上記で見たようなクラスター構成は ElastiCache for Redis に限定した話で、for Memcached ではシンプルに「クラスター」です。

Memcaced_-_Amazon_ElastiCache

一つのクラスター内に一つ以上のノードがある、という分かりやすい構成です。describe-cache-clustersコマンドは対象が Memcached のみであれば理解がしやすいです。

対象が Redis の場合、「レプリケーショングループ」はここでは考慮されず、個々のノードに対して結果が得られます。そのため、 CLI の結果の一要素であるNumCacheNodesは常に1となります。

レプリケーショングループの切り口で結果を得たい場合にはまた別のコマンドを使用する必要があります。

このコマンドでは、以下のノードが対象外になります。

  • Memcached エンジンのノード
  • Redis エンジンの単一構成のノード

終わりに

ElastiCache 「クラスター」の一覧を出力してみました。

Redis と Memcached でのクラスターの考え方の違いを理解していなかったので、当初は結果の読み取り方に苦戦しました。describe-cache-clustersは両者のエンジンに共通して使用できるため、以下のような違いが生まれることを把握しました。

  • Redis
    • 個々のノードに対して結果が得られる
    • --(no-)show-cache-clusters-not-in-replication-groupsオプションでレプリケーショングループに属するノードの出力有無をコントロールできる
    • デフォルトではno-が付与されている状態と同等で、すべてのノードが返される
    • no-が付与されていないと、エンジンが Memcached のものを含むレプリケーショングループに属していないノードのみが返される
  • Memcached
    • クラスターに対して結果が得られる
      • --(no-)show-cache-node-infoオプションでクラスター内のノードに対する詳細情報の出力有無をコントロールできる

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