Help us understand the problem. What is going on with this article?

Terraformを2ヶ月学んで覚えたことを自分なりにoutputする(応用編)

使用バージョン

  • v0.12.16

目次

  • remote stateについて
  • 構造化について
  • Standard Module Structurenについて
  • コンポーネント化について
  • 便利ツールについて
  • 参考にするべきサイト

remote stateについて

tfstateは通常、各プロジェクトに作られるが、providerのストレージに保存することもできる
この機能を使って外部に保存している他のterraformのリソースのoutputを参照し、利用することが可能。
terraformで作成したリソースについては基本remote stateを参照することをおすすめする。

// 自身のリモートステートの置き場所を設定する
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

このように分離していくと、プロジェクトが大きくなっても見通しが良くなり、メンテナンス性が上がる。
このように関連するリソースを分割していくことを構造化という。

Standard Module Structureとは

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

Standard Module Structureのルール

  • 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で表示される内容を整形してくれるツール。

参考にしたサイトまたは書籍

Ago0727
web系の言語を勉強中 主に発生したエラーについて記述しています.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした