terraformでAurora MySQL Compatible v2を作成するときのベストプラクティス

Created
Aug 7, 2023 6:38 AM
Tags
terraformAurora MySQL
Editor
Tomoya Kabe
image

チーフエンジニアの加辺です。

今回はterraform愛好家のためのメモ書きみたいなものです。

MySQL 5.7互換を謳っているAurora MySQL Compatible v2(以下Aurora v2と略します)ですが、具体的に作成するときにはパラメータの組み合わせがなかなか容易ではありません。

planは通ったけど実際にapplyしてみるとエラーであったり、いつまで経ってもクラスタが作成されなかったり…

そんな憂き目を見る人(含将来の自分)を減らすため、この記事を書くことにしました。

ちなみに大抵の場合、目にするエラーはこれです

InvalidParameterValue: The engine mode provisioned you requested is currently unavailable.

一番大事な設定: engineとengine_version

まず前提として、aws_rds_clusteraws_rds_cluster_instance両方に同じものを記述するのが無難です。

本来aws_rds_clusterで指定していればaws_rds_cluster_instanceに必要とは考えにくいのですが、現時点ではここに差異があるとエラーとなってしまうので、同じものを明示的に記述します。

pluginのissueで疑問を呈している人もいます。

engine

Aurora v2ではengineは常にaurora_mysqlとします。v1ではauroraでしたが、Aurora PostgreSQLが出たのでv2からは変更となったようです。

このあたりの正式な情報源はRDS API Documentかと思います。

EngineThe name of the database engine to be used for this DB cluster.Valid Values: aurora (for MySQL 5.6-compatible Aurora), aurora-mysql (for MySQL 5.7-compatible Aurora), and aurora-postgresql

したがってterraformでは以下のように記述することになります:

engine = "aurora-mysql"

engine_version

engine_versionは少し曲者です。というのはRDSコンソールでこの部分のInfoを見ると以下のように記載されているからです:

Regional databasesOne writer and multiple readers5.7.12, 2.03.2, 2.03.3, 2.03.4, 2.04.0, 2.04.1, 2.04.2, 2.04.3, 2.04.4, 2.04.5, 2.04.6, 2.04.7, 2.05.0, 5.6.10a, 1.19.0, 1.19.1, 1.19.2, 1.19.5, 1.20.0One writer and multiple readers - Parallel query5.6.10a, 1.19.0, 1.19.2, 1.19.5Serverless5.6.10aGlobal databasesglobal_10a

今回はこの中でも標準的な

One writer and multiple readers

について述べますが、Aurora v2のデフォルトは5.7.12となっています。(5.6.10a1.*はAurora v1のもの)

このように記載されているとついengine_versionにも5.7.12と記述したくなってしまいます。

実はこれは正しく、5.7.12を利用する場合は5.7.12が正しい記述です。

engine_version = "5.7.12"

ただし5.7.12というのはAurora v2の中では最も古いバージョンで、新しい2.*を使いたい場合が問題となります。

2.04.5を使いたいときにそのまま書くのは間違いです。

# ×間違い
engine_version = "2.04.5"

正解はRDS API Documentを参照するのが正しく、

Aurora MySQLExample: 5.6.10a, 5.6.mysql_aurora.1.19.2, 5.7.12, 5.7.mysql_aurora.2.04.5

以下のように記述します。

# ◯正しい
engine_version = "5.7.mysql_aurora.2.04.5"

この記法はAPI Documentに記載の通り、Aurora v1でも同様です。

engine_versionの罠

2019/11/13現在、2.05.02.04.7というバージョンが記載されていますが、実はこれは未リリースのバージョンのようです。Aurora v2のリリース情報に掲載されているバージョンに含まれていません。

これをterraformでengine_versionに指定した状態でterraform applyを実行すると、何とエラーは発生せず、ひたすら待ち続けることになります。よく確認しましょう。

2019/11/13現在、リリースされている最新バージョンは2.04.6です。

おすすめ設定: Performance Insightsの有効化

AWS ManagedなRDSを利用することのメリットの1つにはPerformance Insightsが利用できることが挙げられます。これは是非とも利用した方がよいでしょう。

Performance Insightsを利用するためにはいくつかの条件があります。よくドキュメントを確認する必要があります。

Aurora v2の場合の条件は以下の通りです

  • engine_versionが2.04.2またはこれ以上の2.*系であること (デフォルトの5.7.12はNG)
  • DB instance classがdb.t2またはdb.t3でないこと(つまりr*系のみ)

今から新規Aurora v2クラスタを作成する場合、engine_versionが低すぎるということはまずないと思いますが、特に開発環境などのinstance classには注意が必要です。

具体的には以下のようにlocalregexallを用いて記述すると環境の差異によりPerformance Insightsの有効/無効を切り替えられるので便利です

locals {
  # どちらかを記載
  db_instance_class = "db.r5.large"
  db_instance_class = "db.t3.small"
}

resource "aws_rds_cluster_instance" "instance" {
  count                        = 2
  identifier_prefix            = "test-${count.index}-"
  engine                       = "aurora-mysql"
  engine_version               = "5.7.mysql_aurora.2.04.6"
  cluster_identifier           = aws_rds_cluster.test.id
  instance_class               = local.db_instance_class
  performance_insights_enabled = length(regexall("^db\\.t[23]", local.db_instance_class)) == 0
  # 以下略
}

Enjoy terraforming!

RDSリソースの作成や削除には時間がかかるので、なるべく失敗しないように知見を溜めていきましょう!