😽

Terraform import時にRDSの差分が消えない時どうするか

2024/09/09に公開

先に結論

terraform import では password を取得できないため差分が出る

対処法

案1: 気にせずapplyする
案2: stateをいじる
案3: lifecycle ignore_changespassword の差分を無視する
案4: password に nullもしくは空文字列を入れる

なぜパスワードが取得できないか調査する

ソースコードを見ると「APIから master_password が取得できないため仮想属性として扱います」と記述があります。
https://github.com/hashicorp/terraform-provider-aws/blob/d90ab28087f1fc1e990e89912ee3237cda141493/internal/service/rds/instance.go#L1933-L1943

動作確認

ひとまずRDSだけをデプロイするコードを作成しデプロイします。

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_db_instance" "default" {
  allocated_storage   = 10
  db_name             = "mydb"
  engine              = "postgres"
  engine_version      = "16.3"
  instance_class      = "db.t4g.micro"
  username            = "foo"
  password            = "foobarbaz"
  publicly_accessible = true
  skip_final_snapshot = true
}

stateファイルを確認

stateファイルを確認し、パスワードが保存されていることを確認します。
以下はstateファイルの抜粋です

            "option_group_name": "default:postgres-16",
            "parameter_group_name": "default.postgres16",
            "password": "foobarbaz",
            "performance_insights_enabled": false,

import時の動作を確認

Stateファイルを削除し、今度はimportを行います。

terraform import aws_db_instance.default mydb

再度stateを確認します

            "option_group_name": "default:postgres-16",
            "parameter_group_name": "default.postgres16",
            "password": null,
            "performance_insights_enabled": false,

ということで terraform import をした時には password がnullになっているということがわかりました。
他のリソースであってもパスワードなどの機密情報であればAPIから取得できないことが想定されるので、差分が出ることは多そうですね

対処法

改めて対処法の詳細を書いていきます。

案1: 気にせずapply

差分が出ているからといって常に変更があるわけではないのでapplyしてしまっても良いです。
passwordだけならダウンタイムは発生しないと思います。
繋げたままにしたセッションも新規接続への失敗も確認した限りありませんでした。

案2: stateをいじる

stateのpassword部分だけ変更することで差分が表示されなくなることを確認しています。
stateファイルを正しく変更できれば最も影響の少ない方法です。

案3: lifecycle ignore_changes を使う

今後 PasswordをTerraformで管理しないことにして lifecycle の機能を使うことでPasswordによる変更をトリガーされないようにすることができます。

案4: password に nullもしくは空文字列を入れる

stateでは password 属性がnullであるためnullや空文字を入れることで変更をしないことが可能です。
この方法の場合はforce recreate時には password を指定しておかないと再作成でエラーが出るので注意が必要です。

Fusic 技術ブログ

Discussion