1 of 42

クラウドリソース自体をdestroy/createdせずに

Terraform定義の記述場所を変更する方法

Future Tech Night #20 Terraform State縛りの勉強会

2022年2月17日(木) 19:00 ~ 20:00

棚井 龍之介(タナイ リュウノスケ)

1

Copyright @ 2022 by Future Corporation

2 of 42

自己紹介

名前: 棚井 龍之介(タナイ リュウノスケ)

所属: フューチャー株式会社(新卒2019~)

技術: Go、AWS、Terraform

その他

  • 筋トレ, 7ヶ月目(BIG3: 合計重量 410kg)
  • Gold’s Gym近くの、Nuro光物件に引越し

2

Copyright @ 2022 by Future Corporation

3 of 42

本日のテーマ

  • tfstate操作による、Terraform定義のリファクタリング
    • 動作中のクラウドリソースには影響を与えずに
    • Terraformコードの記述場所を変更する

3

Copyright @ 2022 by Future Corporation

4 of 42

本日のテーマ

4

Copyright @ 2022 by Future Corporation

5 of 42

Agenda

  1. Terraform運用で初心者を脱する瞬間
  2. Stateの基本知識
  3. .tfstateの移植操作

5

Copyright @ 2022 by Future Corporation

6 of 42

Terraform運用で初心者を脱する瞬間

6

Copyright @ 2022 by Future Corporation

7 of 42

terraform init / plan / apply では対応できない問題

  • 手動で作成したリソースを、Terraformに取り込みたい
  • 既にTerraformでリソースを作成したが、運用上の問題が発生したため、リソースの記述場所を変更したい

7

Copyright @ 2022 by Future Corporation

8 of 42

terraform init / plan / apply では対応できない問題

  • 手動で作成したリソースを、Terraformに取り込みたい
  • 既にTerraformでリソースを作成したが、運用上の問題が発生したため、リソースの記述場所を変更したい

$ terraform import

$ terraform state [ list / show / pull / mv / push ]

8

Copyright @ 2022 by Future Corporation

9 of 42

今回フォーカスする問題

  • Terraform記述場所を、別のディレクトリに移動したい

ただし、

.tfの中身を「cut & paste」すると、リソースは再作成される

データベースや24/365稼働インスタンスだと、再作成はNGである

リソースを再作成せずに、Terraform記述を移動させる

9

Copyright @ 2022 by Future Corporation

10 of 42

今回フォーカスする問題

  • Terraform記述場所を、別のディレクトリに移動したい

ただし、

.tfの中身を「cut & paste」すると、リソースは再作成される

データベースや24/365稼働インスタンスだと、再作成はNGである

10

Copyright @ 2022 by Future Corporation

11 of 42

リソースを再作成せずに、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

12 of 42

Stateの基本知識

12

Copyright @ 2022 by Future Corporation

13 of 42

Stateの基本知識: 目次

  • Stateファイルの目的
  • tfstateファイルの生成/更新タイミング
  • tfstateの中身/項目
  • 複数ディレクトリで `$ terraform init`した場合
  • `$ terraform refresh`について

13

Copyright @ 2022 by Future Corporation

14 of 42

Stateファイルの目的

Purpose of Terraform State

  • Mapping to the Real World / 実リソースとコード定義が1対1になる
  • Metadata / リソース依存状況を記録、更新時の影響範囲を特定
  • Performance / キャッシュの活用、プロバイダーのAPI制限対策
  • Syncing / Remote State(クラウドBackend)による複数人作業

※ Performanceの例: `-target`, `refresh=false`

14

Copyright @ 2022 by Future Corporation

15 of 42

tfstateファイルの生成/更新タイミング

`$ terraform apply`の

  • 初回実施: 新規作成
  • 2回目以降: 更新

クラウドストレージ(S3など)をbackendに指定した場合は、

`$ terraform init` 実行時にbackendへの疎通が確認され、問題なければ以降の plan / apply /destroy操作での参照 / 更新先として設定される

15

Copyright @ 2022 by Future Corporation

16 of 42

tfstateの中身/項目

`$ terraform state pull` で参照可能

  • version: tfstateのフォーマット番号
  • terraform_version: 利用中のterraformバージョン
  • serial: tfstateの更新回数、applyごとにインクリメント
  • lineage: init実行時に付与されるUUID
  • resources: クラウドリソース状態の記録

tfstateのリファクタリング

≒ resourcesの「cut & paste」

16

Copyright @ 2022 by Future Corporation

17 of 42

複数ディレクトリで `$ 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

18 of 42

`$ terraform refresh` について

  • 実リソースの状態を正として、tfstateを更新する
    • 実行前に影響範囲を確認できないため、このコマンド自体は`公式非推奨`
    • 使いたいときは、 `$ terraform plan -refresh-only` → `yes`入力
  • `$ terraform plan`や`$ terraform apply`時に、裏で自動実行されている
    • v0.15からは、plan結果で通知される

実リソースを手動操作(例えば、Lambdaの環境変数を変更)した時は、このコマンドで変更内容をtfstateに取り込める

18

Copyright @ 2022 by Future Corporation

19 of 42

Stateの基本知識: 目次(再掲)

  • Stateファイルの目的
  • tfstateファイルの生成/更新タイミング
  • tfstateの中身/項目
  • 複数ディレクトリで `$ terraform init`した場合
  • `$ terraform refresh`について

19

Copyright @ 2022 by Future Corporation

20 of 42

Terraformでplan差分が生じるのは、どういうとき?

20

Copyright @ 2022 by Future Corporation

21 of 42

Terraformでplan差分が生じるのは、どういうとき?

以下3つで、定義内容に乖離が生じたとき

  • Terraform定義ファイル(.tf)
  • tfstateファイル(.tfstate)
  • クラウドで稼働する実リソース(aws, gcp, など)

21

Copyright @ 2022 by Future Corporation

22 of 42

差分解消方法(1/3)

  • Terraform定義ファイル(.tf)[リソース定義を更新]
  • tfstateファイル(.tfstate)
  • クラウドで稼働する実リソース(aws, gcp, など)

[方法]

最も基本的なリソース追加/更新/削除作業

`$ terraform plan`, `$ terraform apply` により、リソースを追加/更新/削除する

22

Copyright @ 2022 by Future Corporation

23 of 42

差分解消方法(2/3)

  • Terraform定義ファイル(.tf)
  • tfstateファイル(.tfstate)
  • クラウドで稼働する実リソース(aws, gcp, など)[手動更新]

[方法]

`$ terraform plan -refresh-only`で、実リソースから .tfstateに取り込む

.tfファイルを編集して、実リソース定義に合わせる

23

Copyright @ 2022 by Future Corporation

24 of 42

差分解消方法(3/3)

  • Terraform定義ファイル(.tf)
  • tfstateファイル(.tfstate)[???]
  • クラウドで稼働する実リソース(aws, gcp, など)

[方法]

.tfstateの更新内容を、.tfと実リソースに反映する方法???

そもそも、なぜ、.tfstateが更新された?

24

Copyright @ 2022 by Future Corporation

25 of 42

.tfstate編集が必要になるタイミング

「リソースを再作成せずに、Terraform記述を移動する」には、

tfstateファイルを「適切に編集」しなければならない

25

Copyright @ 2022 by Future Corporation

26 of 42

.tfstate編集の選択肢

  1. 手動で直接編集する(公式非推奨)
  2. `$ terraform state` コマンド経由で編集する ← 今回はこちら

26

Copyright @ 2022 by Future Corporation

27 of 42

.tfstateの移植操作

27

Copyright @ 2022 by Future Corporation

28 of 42

前提条件とやりたいこと

前提条件

  • Terraform定義の記述場所を移動する
  • .tfの記述場所を変更してapplyすると、destroy/createdにより「再作成」される
  • DB、24/365稼働サービスのため、再作成は許されない

やりたいこと

  • リソースを再作成せずに、Terraformの記述場所を移動させたい

28

Copyright @ 2022 by Future Corporation

29 of 42

Terraform用語に変換すると

(スタートの状態を「構成A」、tfstate移植後を「構成B」とする)

  • 構成Aにてplan差分が出ないことを確認した後、「適切な移植操作」を実行し、構成Bにおいてもplan差分が出ない状況にする
  • 「適切な移植操作」には、実リソースの更新作業は含まれない
  • 「適切な移植操作」は、.tf / .tfstate の編集のみとする

29

terraform/

resources/

├ ec2.tf

└ s3.tf

terraform/

resources/

| └ ec2.tf

└ data/

└ s3.tf

①plan差分なし

適切な移植操作

③plan差分なし

終了

構成A

構成B

Copyright @ 2022 by Future Corporation

30 of 42

.tfstateの移植操作: 図で操作イメージを把握

①スタート

②抽出 & コピー

terraform state mv

terraform state pull

③移植

terraform state mv

④上書き

terraform state push

30

Copyright @ 2022 by Future Corporation

31 of 42

.tfstateの移植操作: ①スタート

(用語定義)

  • A, B: tfstateファイル
  • a: tfstateファイル内の、resourcesの1つ
  • backend: tfstateファイルの保存場所
  • local: 作業場所, `$terraform state` の実行環境

(ディレクトリ想定)

├ dir_A/

| └ main.tf [null_resource.a, apply済み]

└ dir_B/

└ main.tf [apply済み]

(作業目標)

  • dir_A/main.tf の「null_resource.a」を、dir_B/main.tf に移植する

31

Copyright @ 2022 by Future Corporation

32 of 42

.tfstateの移植操作: ②抽出 & コピー

[取り出す]

  • backendのtfstateから、移植したいリソースを取り出す
  • コマンド実行後、取り出したリソースの記述は、backendのtfstateから消える

$ terraform state mv -state-out=local_a.tfstate \

null_resource.a null_resource.a(at dir_A/)

[コピーする]

  • backendのtfstateを、ローカルに複製する

$ terraform state pull > local_B.tfstate(at dir_B/)

32

Copyright @ 2022 by Future Corporation

33 of 42

.tfstateの移植操作: ③移植

[入れる]

  • ローカル環境にて、対象リソースを移植する
  • コマンド実行後、移植元の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

34 of 42

.tfstateの移植操作: ④上書き

[上書きする]

  • ローカルのtfstateで、backendのtfstateを上書きする

$ terraform state push local_B.tfstate(at dir_B/)

34

Copyright @ 2022 by Future Corporation

35 of 42

.tfstateの移植操作: Before / After

①スタート

②抽出 & コピー

terraform state mv

terraform state pull

③移植

terraform state mv

④上書き

terraform state push

Before

After

35

Copyright @ 2022 by Future Corporation

36 of 42

.tfstate移植後の作業

  • tfstateの移植状況に合わせて、Terraformコードを「cut & paste」する
  • 移植元、移植先のディレクトリで `$ terraform plan` を実行し、差分検知されないことを確認する

36

Copyright @ 2022 by Future Corporation

37 of 42

応用: 複数リソースの一括移植

①スタート

②抽出 & コピー

「取り出す」操作は1つずつ

③移植

「入れる」操作は1つずつ

④上書き

37

Copyright @ 2022 by Future Corporation

38 of 42

まとめ

38

Copyright @ 2022 by Future Corporation

39 of 42

まとめ

  • Plan差分は、以下3つの定義内容で乖離したときに発生する
    • Terraform定義ファイル(.tf)
    • tfstateファイル(.tfstate)
    • クラウドで稼働する実リソース(aws, gcp, その他)

  • 適切な操作により、任意のPlan差分を解消可能である

39

Copyright @ 2022 by Future Corporation

40 of 42

推奨: 操作リハーサルの実施

`$ terraform state mv / push` はtfstateの更新操作のため、実施前のリハーサルを推奨します。

ex. ) Terraform to LocalStack

40

過去の勉強会資料

Future Tech Blog

Copyright @ 2022 by Future Corporation

41 of 42

参考・引用

41

Copyright @ 2022 by Future Corporation

42 of 42

42

Fin.

Copyright @ 2022 by Future Corporation