Skip to content

Commit 1de4550

Browse files
committed
terraform tips
1 parent eeea9b4 commit 1de4550

File tree

4 files changed

+209
-1
lines changed

4 files changed

+209
-1
lines changed

source/_posts/20250331a_Terraform連載2025を開始します.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ lede: "うららかな春の陽気と共に、2025年度がスタートしまし
5050
| 4/1(火) | 真野隼記さん | [最小権限の原則の実現を支援するPike触ってみる](/articles/20250401a/) |
5151
| 4/2(水) | 伊藤太斉 さん | Trivyを用いたTerraformでのセキュリティ戦略 |
5252
| 4/3(木) | 森友雅さん | [【Terraform】プロビジョニングとはなんぞや](/articles/20250403a/) |
53-
| 4/4(金) | 前原 応光さん | Terraform TIPS 集 |
53+
| 4/4(金) | 前原 応光さん | [Terraform TIPS 集](/articles/20250404a/) |
5454
| 4/7(月) | 大前七奈さん | Terraformでテーブル管理時のハマりどころ5選 |
5555
| 4/8(火) | 棚井 龍之介さん | TODO |
5656
| 4/9(水) | 伊藤太斉 さん | Terraform設計ガイドラインを公開しました(仮) |
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
---
2+
title: "Terraform TIPS 集"
3+
date: 2025/04/04 00:00:00
4+
postid: a
5+
tag:
6+
- Terraform
7+
- Tips
8+
category:
9+
- Programming
10+
thumbnail: /images/20250404a/thumbnail.png
11+
author: 前原応光
12+
lede: "Terraform を利用する中でこんな使い方があるのかってことを少しでも知ってもらえればと思い、TIPS 集を書いています。"
13+
---
14+
15+
<img src="/images/20250404a/terraform_tips.png" alt="" width="800" height="550">
16+
17+
# はじめに
18+
19+
TIG 前原です。[Terraform 連載2025](/articles/20250331a/)の4日目です。
20+
21+
Terraform を利用する中でこんな使い方があるのかってことを少しでも知ってもらえればと思い、TIPS 集を書いています。
22+
既にご存知の方も多い内容かもしれないですが、ご了承ください。
23+
24+
# TIPS 内容
25+
26+
今回、ご紹介する内容を以下に記載します。
27+
28+
* 詳細ログ出力の取得方法
29+
* プロバイダの確認コマンド
30+
* Terraform 実行中にロックがかかった場合
31+
* terraform plan -detailed-exitcode を使った差分チェック
32+
* リソースのタイアウト時間の調整
33+
* Terraform の並列実行
34+
35+
## 詳細ログ出力の取得方法
36+
37+
Terraform の挙動を細かく調査したいときに環境変数の設定をすることで、詳細なログを確認することができます。
38+
39+
```bash
40+
export TF_LOG=DEBUG
41+
```
42+
43+
Terraform apply をした時などにDEBUG レベルの詳細なログを確認することができます。
44+
また、ログをファイルとして保存したい場合は、以下で可能です。
45+
46+
```bash
47+
export TF_LOG=DEBUG
48+
export TF_LOG_PATH=./terraform.log
49+
```
50+
51+
### ログレベルによる利用用途について
52+
53+
各ログレベルでの利用用途についてです。
54+
55+
* DEBUG: Terraform の内部処理を確認
56+
* TRACE: プロバイダがクラウドのAPI に対して行ったリクエスト、レスポンスまで確認したい場合
57+
58+
## プロバイダの確認コマンド
59+
60+
現在、利用しているプロバイダのバージョンや参照元を確認できます。
61+
62+
```bash
63+
$ terraform providers
64+
65+
Providers required by configuration:
66+
.
67+
├── provider[registry.terraform.io/hashicorp/google] 6.23.0
68+
├── provider[registry.terraform.io/hashicorp/archive]
69+
└── provider[registry.terraform.io/hashicorp/google-beta]
70+
71+
Providers required by state:
72+
73+
provider[registry.terraform.io/hashicorp/archive]
74+
75+
provider[registry.terraform.io/hashicorp/google]
76+
```
77+
78+
## Terraform 実行中にロックがかかった場合
79+
80+
Terraform 実行中に異常終了するとバックエンド(S3 やGCS など)のState ファイルが`ロック`される時があります。
81+
`terraform force-unlock`を利用することで、強制的にロックを解除することができます。
82+
83+
例えば、以下のように`terraform plan`を実行しましたが、ロックがかかっているメッセージが出てきます。
84+
85+
```bash
86+
│ Error: Error acquiring the state lock
87+
88+
│ Error message: writing "gs://hoge/dev.tflock" failed: googleapi: Error 412: At least one of the
89+
│ pre-conditions you specified did not hold., conditionNotMet
90+
│ Lock Info:
91+
│ ID: 1743715123443466
92+
│ Path: gs://hoge
93+
│ Operation: OperationTypePlan
94+
│ Who: hoge
95+
│ Version: 1.10.0
96+
│ Created: 2025-04-03 21:18:43.090403 +0000 UTC
97+
│ Info:
98+
```
99+
100+
エラーで表示された`ID`を使い、ロックを解除します。
101+
102+
```bash
103+
terraform force-unlock <ID>
104+
```
105+
106+
本番環境などでロック解除を行う際は、他の作業者がTerraform を実行中でないことを必ず確認してください。誤ったロック解除はState ファイル破損や予期せぬトラブルにつながります。
107+
108+
## terraform plan -detailed-exitcode を使った差分チェック
109+
110+
Terraform をCI/CD 環境で利用しているときに`リソースの差分があるかどうか`を自動的に判定したいケースがあると思います。
111+
その時に役立つオプションとして`terraform plan`コマンドの`-detailed-exitcode`です。
112+
113+
### `-detailed-exitcode`とは
114+
115+
通常、Terraform コマンドの`plan`コマンドは、終了コードとして以下を返します。
116+
117+
* 0(成功): Terraform が正常に処理完了(差分があっても)
118+
* 1(エラー): Terraform に何らかのエラーを検知(構文エラーなど)
119+
120+
一方で、`-detailed-exitcode`を使用すると、Terraform の終了コードがより詳細になります。
121+
122+
* 0(差分なし): Terraform によるリソース更新がない
123+
* 1(エラー): Terraform に何らかのエラーを検知(構文エラーなど)
124+
* 2(差分あり): Terraform によるリソース差分が発生し、変更が必要なとき
125+
126+
実際にターミナルで確認する場合のコマンドは以下です。
127+
128+
```bash
129+
$ terraform plan -detailed-exitcode
130+
echo $? # 終了コード確認
131+
### 出力例
132+
2
133+
```
134+
135+
`-detailed-exitcode`をCI/CD のパイプラインに組み込むことで差分発生時のハンドリングが可能となります。
136+
以下は GitHub Actions のサンプルで、Terraform Plan 実行後に差分が検出された場合(終了コードが2)のみ、terraform apply を実行する フローです。
137+
138+
```yaml
139+
- name: Terraform Plan
140+
run: terraform plan -detailed-exitcode
141+
continue-on-error: true
142+
id: plan
143+
144+
- name: Terraform Apply
145+
if: steps.plan.outcome == 'failure' && steps.plan.exit-code == 2
146+
run: terraform apply -auto-approve
147+
```
148+
149+
## リソースのタイムアウト時間の調整
150+
151+
Terraform でリソース作成、削除するときに何かしらの理由で処理が長くなる時があります。
152+
そんな時に便利なのがTerraform の`timeouts`ブロックです。
153+
これを利用することで想定以上の時間が経過している時に`処理失敗`としてエラーにできます。
154+
例えば、以下のように設定することで最大40分まで待機し、処理がその時間内に完了しなければエラーとします。
155+
156+
```bash
157+
resource "google_sql_database_instance" "example_db" {
158+
name = "my-example-db"
159+
database_version = "POSTGRES_15"
160+
region = "asia-northeast1"
161+
162+
settings {
163+
tier = "db-n1-standard-4"
164+
disk_size = 1000
165+
166+
backup_configuration {
167+
enabled = true
168+
}
169+
}
170+
171+
# タイムアウトを明示的に調整
172+
timeouts {
173+
create = "40m" # 作成完了まで最大40分待機
174+
delete = "30m" # 削除完了まで最大30分待機
175+
update = "60m" # 更新完了まで最大60分待機
176+
}
177+
}
178+
```
179+
180+
* create: リソースの作成処理を待つ時間の最大値
181+
* delete: リソース削除処理を待つ時間の最大値
182+
* update: リソースの更新処理を待つ時間の最大値(必要に応じて設定)
183+
184+
## Terraform の並列実行
185+
186+
Terraform を使ってリソースを作成、更新などする際、リソース数が多いと適用に時間がかかることがあります。
187+
そんな時にTerraform が持つ並列実行のオプション(-parallelism)を活用すると、実行速度の改善が可能です。
188+
ユースケースとしては、大量のリソースを持つプロジェクトの初期構築時や、インフラ更新時間を短縮したい時に効果的です。
189+
190+
Terraform は、デフォルトで最大10リソースを並列(同時)に作成、更新します。
191+
192+
```bash
193+
### 並列数を30に指定した場合
194+
$ terraform plan --parallelism=30
195+
196+
### 環境変数でPlan の並列数を指定
197+
$ export TF_CLI_ARGS_plan="--parallelism=30"
198+
199+
### 環境変数でApply の並列数を指定
200+
$ export TF_CLI_ARGS_apply="--parallelism=30"
201+
```
202+
203+
並列数を大きくすると高速になりますが、API のレートリミットに引っかかる可能性があるため、20-30程度から試すのがおすすめです。
204+
205+
# さいごに
206+
207+
様々なTerraform のTIPS を記載しました。
208+
今回ご紹介したTIPSが少しでもお役に立てれば幸いです。
31.1 KB
Loading
9.57 KB
Loading

0 commit comments

Comments
 (0)