Terraform v0.8 以降で state をローカル以外にしていた時に、terraform importできない、aws_volume_attachment
のようなresourceを入れ替える方法です。
ディスクサイズの拡張はオンラインで出来るようになったため、EBSを切り替える必要はなくなっていますがディスクサイズの縮小が必要になってしまったので。
環境
- terraform v0.11.0
- stateのバックエンドをs3にしている。他のバックエンドでも同じ手順でいけるとは思います。
手順
aws_ebs_volume
EBSの入れ替えを行なった後にそのボリュームIDを控えておきます。
リソース名がname
として
terraform state rm aws_ebs_volume.name
terraform import aws_ebs_volume.name vol-id
で aws_ebs_volume
については入れ替えできます。
aws_volume_attachment
まず、いまの stateファイルを取得します。
terraform state pull > state.tfstate
リソース名がname
だったとして、stateファイルから aws_volume_attachment.name
を探すとこんな感じになっているはずです。
"aws_volume_attachment.name": {
"type": "aws_volume_attachment",
"depends_on": [
"aws_ebs_volume.name",
"aws_instance.name"
],
"primary": {
"id": "vai-id",
"attributes": {
"device_name": "/dev/sdb",
"id": "vai-id",
"instance_id": "i-id",
"volume_id": "vol-id"
},
"meta": {},
"tainted": false
},
"deposed": [],
"provider": "provider.aws"
},
今回はこのボリュームを入れ替えたので、attributes
のvolume_id
の値を、新しくしたEBSのボリュームIDにします。
また、この後stateファイルを入れ替えるので、stateファイルのserial
を一つカウントアップしておきます。 serial
でバージョンが管理されているためです。
書き換え終わったら下記を実行してバックエンド上のstateファイルを書き換えます。
terraform state push state.tfstate
これで terraform plan
しても齟齬が出なくなって入れば完了です。