クラウドリソース自体をdestroy/createdせずに
Terraform定義の記述場所を変更する方法
Future Tech Night #20 Terraform State縛りの勉強会
2022年2月17日(木) 19:00 ~ 20:00
棚井 龍之介(タナイ リュウノスケ)
1
Copyright @ 2022 by Future Corporation
自己紹介
名前: 棚井 龍之介(タナイ リュウノスケ)
所属: フューチャー株式会社(新卒2019~)
技術: Go、AWS、Terraform
その他
2
Copyright @ 2022 by Future Corporation
本日のテーマ
3
Copyright @ 2022 by Future Corporation
本日のテーマ
4
Copyright @ 2022 by Future Corporation
Agenda
5
Copyright @ 2022 by Future Corporation
Terraform運用で初心者を脱する瞬間
6
1
Copyright @ 2022 by Future Corporation
terraform init / plan / apply では対応できない問題
7
Copyright @ 2022 by Future Corporation
terraform init / plan / apply では対応できない問題
↓
$ terraform import
$ terraform state [ list / show / pull / mv / push ]
8
Copyright @ 2022 by Future Corporation
今回フォーカスする問題
ただし、
.tfの中身を「cut & paste」すると、リソースは再作成される
データベースや24/365稼働インスタンスだと、再作成はNGである
→ リソースを再作成せずに、Terraform記述を移動させる
9
Copyright @ 2022 by Future Corporation
今回フォーカスする問題
ただし、
.tfの中身を「cut & paste」すると、リソースは再作成される
データベースや24/365稼働インスタンスだと、再作成はNGである
10
Copyright @ 2022 by Future Corporation
リソースを再作成せずに、Terraform記述を移動する
11
terraform/
└ resources/
├ ec2.tf
├ rds.tf
├ apigateway.tf
└ s3.tf
terraform/
├ resources/
| ├ ec2.tf
| └ apigateway.tf
|
└ data/(移動)
├ rds.tf
└ s3.tf
変更なし、再作成なし
Copyright @ 2022 by Future Corporation
Stateの基本知識
12
2
Copyright @ 2022 by Future Corporation
Stateの基本知識: 目次
13
Copyright @ 2022 by Future Corporation
Stateファイルの目的
Purpose of Terraform State
※ Performanceの例: `-target`, `refresh=false`
14
Copyright @ 2022 by Future Corporation
tfstateファイルの生成/更新タイミング
`$ terraform apply`の
クラウドストレージ(S3など)をbackendに指定した場合は、
`$ terraform init` 実行時にbackendへの疎通が確認され、問題なければ以降の plan / apply /destroy操作での参照 / 更新先として設定される
15
Copyright @ 2022 by Future Corporation
tfstateの中身/項目
`$ terraform state pull` で参照可能
tfstateのリファクタリング
≒ resourcesの「cut & paste」
16
Copyright @ 2022 by Future Corporation
複数ディレクトリで `$ terraform init` した場合
17
terraform/
├ dir_a/ <$ terraform init>
| ├ backend.tf <S3 key=state/dir_a>
| ├ provider.tf
| └ resources.tf
|
└ dir_b/ <$ terraform init>
├ backend.tf <S3 key=state/dir_b>
├ provider.tf
└ resources.tf
dir_a/
のtfstateファイル
dir_b/
のtfstateファイル
Copyright @ 2022 by Future Corporation
`$ terraform refresh` について
実リソースを手動操作(例えば、Lambdaの環境変数を変更)した時は、このコマンドで変更内容をtfstateに取り込める
18
Copyright @ 2022 by Future Corporation
Stateの基本知識: 目次(再掲)
19
Copyright @ 2022 by Future Corporation
Terraformでplan差分が生じるのは、どういうとき?
20
Copyright @ 2022 by Future Corporation
Terraformでplan差分が生じるのは、どういうとき?
以下3つで、定義内容に乖離が生じたとき
21
Copyright @ 2022 by Future Corporation
差分解消方法(1/3)
[方法]
最も基本的なリソース追加/更新/削除作業
`$ terraform plan`, `$ terraform apply` により、リソースを追加/更新/削除する
22
Copyright @ 2022 by Future Corporation
差分解消方法(2/3)
[方法]
`$ terraform plan -refresh-only`で、実リソースから .tfstateに取り込む
.tfファイルを編集して、実リソース定義に合わせる
23
Copyright @ 2022 by Future Corporation
差分解消方法(3/3)
[方法]
.tfstateの更新内容を、.tfと実リソースに反映する方法???
そもそも、なぜ、.tfstateが更新された?
24
Copyright @ 2022 by Future Corporation
.tfstate編集が必要になるタイミング
「リソースを再作成せずに、Terraform記述を移動する」には、
tfstateファイルを「適切に編集」しなければならない
25
Copyright @ 2022 by Future Corporation
.tfstate編集の選択肢
26
Copyright @ 2022 by Future Corporation
.tfstateの移植操作
27
3
Copyright @ 2022 by Future Corporation
前提条件とやりたいこと
前提条件
やりたいこと
28
Copyright @ 2022 by Future Corporation
Terraform用語に変換すると
(スタートの状態を「構成A」、tfstate移植後を「構成B」とする)
29
terraform/
└ resources/
├ ec2.tf
└ s3.tf
terraform/
├ resources/
| └ ec2.tf
└ data/
└ s3.tf
①plan差分なし
②適切な移植操作
③plan差分なし
終了
構成A
構成B
Copyright @ 2022 by Future Corporation
.tfstateの移植操作: 図で操作イメージを把握
①スタート
②抽出 & コピー
terraform state mv
terraform state pull
③移植
terraform state mv
④上書き
terraform state push
30
Copyright @ 2022 by Future Corporation
.tfstateの移植操作: ①スタート
(用語定義)
(ディレクトリ想定)
├ dir_A/
| └ main.tf [null_resource.a, apply済み]
└ dir_B/
└ main.tf [apply済み]
(作業目標)
31
Copyright @ 2022 by Future Corporation
.tfstateの移植操作: ②抽出 & コピー
[取り出す]
$ terraform state mv -state-out=local_a.tfstate \
null_resource.a null_resource.a(at dir_A/)
[コピーする]
$ terraform state pull > local_B.tfstate(at dir_B/)
32
Copyright @ 2022 by Future Corporation
.tfstateの移植操作: ③移植
[入れる]
$ terraform state mv -state=../dir_A/local_a.tfstate \
-state-out=local_B.tfstate \
null_resource.a null_resource.a(at dir_B/)
33
Copyright @ 2022 by Future Corporation
.tfstateの移植操作: ④上書き
[上書きする]
$ terraform state push local_B.tfstate(at dir_B/)
34
Copyright @ 2022 by Future Corporation
.tfstateの移植操作: Before / After
①スタート
②抽出 & コピー
terraform state mv
terraform state pull
③移植
terraform state mv
④上書き
terraform state push
Before
After
35
Copyright @ 2022 by Future Corporation
.tfstate移植後の作業
36
Copyright @ 2022 by Future Corporation
応用: 複数リソースの一括移植
①スタート
②抽出 & コピー
「取り出す」操作は1つずつ
③移植
「入れる」操作は1つずつ
④上書き
37
Copyright @ 2022 by Future Corporation
まとめ
38
Copyright @ 2022 by Future Corporation
まとめ
39
Copyright @ 2022 by Future Corporation
推奨: 操作リハーサルの実施
`$ terraform state mv / push` はtfstateの更新操作のため、実施前のリハーサルを推奨します。
ex. ) Terraform to LocalStack
40
過去の勉強会資料
Future Tech Blog
Copyright @ 2022 by Future Corporation
参考・引用
41
Copyright @ 2022 by Future Corporation
42
Fin.
Copyright @ 2022 by Future Corporation