terraform
メリット
再実行が容易
これをやらないと、たとえばAWSのconsoleで手動で設定する必要があり、管理できなくなる
読みやすい
GUIのどこに何があったっけ?ってならない
Platform agnostic
最近のDCはマルチクラウド
抽象化されているので複数のproviderで同じようにかける
実行計画がわかる
terraform plan
本番と同じような構成の開発環境を簡単に作れる
ディザスタリカバリ
概要
宣言的にconfiguarion fileを書くと、各種クラウドサービスでその通りにリソースを構築してくれる
https://gyazo.com/b160b755fa4d625b64f3874427013f51 https://medium.com/@steve_strutt/developing-a-public-terraform-provider-part-3-a72cf7fc12c6
学習する
Docker上にnginxを構築する
terraformを構造化する
local 定数
自己参照できる
code:tf
locals {
required_tags = { // 定数
project = var.project_name,
environment = var.environment
}
// variable resource_tags { } とマージ
tags = merge(var.resource_tags, local.required_tags)
}
local.tagsで参照できる
変数 variable ブロック
モジュールの中ではユニーク
値を外部から与えられる
モジュール間の変数の共有はできない(2019年12月)
the sharing of variables between modules is against terraform core clarity/explicity principles.
2016年のterraformのメンバーのコメント
In general we're against the particular solution of Global Variables, since it makes the input -> resources -> output flow of Modules less explicit, and explicitness is a core design goal.
configuration fileをフォーマットしてくれる
The terraform init command is used to initialize a working directory containing Terraform configuration files. This is the first command that should be run after writing a new Terraform configuration or cloning an existing one from version control. It is safe to run this command multiple times.
configurationファイルがない場所で実行するとエラーになる
code:zsh
$ terraform init
Terraform initialized in an empty directory!
The directory has no Terraform configuration files. You may begin working
with Terraform immediately by creating Terraform configuration files.
再度initするときには、moduleは追加したものは入るが、すでにあるものは上書きされない
The terraform get command is used to download and update modules mentioned in the root module.
The modules are downloaded into a .terraform subdirectory of the current working directory.
Module?
A module is a container for multiple resources that are used together.
.tfとか.tf.jpsonのコレクションから構成される
"configuration packages"と表現されている
Modules can be used to create lightweight abstractions, so that you can describe your infrastructure in terms of its architecture, rather than directly in terms of physical objects.
For example, aws_instance and aws_elb are both resource types belonging to the AWS provider. You might use a module to represent the higher-level concept "HashiCorp Consul cluster running in AWS" which happens to be constructed from these and other AWS provider resources.
module blockを使って他のモジュールを呼ぶことができる
Backend
バックエンドのoperationの実行手順が書いてあるファイル