用自己的方式表达学习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

广告
将在 10 秒后关闭
bannerAds