Open3

Terraformを学習する

UgoUgo

1章

なぜTerraformを使うのか

手動マージ時代は、コンフリクトの嵐になりがちだった。

それをDevOpsというムーブメントのおかげで、コードを書くアプリケーションチームと、デプロイを担当する運用チームの協力が行われることになった。

そして、次第にそれはコードで表現したものに移行し、IaCというのが生まれる起源となった。

IaCとは

インフラの定義、デプロイ、更新、削除をコードで表現したもの。

一番簡単な方法は、アドホックなスクリプトを実行する。
しかし、汎用的なプログラミング言語で書けてしまうことは、それはある意味欠点にも繋がる。
共通の書き方などに影響を与えるため。

設定管理ツールを使うメリット

  • コーディング規約
  • 冪等性
  • 配布

オーケストレーションツール

  • ハードウェアを効率的に使うため、仮想マシンやコンテナをデプロイ
  • ローリングデプロイ、ブルーグリーンデプロイ、カナリアデプロイなどの手法で既存の仮想マシンやコンテナの集まりを更新
  • オートヒーリング(仮装マシン、コンテナの問題のあるものを自動的に置き換え)
  • オートスケーリング(負荷に応じてスケール)
  • ロードバランシング(トラフィックを分散)
  • サービスディスカバリ(お互いがネットワークで通信できるように)

Kubernates

  • yamlファイルによって、Dockerコンテナをどのように起動するかを定義する。
    • これをDeploymentと呼ぶ

Terraformと他のIaCの違い

考慮すべきトレードオフ

  • 設定管理ツールか、プロビジョニングツールか
  • ミュータブルなインフラか、イミュータブルなインフラか
    • イミュータブルなデプロイにも、イメージ作成からデプロイまでのフローの時間がかかりすぎるという欠点もある
  • 手続き型言語か、宣言型言語か
    • 手続き型では、前のテンプレートは使えなくなる。
  • 汎用言語か、ドメイン特化言語か
  • マスタか、マスタレスか
  • エージェントか、エージェントレスか
  • 有償か、無償か
  • 大きなコミュニティか、小さなコミュニティか
  • 成熟か、最先端か
  • 複数のツールの組み合わせ

利用者

コントリビュータ、コミット数、スター数、StackOverflowの質問数など、いくつかの面で、同じ条件下ではないとはいえ
AnsibleとTerraformが群を抜いて人気を博している。

このことからもTerraformを利用するメリットは多いだろう。

用語

Snowflake Server: 微妙に異なる設定を持っているサーバーのこと

UgoUgo

2章

AWSを基盤として、Terraformを使ってみようという章。
AWSアカウントのセットアップから、サーバのデプロイまでを40ページほどに渡って解説している。

僕個人としては、GCPでの使い方を知りたかったので少し残念だが、市場的には本に則ってAWSを使うのが良いと思われる。

init

Terraformにプロバイダの設定と、EC2のインスタンスを作成する宣言をする。
AMIの設定とインスタンスタイプを登録し、initコマンドを行う。

initによって、Terraformがコードをスキャンし、どのプロバイダを使うのか判断し、そのプロバイダに関するコードをダウンロードする必要がある。
.terraformフォルダにダウンロードされるので、gitignoreする。
コマンドには冪等性がある。

plan

実際に変更を加える前にTerraformが何をする予定なのかを確認できる。
リソースの変更については、プラスとマイナスで表現される。

apply

planコマンドと同じものを出力するが、本当に適用していいか確認できる。
確認に対し、yesを入れると適用される。

すでに存在しているリソースを把握しているので、変更点のみ適用することができる。

ポート番号

1024以下でリッスンするには、rootユーザの権限が必要になる。
サーバに侵入できたアタッカーもroot権限を得られることになるので大きい数字のポートでリッスンする方が良い。

user_data_replace_on_change

ユーザー作成は毎回インスタンスをターミネートして作成したいので、applyするたびに実行するので、上記を設定する。

参考:
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#user_data

graph

依存関係を表示させるコマンド。
EC2をデプロイする前に、セキュリティグループがあることが前提となる。
そういった依存を確認するためのコマンド。

変数

descriptionや、defaultなどの設定を読み込ませることができる。
これはapplyやplanでも読み込むもの。

variables "number_example" {
  description = "..."
  type = list
  default = ["a", "b", "c"]
}

object(構造体型)を使うことも可能

applyをして必要なパラメーターがないとエラーが出ることもある。
対話型で聞かれるが、したくない場合は -var をつけると良い。

TF_VAR_<変数名>
としても良い。

参考:
https://developer.hashicorp.com/terraform/language/values/variables#arguments

ライフサイクル

イミュータブルに変更をしようとするため、ASGなどを使う時は、起動設定を置き換えようとする。
古いリソースへの参照を持ったままではTerraformは起動設定を削除できない。

この時に使うのがライフサイクル。

create_before_destroy

このサイクルはよく使う。
Terraformは置き換える順番を逆にする。