Terraform import時にRDSの差分が消えない時どうするか
先に結論
terraform import
では password
を取得できないため差分が出る
対処法
案1: 気にせずapplyする
案2: stateをいじる
案3: lifecycle ignore_changes
で password
の差分を無視する
案4: password
に nullもしくは空文字列を入れる
なぜパスワードが取得できないか調査する
ソースコードを見ると「APIから master_password
が取得できないため仮想属性として扱います」と記述があります。
動作確認
ひとまず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ファイルを正しく変更できれば最も影響の少ない方法です。
lifecycle ignore_changes
を使う
案3: 今後 PasswordをTerraformで管理しないことにして lifecycle の機能を使うことでPasswordによる変更をトリガーされないようにすることができます。
password
に nullもしくは空文字列を入れる
案4: stateでは password
属性がnullであるためnullや空文字を入れることで変更をしないことが可能です。
この方法の場合はforce recreate時には password
を指定しておかないと再作成でエラーが出るので注意が必要です。
Discussion