📚
TerraformでElastiCache Redis7 Cluster構築
概要
2022年11月にRedis7がElastiCacheでサポートされるようになったので、terraformで構築しようとした際にRedis6と異なり、ハマったところがあるので、まとめます。
結論
AWS Provider3系の場合 : 初期デプロイ時に、engine_version
は指定しない or null
にする必要あり。(4系に更新するのを推奨)
AWS Provider4系の場合 : engine_version
は7.0
を指定
環境
Terraform : 1.3.7
AWS Provider : 3.76.1 / 4.58.0
サンプルコード
微妙にAWS Providerによって書き方が違います。(descriptionとcluster_modeの部分)
AWS Provider : 3.76.1
resource "aws_elasticache_replication_group" "test-cluster" {
replication_group_id = "test-cluster"
replication_group_description = "test cluster"
engine_version = "7.x" // ここが大事
port = 6379
parameter_group_name = aws_elasticache_parameter_group.test-pg.name
node_type = "cache.t4g.micro"
automatic_failover_enabled = true
cluster_mode {
num_node_groups = 3
replicas_per_node_group = 1
}
}
resource "aws_elasticache_parameter_group" "test-pg" {
name = "test-pg-redis7"
family = "redis7"
parameter {
name = "cluster-enabled"
value = "yes"
}
}
AWS Provider : 4.58.0
resource "aws_elasticache_replication_group" "test-cluster" {
replication_group_id = "test-cluster"
description = "test cluster"
engine_version = "7.x" // ここが大事
port = 6379
parameter_group_name = aws_elasticache_parameter_group.test-pg.name
node_type = "cache.t4g.micro"
automatic_failover_enabled = true
num_node_groups = 3
replicas_per_node_group = 1
}
resource "aws_elasticache_parameter_group" "test-pg" {
name = "test-pg-redis7-cluster"
family = "redis7"
parameter {
name = "cluster-enabled"
value = "yes"
}
}
検証
apply時
AWS Provider | code上のengine_version | terraform plan | terraform apply |
---|---|---|---|
3.76.1 / 4.58.0 | 7.x | OK | NG(*1) |
3.76.1 | 7.0 | NG(*2) | - |
4.58.0 | 7.0 | OK | OK |
3.76.1 / 4.58.0 | 7.0.7 | NG(*3) | - |
3.76.1 / 4.58.0 | null or 指定なし | OK | OK |
(*1) エラーメッセージ
│ Error: error creating ElastiCache Replication Group (test-cluster): InvalidParameterCombination: Cannot find version 7.x for redis
│ status code: 400, request id: d16675f2-76de-4563-bd71-9b4919ce9ddd
│
│ with aws_elasticache_replication_group.test-cluster,
│ on elasticache.tf line 1, in resource "aws_elasticache_replication_group" "test-cluster":
│ 1: resource "aws_elasticache_replication_group" "test-cluster" {
(*2) エラーメッセージ
│ Error: engine_version: Redis versions must match <major>.x when using version 6 or higher, or <major>.<minor>.<bug-fix>
│
│ with aws_elasticache_replication_group.test-cluster,
│ on elasticache.tf line 4, in resource "aws_elasticache_replication_group" "test-cluster":
│ 4: engine_version = "7.0"
(*3) 後述の通り、検証時点では7.0.7が使われているようでした。
│ Error: engine_version: Redis versions must match <major>.x when using version 6 or higher, or <major>.<minor>.<bug-fix>
│
│ with aws_elasticache_replication_group.test-cluster,
│ on elasticache.tf line 4, in resource "aws_elasticache_replication_group" "test-cluster":
│ 4: engine_version = "7.0.7"
apply後
tfstateファイルは以下の状態でした。
なお、当然ですが、apply後にcodeをtfstateと同じ指定にしても差分は出ませんでした。
AWS Provider | code上のengine_version | tfstateの状態 |
---|---|---|
4.58.0 | 7.0 or null or 指定なし | "engine_version": "7.0","engine_version_actual": "7.0.7" |
3.76.1 | null or 指定なし | "engine_version": "7.x","engine_version_actual": "7.0.7", |
その他
issueでも書かれていますが、cliでバージョンを取得しようとすると、6.xでは結果が返ってきますが、7.xでは結果が返ってこないので、AWSの仕様としてはRedis7では7.xという指定はサポートされなくなったということかと思われます。
% aws elasticache describe-cache-engine-versions --engine redis --engine-version 7.0
{
"CacheEngineVersions": [
{
"Engine": "redis",
"EngineVersion": "7.0",
"CacheParameterGroupFamily": "redis7",
"CacheEngineDescription": "Redis",
"CacheEngineVersionDescription": "redis version 7.0.7"
}
]
}
% aws elasticache describe-cache-engine-versions --engine redis --engine-version 7.x
{
"CacheEngineVersions": []
}
% aws elasticache describe-cache-engine-versions --engine redis --engine-version 6.x
{
"CacheEngineVersions": [
{
"Engine": "redis",
"EngineVersion": "6.2",
"CacheParameterGroupFamily": "redis6.x",
"CacheEngineDescription": "Redis",
"CacheEngineVersionDescription": "redis version 6.2.6"
}
]
}
% aws elasticache describe-cache-engine-versions --engine redis --engine-version 6.2
{
"CacheEngineVersions": [
{
"Engine": "redis",
"EngineVersion": "6.2",
"CacheParameterGroupFamily": "redis6.x",
"CacheEngineDescription": "Redis",
"CacheEngineVersionDescription": "redis version 6.2.6"
}
]
}
(参考)Parameter Group
一方で、Parameter Groupのfamilyの指定は7.0
や7.x
ではなく、7
を指定する必要があります。こちらもRedis6の時は6.x
でしたので、紛らわしいですね。
参考リンク
Discussion