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_instance
のdestroy
-> 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環境構築時にハマった問題だったため)
マネジメントコンソールよりクラスタのエンジンバージョンを変更
即時反映したいならImmediately
を選択する
Terraformのコードをそれに併せて変更する
engine_version = "5.7.mysql_aurora.2.08.1"
-> engine_version = "5.7.mysql_aurora.2.09.0"
この状態でterraform plan
を打つとNo changesになる。