😃
Terraformの基本を理解する
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