はじめに

こんにちは、そしてこんばんは。
クラウドインテグレーション事業部の大嵩です。
今回は私がTerraformでRDSインスタンスを構築しようとした際に
沼ってしまったポイントに関して紹介したいと思います。
この投稿がどなたかの役に立ちますと幸いです。

何で沼ったのか

ずばり、RDSインスタンスを構築する際の「db_name」の指定で沼ってしまいました。
今回使用するDBエンジンはMySQLなのですが、お恥ずかしながらMySQLのデータベース名に命名規則があることを認識しておらず、エラーを発生させてしまいました。

エラー発生時のコード

以下のようにterrafomのコードを作成していました。

resource "aws_db_instance" "test_db" {
  identifier              = "terraform-test-db"
  db_name                 = "terraform-test-db"
  engine                  = "mysql"
  engine_version          = "8.0.35"
  instance_class          = "db.t3.micro"
  allocated_storage       = 20
  username                = "admin"
  password                = "hogehoge" #テストなので直書き
  apply_immediately       = true
  backup_retention_period = 0
  skip_final_snapshot     = true
  db_subnet_group_name    = aws_db_subnet_group.test_db_subnet.name
  vpc_security_group_ids  = [ aws_security_group.test_rds_sg.id ]
}

terraform apply後 にエラーが発生

terraform applyが通るかと思いきや、下記のエラーが発生。
InvalidParameterValue: DBName must begin with a letter and contain only alphanumeric characters.
こちらのエラーは、「DBName は文字で始まり、英数字のみを含む必要があります」とのことで、
特にdb_nameで指定した「terraform-test-db」は問題なさそうですが、AWSのドキュメントから調査を開始。

aws_db_instance.test_db: Creating...
╷
│ Error: creating RDS DB Instance (terraform-test-db): InvalidParameterValue: DBName must begin with a letter and contain only alphanumeric characters.
│   status code: 400, request id: XXXXXXXX
│ 
│   with aws_db_instance.test_db,
│   on rds.tf line 1, in resource "aws_db_instance" "test_db":
│    1: resource "aws_db_instance" "test_db" {
│ 
╵

結論

AWSドキュメント(DBNameの項目)によると、
英数字・アンダースコア(_) のみが使用可能とのことでした。。。
インスタンス名はハイフンでも指定が可能ですが、データベース名は不可とのことです。

※ ブラウザの翻訳機能使用

対策

最後に、対策としては以下が適切かと思われます。

  • db_name をインタンス構築時に指定しない
  • 指定する場合の名前のつなぎは、ハイフンではなくアンダースコアにする
    • 例: 「 terraform_test_db 」

TerraformでRDSインスタンスを構築する際はぜひ参考にしてください!