Terraform の概念とセットアップ

LinuxBeginner
オンラインで実践に進む

はじめに

Infrastructure as Code(IaC)の世界へようこそ。

忙しいレストランの料理長を想像してください。従来は、料理を一品ずつ手作業で順番に作っていたかもしれません。IT の世界では、これはサーバーを 1 台ずつ手動で設定することに相当します。時間がかかるうえ、ミスも起こりやすい方法です。

IaC を使うと、繰り返しコマンドを実行したり、クラウドコンソールをクリックしたりしてインフラを手動で設定する代わりに、インフラの構成をファイルとして記述できます。このファイルは、バージョン管理、レビュー、再利用が可能です。

Terraform は、最も広く使われている IaC ツールの 1 つです。Terraform は宣言的なツールです。目的の最終状態を記述すると、そこへ到達する方法を Terraform が判断します。

この宣言的なモデルは、Terraform を特徴づける重要な考え方です。インフラに何を存在させるかを記述するのであって、作成に必要な低レベルの各手順を命令型のスクリプトとしてすべて記述するわけではありません。

この実験では、「キッチン」を準備し、ロボットに最初のスキルを教えます。Provider(プロバイダー)について学びます。プロバイダーは、AWS、Google Cloud、Docker など、異なる対象にアクセスするためにロボットが必要とする専用の調理器具のようなものです。

この実験を終えると、Terraform のインストール、最初の「レシピ」ファイルの作成、構築を始めるための環境準備が完了します。

Terraform をインストールする

terraform プログラムをインストールします。これは、ロボットの頭脳をダウンロードする作業だと考えてください。プログラムがどこから取得され、どこに保存されるのかを確認できるよう、ここでは手動でインストールします。

まず、現在作業している場所を確認します。プロジェクトフォルダー内にいる必要があります。

pwd

次に、Terraform のパッケージをインターネットからダウンロードします。この実験ですべての操作が正しく動作するよう、wget コマンドを使って特定のバージョン(1.14.3)を取得します。

wget https://releases.hashicorp.com/terraform/1.14.3/terraform_1.14.3_linux_amd64.zip

ダウンロードしたファイルは、ツールが入ったスーツケースのような圧縮された「zip」アーカイブです。unzip コマンドを使って展開します。

unzip terraform_1.14.3_linux_amd64.zip

これで terraform プログラムが取得できました。ただし、現在はこの特定のフォルダーからしか実行できません。ls や cd などの標準コマンドと同じように、システム上のどこからでも実行できるようにします。

そのために、/usr/local/bin という特別なシステムフォルダーへ移動します。このディレクトリは、コマンドを入力したときにシステムが常に確認する、共有のツールボックスのような場所です。

sudo mv terraform /usr/local/bin/

最後に、バージョンを確認してインストールを検証します。

terraform -version

Terraform v1.14.3 と表示されれば成功です。

作業場所を整理するため、ダウンロードした zip ファイルを削除します。

rm terraform_1.14.3_linux_amd64.zip

設計図を作成する

Terraform は、何を構築するのかを知るための設計図を必要とします。この設計図は、.tf 拡張子のテキストファイルに記述します。

このステップでは、メインの設定ファイルを作成します。慣例として、主要なファイルには通常 main.tf という名前を付けます。レシピ本のメインページのようなものです。

~/project ディレクトリに main.tf という新しいファイルを作成します。まず、touch コマンドで空のファイルを作成します。

touch main.tf

ファイルが作成されたことを確認します。

ls -l main.tf

この時点では、ファイルは空です。次のステップで内容を追加します。このファイルがインフラの設計図になります。

プロバイダーを設定する

main.tf ファイルを用意できたので、次はファイルに指示を追加します。

Terraform は汎用ツールです。デフォルトでは、Docker、AWS、Azure と通信する方法を知りません。そこで Provider(プロバイダー)を導入します。プロバイダーは翻訳者のような役割を持ち、Terraform に管理対象プラットフォーム固有の言語を教えます。今回は Docker コンテナを管理するため、Docker プロバイダーを使用します。

コアエンジンとプロバイダープラグインを分離することで、同じ Terraform のワークフローパターンを使って、さまざまなインフラシステムを管理できます。

テキストエディター nano で main.tf を開きます。

nano main.tf

次のコードをファイルにコピーして貼り付けます。最初の terraform ブロックは、ダウンロードする翻訳プラグインを Terraform に正確に指定します。2 つ目の provider ブロックは、そのプラグインを有効にします。

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

コードを貼り付けたら、変更を保存してエディターを終了します。Ctrl + O を押してファイルを書き込み、Enter を押してファイル名を確定し、その後 Ctrl + X を押して終了します。

この設定は Terraform に対して、「Docker プロバイダーを使用する。具体的には、バージョン 3.0.1 または互換性のあるバージョンを使用する」と伝えます。

プロジェクトを初期化する

ツールのインストールと設計図の作成は完了しましたが、Terraform はまだ準備の途中です。main.tf に「Docker」の翻訳者(プラグイン)が必要だと記述されていますが、まだダウンロードされていません。

init コマンドを実行します。これは「作業場の準備」に相当します。Terraform は設計図を読み込み、不足しているツールを確認し、それらを隠しフォルダーへ自動的にダウンロードします。

そのため、terraform init はインフラを変更するステップではなく、プロジェクトのブートストラップのステップです。後続のコマンドが設定を正しく理解できるよう、作業ディレクトリを準備します。

初期化コマンドを実行します。

terraform init

次のような出力が表示されます。

Initializing the backend...

Initializing provider plugins...
- Finding kreuzwerker/docker versions matching "~> 3.0.1"...
- Installing kreuzwerker/docker v3.0.2...
- Installed kreuzwerker/docker v3.0.2 (self-signed, key ID 24E54F214539BC63)

Terraform has been successfully initialized!

このコマンドにより、プロジェクトフォルダー内に .terraform という隠しディレクトリが作成されます。ダウンロードしたプロバイダープラグインは、このディレクトリに保存されます。

隠しファイルを含むすべてのファイルを一覧表示して、このディレクトリの存在を確認できます。

ls -a

.terraform と .terraform.lock.hcl が表示されます。ロックファイルによって、以降の実行でもまったく同じプロバイダーバージョンが使用され、一貫性が保たれます。

まとめ

おめでとうございます。Terraform 環境のセットアップが完了しました。

この実験では、次のことを学びました。

  • インストール:Terraform のバイナリをシステムパス(/usr/local/bin)に配置する方法。
  • 設定:インフラの設計図となる main.tf ファイルを作成する方法。
  • プロバイダー:Terraform が Docker などの異なるプラットフォームと通信できるようにする固有の「翻訳者」。
  • 初期化:作業を始める前に必要なプラグインをダウンロードするため、terraform init を使用する方法。

これで、次の実験で実際のリソースを定義し、インフラを構築する準備が整いました。