😃

Terraformの基本を理解する

2023/10/25に公開

Terraformとは

  • Terraformは、IaC(Infrastructure as Code)を実現するツール
  • クラウドやオンプレのリソースをconfiguration fileに定義してデプロイすることができる
  • Terraformはプロバイダーから提供されるAPIを通じてプラットフォーム上にリソースをデプロイする

Terraformのメリット

  • Terraformは様々なプロバイダーに対応しているため、プロバイダーを横断したリソースの管理が可能。
    • 一番のメリットはこれかなと思います。最近だとマルチクラウドの構成が多いため、構成や運用が煩雑になりがちですが、共通の構文で一元管理できるのは 大きなメリットだと感じました。
    • 公式サイトを見てみると、現在3,629のプロバイダに対応していると書いてありました。
  • 他のメリットは他のIaCと似たような感じ

Terraform Language

Modules

  • The Root Module
    • ルートディレクトリの.tfファイル
    • 全てのTerraformのconfigurationは少なくとも1つのルートモジュールを持っている
  • Childe Modules
    • Terraformのモジュールは他のモジュールを呼び出すことができ、呼び出される側のモジュールは"child module"という
  • Publised Modules
    • Terraform Registryで公開されているモジュール
    • 誰かが作ったモジュールを使うこともできるし、自分で公開することもできる
    • module call blockで適切にソースを指定したら、あとはTerraformが裏側で自動的にダウンロードして良い感じにしてくれる
    • organization内でモジュールをシェアしたりもできるみたい。

How to use Modules?

  • モジュールはmodule blocksというものを使って呼び出される
  • 呼び出す際は、引数に値を設定する
    • ↓のコードのsourceとserversがinput variables
module "servers" {
  source = "./app-cluster"

  servers = 5
}
  • モジュールを呼び出しているモジュールはcalling moduleと呼ぶ
  • module block内の引数
    • source:全てのモジュールで必須の引数。ローカルのモジュールのパスまたは、Registryのモジュールのパス
    • version:registryからのモジュールの場合は、設定することが推奨されている引数。モジュールのバージョンを指定する。
    • 他にも全てのモジュールで使用できる引数が何個かある(for_each や depends_onなど)
    • モジュール内で宣言されているリソースはカプセル化されているので、呼び出し元のモジュールは基本的に呼び出し先の属性にアクセスすることはできない。しかし、output valuesとして宣言することでアクセスすることができる。
output "instance_ip_addr" {
  value = aws_instance.server.private_ip
}

Variable

Input variables

  • 引数のようなもの
    • root moduleの場合はCL
  • variable block内で宣言する
    • ↓のような形で変数のtypeや、defaultを指定することができる。
variable "image_id" {
type = string
}

variable "docker_ports" {
  type = list(object({
    internal = number
    external = number
    protocol = string
  }))
  default = [
    {
      internal = 8300
      external = 8300
      protocol = "tcp"
    }
  ]
}

Discussion