😸

Terraformに今更入門したメモ

2021/01/05に公開

CLI でクラウドにマシンなどを建てたいなーと思ったときに使える選択肢として Terraform があるなと思ったので、とりあえず触って見たメモ。

Terraform が何か、については IaC(Infrastructure as Code) を実現するためのツールの 1 つくらいの認識。

試してるリポジトリ

https://github.com/yumechi/terraform-suburi

環境

  • Ubuntu 20.04 on WSL2
  • terraform version は 0.14.3
  • Windows build version は 2004、ビルド番号が 21277.1000 (Windows insider program の Dev チャンネルに合わせている)

公式サイト

https://www.terraform.io/

チュートリアルは下記。結構充実してそうなので、 AWS Get Started を進めてみる。

https://learn.hashicorp.com/terraform

AWS Get Started やってみた

動画コンテンツもついてるけど、ドキュメントだけでも進めていけそうなので断片的にメモを取りながら。

インストール

https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started

WSL2 の場合は Linux のインストール方法と同様になる。

なので GPG key を設定して、インストールする。インストールしたらとりあえず、 -help plan とか -version でも確認してみる。

❯ terraform -version
Terraform v0.14.3

次に Docker を使って動かしてみる(この時まで Docker コンテナも作れるのを知らなかった)。

Docker Desktop for Windows が設定してあれば、チュートリアルどおりにコマンドを実行すれば動くはず。

チュートリアル通りやってもつまらないので、適当に ports の external を 8020 に変更した。

そのうえで terraform init し、 terraform apply したら、 http://localhost:8020 をブラウザで見て nginx の表示画面が見れるはず。

docker ps で見ると nginx のコンテナが立っているのがわかるはず。

コンテナを止めるには terraform destroy を実行する。 destroy する前に docker stop とかでコンテナを止めてしまうと、エラー表示になるので注意。

terraform で操作したものは terraform でなんとかしましょうってことっぽい。

AWS EC2を立ててみる

https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started

事前に AWS CLI の設定が必要。自分は 99designs/aws-vault を導入するときにいろいろやったので、用意済み。

これもチュートリアル通りに進めたが、 ami の設定値がよくわからないので調べてみると、 EC2 のインスタンスのイメージのことらしい(ami = Amazon Machine Image)。

下記のサイトを確認したところ、チュートリアルで指定されている ami が Ubuntu 16.04 だったので、 ap-northeast-1(東京リージョン)の Ubuntu 20.04 を指している ami-0f2322bff98877761 に変更する。
ついでに region も ap-northeast-1 に変更する。

https://cloud-images.ubuntu.com/locator/ec2/

その状態で terraform initterraform apply を実行して EC2 の管理画面を表示したら無事にできていた。

あとは format, validation, state などのコマンドを試してみる。 terraform.tfstate というファイルが重要らしい。

それと pre-commit フックで何かしたほうが楽そうなので、調べてみたら下記のリポジトリを見つけたので、そのうち試したい。

https://github.com/antonbabenko/pre-commit-terraform

マイグレーション

https://learn.hashicorp.com/tutorials/terraform/aws-change?in=terraform/aws-get-started

ここでマイグレーション試すなら、さっき東京りーぞんで最新版のやつにしなくてもよかったな…

設定を変更したうえで apply しなおすことによって、マイグレーションを行うことも可能。

変更がある場合は apply 時に diff が出るので、ちゃんと見てればわかりそう。 +/- で示されるものが破棄して再作成され、 ~ で示されるものはその場で更新されるものらしい。

ただこのチュートリアルの場合、削除→作成なので、この間の処理とか全部こけそうな気がするけど大丈夫なのかちょっと心配。

まあ OS image のマイグレーションとかそうそう行わない気がするので、ほかの設定値を変えたときに明らかに止まりすぎるとかなければ、オンライン実行で問題ないかなと思っている。

リソースの削除

https://learn.hashicorp.com/tutorials/terraform/aws-destroy?in=terraform/aws-get-started

既に前のチュートリアル等でも試したが、 terraform destory でリソースが削除できる。

本番環境でリソースを破棄することはまずないと思うが、検証環境など頻繁に構成が変わる場所ではリソースの削除が必要となるシーンもあるので、覚えておく。

現状個人でお試しする程度なので、無駄なお金を払わないためにも忘れずに削除しておきたい。

変数を利用する

https://learn.hashicorp.com/tutorials/terraform/aws-variables?in=terraform/aws-get-started

利便性を上げるために設定値にパラメーターを活用する。

変数を設定するファイルを分けることや、コマンドラインからパラメーターを設定することも可能である。

ただし *.tfvars を使った変数宣言と利用は少し癖があるように思った。下記のように tfvars ファイルに記載した場合

region = "ap-northeast-1"

使用する変数名を *.tf ファイル側で宣言する必要がある。

variable region {}

この状態で terraform apply すると var.region に ap-northeast-1 がセットされる。

-var-file を使って上書きする場合は region = "us-west-1" などと production.tfvars に書いて、CLI で上書きする

terraform apply -var-file="production.tfvars"

TF_VAR_nantoka を環境変数としてセットすると、環境変数側から値を得ることもできるらしい(あまり試す気がなかったので、未検証)。

変数の詳細に関してはあとでこの辺を見る。

https://www.terraform.io/docs/configuration/variables.html#suppressing-values-in-cli-output

list や map を使うこともできるらしい。

試しに下記のように tf ファイルに書いて、読みだしてみた。

# 書き込み
variable "ubuntu2004" {
  type = map(string)
  default = {
    "ap-northeast-1" = "ami-0f2322bff98877761"
    "us-west-2"      = "ami-0c007ac192ba0744b"
  }
}

# 読み込み
  ami           = var.ubuntu2004[var.region]

あとは apply した際に表示する値として output を定義できる。とりあえず手元では ami とか region とかを出してみた。

実行結果の Output を見る

https://learn.hashicorp.com/tutorials/terraform/aws-outputs?in=terraform/aws-get-started

特筆すべき点はなく、やってみたら動いたなー程度。

この章自身も短く、説明もあまりないので特に気になるところもなかった。

terraform output nantoka を困ったら見よう、くらいかも。

リモートの状態を保存する(また今度)

https://learn.hashicorp.com/tutorials/terraform/aws-remote?in=terraform/aws-get-started

チーム作業を行うにあたり、ローカルの情報だけでなく立ち上がっているサーバーに共有している情報を使いたいときもある、というのがこの機能のニーズ。API トークン等に活用が可能。

なんだけれども、このチュートリアルでは Terraform Could に保存した値を活用するため、 Terraform Cloud のセットアップが事前に必要。

なので Terraform Could のチュートリアルを触ってみてからまた試そうかなと思います。

感想

EC2 が手元で設定書いてそれを反映したら起動する、っていうのはとても体験的に良かったです。

あとこのあたりをやりたいかも?

  • 設定から複数台起動する
  • セキュリティグループやキーペアを指定して起動する
  • (AWS を使わなくてもよい時はローカルでやりたいので)Docker 上でもっと使う

あと Terraform Cloud は何ができるのかよくわからないので、そちらのチュートリアルをやってみたらまたメモを上げようかなと思います。

Discussion