用自己的方式表达学习Terraform两个月后所掌握的内容(进阶篇)
使用的版本
- v0.12.16
目录
-
- remote stateについて
-
- 構造化について
-
- Standard Module Structurenについて
-
- コンポーネント化について
-
- 便利ツールについて
- 参考にするべきサイト
关于远程工作状态
通常情况下,每个项目都会创建一个tfstate文件,但也可以将其保存到提供程序的存储中。通过使用此功能,可以引用和使用存储在外部的其他terraform资源的输出。对于使用terraform创建的资源,建议基本上都使用远程状态来进行引用。
// 自身のリモートステートの置き場所を設定する
terraform {
backend "s3" {
region = "ap-northeast-1"
bucket = "dev-hoge-terraform"
key = "hoge-app.tfstate"
}
}
// 参照したいリモートステートを取得する
data "terraform_remote_state" "vpc" {
backend = "s3"
config = {
region = "ap-northeast-1"
bucket = "dev-hoge-terraform"
key = "hoge-vpc.tfstate"
}
}
// 使用例
resource "aws_security_group" "hoge_sg" {
vpc_id = data.terraform_remote_state.vpc.outputs.vpc_id
name = "hoge-security-group"
}
关于结构化
如果试图使用单个文件来编写Terraform,随着文件的变大,内容的可读性会变差,导致维护性下降。
hoge-terraform/
└── main.tf
因此,将除资源定义以外的内容分离到单独的文件中,如下所示。
hoge-terraform/
├── main.tf // resourceを格納するtfファイル
├── outputs.tf // 出力値(output)のみを格納するtfファイル
└── variables.tf // 入力値(variable)のみを格納するtfファイル
尽管有所改善,但一旦项目变得庞大,仅靠这一点远远无法清晰地看到内容。
因此,我们要通过使用module将多个资源分离开来。
hoge-terraform/
├── main.tf
├── modules
├── outputs.tf
├── rds // rdsに関連するリソースを格納する
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── security_groups // security_groupに関連するリソースを格納する
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── variables.tf
分割资源可以使项目即使规模变大,也能有更好的可预见性和更高的可维护性。这种将相关资源分割的方法称为结构化。
标准模块结构是什么?
标准化的模块实现方式是通过Terraform来完成。它由以下文件结构组成。
hoge-terraform/
├── README.md
├── main.tf
├── modules
├── outputs.tf
├── NestedA
│ ├── README.md
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── NestedB
│ ├── README.md
│ ├── main.tf
│ ├── outputs.tf
│ ├── NestedBB
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ └── variables.tf
└── variables.tf
标准模块结构的规则
-
- main.tf, variables.tf, outputs.tf
空であっても最低限用意すべきファイル
variablesとoutputsには明示的であってもdescriptionをつけておく(ドキュメント作成に必要)
README(ドキュメント)
以下の構成で書くことをおすすめする
モジュールの概要
使い方
入力値(variables)と出力値(outputs) 。
Nested modules
ネストしたモジュールはmodule配下にサブディレクトリとして作成する
组件化是什么意思?
简单来说,为了将Terraform的构建、更新和删除的影响范围最小化,将相关的资源分组,并为每个组保存一个tfstate文件。
-
- メリット
変更が最小限にできる
terraformの実行時間を減らすことができる
コンポーネント化で意識するべきこと
安定度
安定度とは変更の程度と依存される度合いを指す
安定度が高いと変更しづらく、他のコンポーネントから依存されるコンポーネントということになる。
安定度が高いコンポーネントはちゃんと分離するべき。
変動を想定したコンポーネントが、安定度の高いコンポーネント化に依存するようにする。
ステートフル
RDSやS3などのデータストアのことを指す。
資産として管理されているため、必ずステートフルなリソースは分離しておく。
循環依存
対象となるコンポーネントが互いに依存しきってしまうことをいう
どちらかが変更を行うと、その片方も影響を受けて壊れやすくなってしまう。
terraformには循環依存を検知する機能はないので、安定度が高いコンポーネントに依存させて上げることが重要。
我正在使用的工具是Terraform。
terraform docs
terraformのvariablesとoutputsの情報をもとにドキュメントを自動で生成してくれるツール
README作成にもってこい
ただ、最新版だと生成できない不具合があるみたいなので、対応されるまで待つのが吉
terraform ignore
ツールではないが、gitignoreのterraform用フォーマット
terraform-landscape
terraformのplanで表示される内容を整形してくれるツール。
参考来源的网站或书籍 de huò
-
- Terraform公式ドキュメント
-
- pragmatic terraform on aws
実践Terraform