memo.log

技術情報の雑なメモ

Terraform Provider AWS でAuroraの結合テストが失敗するとき

make testacc PKG=rds TESTS='TestAccRDSClusterInstance_basic'

結合試験は実際のAWS環境にリソースがデプロイされる。 デプロイされるリソースはこのへんで定義されてる

github.com

func testAccClusterInstanceConfig_base(rName, engine string) string {
    return acctest.ConfigCompose(
        acctest.ConfigAvailableAZsNoOptIn(),
        testAccClusterInstanceConfig_orderableEngineBase(engine, false),
        fmt.Sprintf(`
resource "aws_rds_cluster" "test" {
  cluster_identifier = %[2]q
  availability_zones = [
    data.aws_availability_zones.available.names[0],
    data.aws_availability_zones.available.names[1],
    data.aws_availability_zones.available.names[2]
  ]
  engine              = data.aws_rds_engine_version.default.engine
  engine_version      = data.aws_rds_engine_version.default.version
  database_name       = "mydb"
  master_username     = "foo"
  master_password     = "mustbeeightcharacters"
  skip_final_snapshot = true
}
`, engine, rName))
}

main ブランチを持ってきているはずなのに。以下のエラーが出てハマった。。。

2024-02-20T18:18:39.014+0900 [ERROR] sdk.helper_resource: Unexpected error:
  error=
  | Error running apply: exit status 1
  | 
  | Error: creating RDS Cluster (tf-acc-test-xxxxxxxxx): DBSubnetGroupDoesNotCoverEnoughAZs: The DB subnet group doesn't meet Availability Zone (AZ) coverage requirement. Current AZ coverage: us-west-2c. Add subnets to cover at least 2 AZs.
  | \tstatus code: 400, request id: d4d1ccab-xxx-xxxx-xxxx-xxxxx
  | 
  |   with aws_rds_cluster.test,
  |   on terraform_plugin_test.tf line 31, in resource "aws_rds_cluster" "test":
  |   31: resource "aws_rds_cluster" "test" {

どうやら前提として、 aws_rds_cluseterdb_subnet_group は省略すると以下の動作になるらしい(ドキュメントに明記しておいてほしい・・。多分無いと思う)

  • 既存のサブネットグループを(適当に)選択する
  • サブネットグループが無かったらサブネットグループを作成するが、その時既存のサブネットを用いる
  • その際、サブネット(AZ)の数が足りなかった場合は、エラーになる(サブネットを自動で作ったりはしない)
    • Auroraで指定するサブネットグループは最低でも 2AZ またがないといけない

なので、既存のVPCにサブネット(AZ)を3つ作ったら解決した。 ちなみに、リージョンはデフォルトでオレゴン(us-west-2)が選ばれた。 これはテスト中に data ソースで Optin されているリージョンから先頭が自動で選ばれるみたい。これも分かりにくすぎるでしょ・・。