前段
業務の一環で Terraform に関わることになりましたが、まずはキャッチアップを行うために基本的な内容をしっかり整理していきます。
概要
Terraform は HashiCorp 社によって開発されたIaC(Infrastructure as Code)
を実現する OSS(Open Source Software)
です(GitHub / README)。
ちなみに、同社が開発したHCL(HashiCorp Configuration Language)
という設定言語を利用します。
インフラ構築や設定をテンプレートファイルを使って自動化してくれます。
様々なクラウドサービス(AWS,Kubernetes,VMWare,…
)に対応しており、インフラ構成をコード上で宣言的に定義することで、コードベースでの管理を実現してくれます。
基本コマンド
初期化
terraform init
ワークスペースを初期化してくれます。
.terraform
ディレクトリが作られ、Provider Plugin と Module に関するキャッシュファイルが作成されます。
以下 terraform コマンドの実行前に必要です。
また設定変更時にも、改めて実行が必要です。
実行計画の確認
terraform plan
.tf(テンプレート)ファイルを元に、.tfstate
ファイルとの差分を検知して、どのようなリソースが作成(create
)・更新(update
)・削除(destroy
)されるかを事前に確認できます。
適用
terraform apply
.tf ファイルに記載された情報を元にリソースを作成します。
なおリソース作成後、terraform.tfstate
に、作成リソースの関連情報が保存されます。
このtfstate
ファイルはローカルで管理することもありますが、複数人の運用では Amazon S3 などのストレージに保存してチーム間で共有するのが一般的です。自動で更新されていくため、手動での変更は厳禁です。
2度目以降の実行後は、1世代前のものがterraform.tfstate.backup
に保存されます。
なお複数変更を同時に実行されないよう LOCK 機能を用いて 1 つの処理が完了するまで他の処理を受け付けないという設定もできます。
リソースを取り込む
terraform import
既に存在するリソースを Terraform 管理下に取り込みます。
例)terraform import aws_s3_bucket.bucket bucket-name
import
コマンドの実行ではなく、import
ブロックを使用しての取り込みも可能です。
対象の.tf
ファイルを修正して、以下のように記述。terraform apply
により適用できます。
import {
id = "terraform-import-example" # リソースの識別子
to = aws_s3_bucket.example # import 先
}
基本的な仕組み
運用者が terraform コマンドを叩くことで、下図のように Terraform Provider を介して各クラウドプロバイダーの API が実行され、必要なインフラ構築がなされます。
画像の引用元:HashiCorp 社による Terraform 開発者向け公式ドキュメント「What is Terraform? / How does Terraform work?」( https://developer.hashicorp.com/terraform/intro )より
チュートリアル紹介
基本操作を確認するために公式のチュートリアルをやってみましたが、これが体感としてとても良かったのでオススメします。
https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli#quick-start-tutorial
なお自分はCannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
とのエラーが出たので、下記記事を参考に Docker Host の指定をして解決しました。
https://zenn.dev/konbu33/articles/bae0ed3671b457
Terraform を介して、ローカル環境で Nginx の Docker Image を元に Docker Container を立ち上げ、http://localhost:8000/ でアクセスできるようになることを確認する流れになっています。