TerraformでAuroraを作成した時のエンジンバージョンのアップグレードでハマった

Posted on
Terraform AWS

TerraformでAuroraを作成した時に、エンジンバージョンのアップグレードに失敗した。 AuroraをTerraformで作ってる人はわりとハマりそうな問題だと思う。

前提

以下のようなTerraformのコードを元にAuroraを作成した時のケースで遭遇した問題である。

resource "aws_rds_cluster" "sample" {
  cluster_identifier_prefix = "sample-"
  engine                    = "aurora-mysql"
  engine_version            = "5.7.mysql_aurora.2.08.1"
  master_username           = "root"
  master_password           = "dummy"
  backup_retention_period   = 30
  storage_encrypted               = true
  vpc_security_group_ids          = [aws_security_group.sample_rds.id]
  db_subnet_group_name            = aws_db_subnet_group.sample.name
  db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.sample.name
}

resource "aws_rds_cluster_instance" "sample" {
  count                   = local.rds_param["cluster_instance_count"][var.environment]
  identifier              = "sample-${count.index}"
  cluster_identifier      = aws_rds_cluster.sample.cluster_identifier
  db_subnet_group_name    = aws_db_subnet_group.sample.name
  db_parameter_group_name = aws_db_parameter_group.sample.name
  engine                  = aws_rds_cluster.sample.engine
  engine_version          = aws_rds_cluster.sample.engine_version
  instance_class          = "db.r4.large"
}

遭遇したエラー

エンジンバージョンをアップグレードする変更を加えてterraform applyすると、以下のエラーが出力され失敗した。

Error: Provider produced inconsistent final plan

When expanding the plan for aws_rds_cluster_instance.sample[0] to include new
values learned so far during apply, provider
"registry.terraform.io/hashicorp/aws" produced an invalid new value for
.engine_version: was cty.StringVal("5.7.mysql_aurora.2.09.0"), but now
cty.StringVal("5.7.mysql_aurora.2.08.1").

This is a bug in the provider, which should be reported in the provider's own
issue tracker.

この時点ではrds_cluster_instancedestroy -> createにおけるcreateのみ失敗した状態でterraformによる処理が変わる。 結果、RDSのインスタンス数が0になってしまう。

そしてその後に(terraform applyがエラーになったため)再度terraform applyを試みると以下のエラーが出力されてしまうことがある。

Error: Failed to modify RDS Cluster (sample-20200820060713248900000004): InvalidDBClusterStateFault: Cannot modify engine version without a healthy primary instance in DB cluster: sample-20200820060713248900000004
	status code: 400, request id: XXXXXXXXXXXXXXXXXXXXXx

上記の問題への対応

マネジメントコンソールよりAuroraのエンジンバージョンを変更し、そのあとにTerraformのコードを修正するのが一番簡単である。 一応補足しておくと、この対応手順はダウンタイムを全く考慮しない手法である。(staging環境構築時にハマった問題だったため)

マネジメントコンソールよりクラスタのエンジンバージョンを変更

Cluster Engine Version

即時反映したいならImmediatelyを選択する

Immediately

Terraformのコードをそれに併せて変更する

  engine_version            = "5.7.mysql_aurora.2.08.1"
  ->   engine_version            = "5.7.mysql_aurora.2.09.0"

この状態でterraform planを打つとNo changesになる。