はじめに
前の実験では、キッチン(Terraform のインストール)を準備しました。今回は、メニューを書いていきます。
Terraform では通常、低レベルの手順を一つずつ手動で記述することはありません。その代わりに、必要なインフラのオブジェクトを定義します。Terraform が管理する各オブジェクトは、リソースとして表します。
リソースは、Terraform が管理する基本単位です。.tf ファイルに記述したコードと、対象プラットフォーム上の実際のオブジェクトをつなぐ役割を持ちます。
レストランで注文する場面を想像してください。シェフに「玉ねぎを切って、炒めて、卵を 2 個溶いて……」と指示するのではなく、「オムレツが欲しい」と伝えるだけです。Terraform は、注文(設定)を受け取り、キッチン(Docker)で指定どおりに料理を準備するウェイターのようなものです。
これが Terraform の基本的なワークフローです。リソースを定義し、提案された変更をプレビューしてから、変更を適用します。
イメージを定義する
まず、必要な材料を指定します。Docker では、コンテナを実行する前に イメージ(ソフトウェアをパッケージ化したもの)が必要です。
最初にプロジェクトフォルダーへ移動し、注文書となる main.tf ファイルを作成します。
cd ~/project
touch main.tf
テキストエディター nano で main.tf を開きます。
nano main.tf
Terraform では、最初に誰が作業を担当するのか(Provider)を指定します。Docker provider を設定するため、次の標準ブロックをファイルの先頭にコピーして貼り付けます。
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.1"
}
}
}
provider "docker" {}
次に、最初のリクエストとして Nginx イメージを追加します。provider ブロックの下に、次のコードを main.tf へ追加してください(下へ移動するには矢印キーを使います)。
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
コードを貼り付けたら、作業内容を保存します。Ctrl + O を押し、Enter で確認してから、Ctrl + X を押してエディターを終了します。
この記述の意味を確認しましょう。
resource:Terraform に「何かを注文したい」と伝えるキーワードです。"docker_image":注文する項目の タイプ です。AWS と連携する場合は、aws_instanceなどになります。"nginx":後で参照できるように、この項目へ付ける 名前 です。Terraform の内部で参照するための名前であり、実際の環境には影響しません。name = "nginx:latest":Docker に渡す具体的なパラメーターです。ダウンロードするイメージを正確に指定します。
これで、設計図に provider と 1 つのリソース定義が記述されました。
コンテナを定義する
イメージはディスク上に保存されていますが、コンテナは実行中のアプリケーションです。レシピと、皿に盛られた実際の料理の違いに似ています。
ここでは、main.tf ファイルに 2 つ目のリソースを追加します。この新しいリソースは、最初に定義したリソースに依存します。
もう一度 nano で main.tf を開きます。
nano main.tf
矢印キーでファイルの末尾へ移動し、次のブロックを最後に貼り付けます。
resource "docker_container" "web" {
image = docker_image.nginx.image_id
name = "tutorial"
ports {
internal = 80
external = 8000
}
}
image = docker_image.nginx.image_id という行に注目してください。
この参照は単なる便利な記述ではありません。Terraform が依存関係のグラフを作成し、リソースを作成する順序を自動的に判断できるようにします。
nginx:latest をもう一度入力する代わりに、先ほど定義したリソース(docker_image.nginx)を参照しています。これにより Terraform に、「イメージの準備が完了するまで、このコンテナを作成しないでください」と伝えられます。このようにして 依存関係を作成します。
さらに、ports ブロックも追加しました。これにより、コンピューターのポート 8000 からコンテナのポート 80 へ接続でき、Web サイトを表示できるようになります。
初期化してプランを作成する
Terraform に変更を実行させる前に、プロジェクトを初期化してツールをダウンロードし、その後で実行予定のプランをプレビューします。
まず、init を実行して Docker provider のプラグインをインストールします。
terraform init
注文を確認せずに、ウェイターがすぐ料理を運んできたら危険です。同じように、Terraform には Plan という安全機能があります。指定した内容と、すでに存在する内容を比較して、その差分を計算します。
次のコマンドを実行してプランを作成します。
terraform plan
出力をよく確認してください。リソースの横に緑色の + 記号が表示されます。この記号は、「このリソースを作成する」ことを示します。
Plan フェーズは、Terraform の最も重要な安全機能の一つです。実際の環境を変更する前に、提案された変更内容を確認できます。
重要なポイント:必ずプランを読んでください。実際のインフラに変更が反映される前に、誤りを見つける最後の機会です。
変更を適用する
プランに問題がなければ、ウェイターに「その内容で作ってください」と伝えます。
apply コマンドを実行すると、プランが適用されます。
terraform apply
Terraform は慎重に動作します。プランをもう一度表示し、最後に確認を求めます。続行するには yes と入力する必要があります。
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
yes と入力して Enter を押すと、Terraform は Docker に接続し、イメージを取得してコンテナを起動します。
正しく動作したか確認しましょう。標準の Docker コマンドを使うと、コンテナが実行中かどうかを確認できます。
docker ps
デプロイした Web サイトをテストすることもできます。ポート 8000 を割り当てたため、curl を使ってアクセスできます。
curl localhost:8000
Welcome to nginx! の HTML コードが表示されたら、コードを使った最初のインフラのデプロイに成功しています。
まとめ
おめでとうございます。Terraform の基本的なワークフローを完了しました。
この実験では、次の内容を学びました。
- リソースの定義:
main.tfで必要なもの(イメージとコンテナ)を指定する方法。 - 参照:リソース同士を関連付ける方法(コンテナで使用するイメージを指定する方法など)。
- Plan:変更を確定する前に「請求書」をプレビューする方法。
- Apply:実際のインフラを作成する方法。
Write -> Plan -> Apply のサイクルは、専門家が大規模なクラウドインフラを管理するときに実際に使っている方法です。DevOps エンジニアへの第一歩を踏み出しました。



