Terraform入門してみる
経緯
今回はTerraformに入門する記事です。
目的としては、Terraformの概要を掴むことです。 動機としては、「近々業務でTerraformを使うことになったため、概要を掴みたい」というものです。 アプリケーションの環境を構築するわけではなく、負荷試験のリクエストを送るための環境を構築する そのため、基本的な文法を抑えること/動作を確認することで雰囲気を掴むことを目指しています。
まずTerraformとは何か?について調べます。
Terraformとは?
TerraformはHashiCorp社のIaC(Infrastructure as Code)のツールです。 マルチクラウドに対応しAWS, Azure, GCPなど、1,000以上のプロバイダーに対応しています。
Terraformの主な利点:
- コードとしてインフラを管理(バージョン管理可能)
- 宣言的な記述方式(何をしたいかを記述)
- マルチクラウド対応
- 再利用可能なモジュール
- 状態管理による整合性の確保
Terraformをdockerで動かして、nginxを起動するチュートリアルを試してみます。
インストール
brewでインストール可能です。
注意点としては、リポジトリにhashicorp/terraformを追加する必要があります
brew tap hashicorp/terraform
brew install terraform
terraform -helpで動作確認したら、インストール完了です。
tfファイルの作成
次にmain.tfファイルを作成します。
terraform-nginx/
├── main.tf
main.tfの内容は以下のような内容です。(公式チュートリアルそのまま)
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.1"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
name = "tutorial"
ports {
internal = 80
external = 8000
}
}
tfファイルには、 terraform, provider, resourceの3つのセクションがあります。
各セクションの説明
terraform セクション
このセクションでは、Terraformの設定を指定します。ここでは、使用するプロバイダーとそのバージョンを定義しています。required_providersブロックでは、使用するプロバイダーの情報を記述します。
provider セクション
プロバイダーとは、特定のインフラストラクチャ(AWS、GCP、Azureなど)やサービスとTerraformを連携させるためのプラグインです。ここではDockerプロバイダーを使用しています。空のブロックは、デフォルト設定で使用することを意味します。
resource セクション
リソースは、管理するインフラストラクチャの要素を定義します。ここでは2つのリソースを定義しています:
docker_image- Nginxのイメージを取得docker_container- そのイメージを使用してコンテナを作成し、ポートマッピングを設定
Terraformの初期化と実行
初期化
作成したディレクトリで以下のコマンドを実行し、Terraformを初期化します:
terraform init
初期化すると、.terraformディレクトリが作成され、必要なプロバイダープラグインがダウンロードされます。
適用
実際に適用します:
terraform apply
確認を求められるので「yes」と入力します。
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# docker_container.nginx will be created
+ resource "docker_container" "nginx" {
+ attach = false
+ bridge = (known after apply)
+ command = (known after apply)
+ container_logs = (known after apply)
+ container_read_refresh_timeout_milliseconds = 15000
+ entrypoint = (known after apply)
+ env = (known after apply)
+ exit_code = (known after apply)
+ hostname = (known after apply)
+ id = (known after apply)
+ image = (known after apply)
+ init = (known after apply)
+ ipc_mode = (known after apply)
+ log_driver = (known after apply)
+ logs = false
+ must_run = true
+ name = "tutorial"
+ network_data = (known after apply)
+ read_only = false
+ remove_volumes = true
+ restart = "no"
+ rm = false
+ runtime = (known after apply)
+ security_opts = (known after apply)
+ shm_size = (known after apply)
+ start = true
+ stdin_open = false
+ stop_signal = (known after apply)
+ stop_timeout = (known after apply)
+ tty = false
+ wait = false
+ wait_timeout = 60
+ healthcheck (known after apply)
+ labels (known after apply)
+ ports {
+ external = 8000
+ internal = 80
+ ip = "0.0.0.0"
+ protocol = "tcp"
}
}
# docker_image.nginx will be created
+ resource "docker_image" "nginx" {
+ id = (known after apply)
+ image_id = (known after apply)
+ keep_locally = false
+ name = "nginx:1.14.2"
+ repo_digest = (known after apply)
}
Plan: 2 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
リソースの破棄
リソースの破棄はterraform destroyコマンドで行います。
terraform destroy
これにより、Terraformが管理しているすべてのリソースが削除されます。
まとめ
今回はTerraformの基本的な使い方を学びました。 概念や記載方法としては、シンプルで学習コストは低いなと感じました。
KJR020's Blog