📚

TerraformでElastiCache Redis7 Cluster構築

2023/03/16に公開

概要

2022年11月にRedis7がElastiCacheでサポートされるようになったので、terraformで構築しようとした際にRedis6と異なり、ハマったところがあるので、まとめます。
https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-elasticache-redis-7/

結論

AWS Provider3系の場合 : 初期デプロイ時に、engine_versionは指定しない or null にする必要あり。(4系に更新するのを推奨)
AWS Provider4系の場合 : engine_version7.0を指定

環境

Terraform : 1.3.7
AWS Provider : 3.76.1 / 4.58.0

サンプルコード

微妙にAWS Providerによって書き方が違います。(descriptionとcluster_modeの部分)

AWS Provider : 3.76.1

https://registry.terraform.io/providers/hashicorp/aws/3.76.1/docs/resources/elasticache_replication_group

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

https://registry.terraform.io/providers/hashicorp/aws/4.58.0/docs/resources/elasticache_replication_group

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.07.xではなく、7を指定する必要があります。こちらもRedis6の時は6.xでしたので、紛らわしいですね。
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/ParameterGroups.Redis.html

参考リンク

https://github.com/hashicorp/terraform-provider-aws/issues/27918
https://github.com/hashicorp/terraform-provider-aws/issues/27709

Discussion