Skip to content

Commit 78fe44b

Browse files
authored
Terraform設計ガイドライン: fix typo (#45)
* Terraform設計ガイドライン: fix typo * Update documents/forTerraform/terraform_guidelines.md
1 parent a8df374 commit 78fe44b

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

documents/forTerraform/terraform_guidelines.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,7 +1596,7 @@ AWS、Google Cloud、Azureなどクラウドでは新機能が活発にリリー
15961596

15971597
| # | (1)Terraform以外の手段で凌ぐ | (2)terraform_dataとlocal-exec |
15981598
| :--------- | :------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------- |
1599-
| 説明 | Provider側の対応ができるまで、管理コンソール上・Ansibleなどで管理する。Provider側が対応したら、過渡期対応のスクリプトを削除する | Terraformの `terraform_data``local-exec` プロビジョナを利用し、スクリプトを実行してリソースを作成・管理する |
1599+
| 説明 | Provider側の対応ができるまで、シェルスクリプト・Ansibleなどで管理する。Provider側が対応したら、過渡期対応のスクリプトを削除する | Terraformの `terraform_data``local-exec` プロビジョナを利用し、スクリプトを実行してリソースを作成・管理する |
16001600
| 構築コスト | ✅️構築の難易度が最も低く、急ぎ利用可能 | ❌️Terraformのお作法に沿ったスクリプト設計が必要(destoryも実装するなど) |
16011601
| 運用性 | ❌️インフラ構築がTerraformだけに閉じず学習コストや、運用手順書などのマニュアル化が求められる | ✅️Terraformで一元管理が可能で、運用コストを下げられる |
16021602
| 学習コスト | ❌️Ansibleなどを利用する場合は、学習コストがかかる | ⚠️terraform_dataの理解が必要 |
@@ -1614,7 +1614,7 @@ AWS、Google Cloud、Azureなどクラウドでは新機能が活発にリリー
16141614
| 1 | 実行コマンドが複数行になる場合は、別ファイルに切り出す | 複数行に及ぶ場合は、ヒアドキュメントではなく、スクリプトとして切り出す。1行のコマンドだけであれば、埋め込んでも良いが、オプションが長くなると可読性が長くなるため、別ファイル化を推奨する |
16151615
| 2 | スクリプトの格納場所 | `{.tfファイルがあるディレクトリ}/scripts/` 配下に統一 |
16161616
| 3 | ファイル名 | 作成: `create_xxx_resource.sh` 削除: `delete_xxx_resource.sh` |
1617-
| 4 | 権限 | 実行権限を忘れないこと。特にWindowsユーザはGit上で権限情報もコミットすること。 git update-index --add --chmod=+x [filename] |
1617+
| 4 | 権限 | 実行権限を忘れないこと。特にWindowsユーザはGit上で権限情報もコミットすること。 `git update-index --add --chmod=+x [filename]` |
16181618
| 5 | スクリプトのLinter | スクリプトには[ShellCheck](https://future-architect.github.io/articles/20210329/)などの静的解析をかける |
16191619
| 6 | terraform_data | `terraform_data` の命名は一貫性を持たせる。例えば、`custom_xxx_resource` など |
16201620
| 7 | パラメータは環境変数を利用 | スクリプトに渡すパラメータは、環境変数として渡す |
@@ -1661,7 +1661,7 @@ terraform_dataはTerraform 1.4で追加された機能で、null_resourceと機
16611661

16621662
その時点の最新バージョンを利用すること。
16631663

1664-
## バージョン固定
1664+
## バージョン固定
16651665

16661666
Terraform上で管理すべきバージョンは以下2種類存在する。
16671667

@@ -1694,7 +1694,7 @@ terraform {
16941694

16951695
チーム編成にも寄るが、クラウドインフラは複数のチームを横断的に対応することも多く、チームごとにTerraformのバージョンアップの追随ポリシーが異なることもあるので、バージョン管理ツールを導入することがベターである。
16961696

1697-
バージョン管理については[tfenv](https://github.com/tfutils/tfenv)[tenv](https://github.com/tofuutils/tenv)を用いることが多い。どちらも `.terraform-version` ファイルに以下のようにバージョンを記載することで、利用バージョンを固定する(tfenvを全員がインストールしていれば、バージョンを上げてtfenv上で新しいバージョンのTerraformのインストールを行ってくれる)ことができる。
1697+
バージョン管理については[tfenv](https://github.com/tfutils/`tfenv`)[tenv](https://github.com/tofuutils/tenv)を用いることが多い。どちらも `.terraform-version` ファイルに以下のようにバージョンを記載することで、利用バージョンを固定する(`tfenv`を全員がインストールしていれば、バージョンを上げて`tfenv`上で新しいバージョンのTerraformのインストールを行ってくれる)ことができる。
16981698

16991699
▼.terraform-version の例
17001700

@@ -1708,9 +1708,9 @@ terraform {
17081708
- 実際に利用するバージョンは `.terraform-version` で制御するため、同期を取ることで不要な混乱を防ぐ
17091709
- メンバー間やCI・ローカル環境間で、パッチバージョン違いによる挙動の差を無くす
17101710
- メジャー、マイナー、パッチのどのバージョンアップでも、 `required_version``.terraform-version` の両方を変更するという運用で統一するため(パッチバージョンアップの場合は、 `required_version` の変更はしなくても良い、とすると手順漏れが出やすいため
1711-
- Windowsの場合はWSL上で開発する方針であることかつ、OpenTofuを利用しない場合は、枯れたtfenvを利用する
1712-
- tfenv自体を更新する作業が発生した場合に面倒であるため、枯れた方が管理上、利便性が高い場面が多いため
1713-
- tfenvで困るケース~~~~の場合は、tenvを導入する
1711+
- Windowsの場合はWSL上で開発する方針であることかつ、OpenTofuを利用しない場合は、枯れた`tfenv`を利用する
1712+
- `tfenv`自体を更新する作業が発生した場合に面倒であるため、枯れた方が管理上、利便性が高い場面が多いため
1713+
- `tfenv`で困る場合は、`tenv` を導入する
17141714

17151715
### 2. Providerのバージョン管理
17161716

@@ -1974,7 +1974,7 @@ AWSでterraform planのみ実行できるようにする例を示す。ReadOnlyA
19741974
- 全てのデプロイメント環境において、ローカルPCでの `terraform apply` 操作は原則禁止として、(2)の踏み台サーバでの実行を基本とする
19751975
- IP制限や証跡を残すことで、リスク軽減や緊急時対応を可能とする
19761976
- (2)の踏み台サーバはterraformの実行のみを許可し、他の作業では利用しない環境とする
1977-
(applyが実行できる権限はとても強い権限を持つため、当該サーバの利用はterraform用途のみとし、他用途で利用されてないかの監視が必須なため。そのため、できるだけCI/CDを利用することを推奨する)
1977+
(applyが実行できる権限はとても強い権限を持つため、当該サーバの利用はTerraform用途のみとし、他用途で利用されてないかの監視が必須なため。そのため、できるだけCI/CDを利用することを推奨する)
19781978
- ローカルPC上は、dev環境でのplan操作のみ許容する
19791979
- 開発生産性のため
19801980
- CI/CD上でのplan、applyは開発生産性の観点で、できる限り取り入れる。これ1本に統一することは必須ではない
@@ -2097,7 +2097,7 @@ TF_WORKSPACE=dev tflint
20972097

20982098
## コミットフック
20992099

2100-
[Style Guide](https://developer.hashicorp.com/terraform/language/style#code-style)に、コミット前に [Git pre-commit hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)`fmt``validate` の実施が推奨とある。その他のリンターを加えると、待ち時間が長くなるため、最低限にする。validateの場合のworkspace設定はdevのみに絞る
2100+
[Style Guide](https://developer.hashicorp.com/terraform/language/style#code-style)に、コミット前に [Git pre-commit hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)`fmt``validate` の実施が推奨とある。その他のリンターを加えると、待ち時間が長くなるため、最低限にする。validateは実行速度が気になる場合はdevのみに絞っても良い
21012101

21022102
▼コミットフックで実行するコマンド例
21032103

@@ -2137,7 +2137,9 @@ terraform apply --target={aws_instance.example1,aws_security_group.example2,aws_
21372137
推奨は以下の通り。
21382138

21392139
- featureブランチからterraform applyをするGitブランチ運用になっている場合、dev環境においては、target運用を許容する
2140-
- いかなる場合も、stg/prod環境では、targetによる絞り込みは許可しない
2140+
- 原則、stgはtargetによる絞り込みを許可しない
2141+
- stgで動作確認を長期間行う必要がある場合など一時的とし、恒常的な運用としない
2142+
- いかなる場合も、prod環境では、targetによる絞り込みは許可しない
21412143
- コードベースとインフラリソースの一貫性を重視する。もし、applyしたくないリソースがコミットされていれば、それを削除する方があるべきである
21422144

21432145
::: tip for_eachのリソースを指定する場合、
@@ -2146,7 +2148,7 @@ terraform apply --target={aws_instance.example1,aws_security_group.example2,aws_
21462148

21472149
# リポジトリ構成
21482150

2149-
[バージョン管理に関するベスト プラクティス | Terraform | Google Cloud](https://cloud.google.com/docs/terraform/best-practices/version-control?hl=ja#team-boundaries) に記載がある通り、リポジトリはチームの境界に基づいて設計されるべきで、「承認要件と管理要件が異なる構成は、異なるソース管理リポジトリに分割する」という原則がある。
2151+
[バージョン管理に関するベスト プラクティス | Google Cloud](https://cloud.google.com/docs/terraform/best-practices/version-control?hl=ja#team-boundaries) に記載がある通り、リポジトリはチームの境界に基づいて設計されるべきで、「承認要件と管理要件が異なる構成は、異なるソース管理リポジトリに分割する」という原則がある。
21502152

21512153
一般的に、Terraformを含んだコードのリポジトリ構成には次の案がある。
21522154

@@ -2201,7 +2203,7 @@ infrastructure # アプリケーションコードとリポ
22012203

22022204
- `.gitignore` は原則、 [Terraform.gitignore](https://github.com/github/gitignore/blob/main/Terraform.gitignore) の内容を利用する
22032205
- `terraform.lock.hcl``.gitignore` に追加し、Git管理対象外とする
2204-
- 「バージョン固定」章のとおり、パッチバージョンまでバージョンを明示的に固定する方針のため、ロックファイルをチームで共有する強い理由が存在しないため
2206+
- [バージョン固定](#バージョン固定)章のとおり、パッチバージョンまでバージョンを明示的に固定する方針のため、ロックファイルをチームで共有する強い理由が存在しないため
22052207
- 上記の前提として、バージョン管理が適切ではないProviderやModuleなどを利用しないこと
22062208

22072209
# 参考

0 commit comments

Comments
 (0)