概要
terraform import
で RDS の MySQL をインポートした。
差分が出ないように記述したものの、以下のような差分が出てしまう。
# module.rds.aws_db_instance.primary will be updated in-place
~ resource "aws_db_instance" "primary" {
+ character_set_name = ""
+ domain = ""
+ domain_iam_role_name = ""
id = "hoge"
+ identifier_prefix = ""
+ kms_key_id = ""
+ monitoring_role_arn = ""
name = "fuga"
+ nchar_character_set_name = ""
+ password = (sensitive value)
+ performance_insights_kms_key_id = ""
+ replica_mode = ""
+ replicate_source_db = ""
+ timezone = ""
# (45 unchanged attributes hidden)
# (1 unchanged block hidden)
}
character_set_name, domain, ... といった要素が、いずれも空文字で差分が出ていた。
ドキュメント
例えば character_set_name
は
(Optional) The character set name to use for DB encoding in Oracle and Microsoft SQL instances (collation). This can't be changed.
と書かれており、明らかに MySQL 向けの設定ではない。ほかの空文字の要素も Optional で設定不要なものばかりだった。
import 直後の tfstate
{
"module": "module.rds",
"mode": "managed",
"type": "aws_db_instance",
"name": "primary",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
:
"character_set_name": "",
:
tfstate には character_set_name がすでに空文字で定義されていた。
つまり、差分として本来出る必要のないものが、 plan 時に差分として出ているようだった。
対応
そのまま apply しても特に支障はなかった。
ただ、apply 中に本来必要でない Resetting-master-credentials
というステータスが出たのが気になった。
文字通り認証情報の更新が行われたと思われる。
ここで冒頭の差分を見てみると、 password
でも差分が出ていることがわかる。
これといってパスワードは変えたつもりはないが、同じ値であっても import 直後だと上記「Resetting-master-credentials」がわざわざ生じるのかもしれない。
そこで、別環境で同様の事象が発生した際に password
を ignore_changes に入れてみた。すると、冒頭の差分は一切出なくなった。
resource "aws_db_instance" "primary" {
:
lifecycle {
ignore_changes = [
password,
]
}
}
なぜ password を ignore するとほかの差分も消えるのかはわからないが、そういうものなのかもしれない。