前提
- packerからAtlasのArtifactにAMIを登録している
- ArtifactからTerraformでインスタンスを建てている
- Route53を使って建てたインスタンスに名前を振っている
つまりすごく限定されたパターン。
どうしたいか
Terraformの管理内で、インスタンスを止めずに、同じ名前を新しいインスタンスに割り当てつつ、新しいインスタンスのアプリケーションが立ち上がったのを確認してからRoute53の名前を付け替えたい。
素直にやろうとすると、PackerでビルドしてArtifactを差し替えた後にterraform apply
した途端に
- インスタンス停止
- 新しいAMIからインスタンスが立ち上がる
- Route53の名前が書き換える
ので全くダメ。
どうするか
aws_instance.name
というリソース名を使っているとして
- packerでビルドしてArtifactを差し替える
-
terraform.tfsate
ファイルから対象インスタンスのaws_instance.name
の部分のみを削除してserial:
を一つ上げておく -
terraform apply -target aws_instance.name
でインスタンスだけ立ち上げる - 新しく立ち上がったインスタンスでアプリケーションが動いていることを確認する
-
terraform apply
でRoute53が新しいインスタンスのほうでも更新される - 古いインスタンスはTerraformの管理外になったので手動で削除