はじめに
Terraformは、HashiCorp社によって開発されたオープンソースのInfrastructure as Code (IaC) ツールです。宣言的な構成言語を使用して、データセンターのインフラストラクチャを定義およびプロビジョニングできます。つまり、構成ファイルで理想とするインフラの状態を記述すれば、Terraformがその状態を実現するためにリソースの作成、更新、削除を自動的に判断して実行します。
Terraformの基本的なワークフローは、主に以下の3つのステップで構成されます。
- Write(記述): インフラをコードとして作成します。
- Plan(計画): 変更を適用する前に、実行内容をプレビューします。
- Apply(適用): インフラをプロビジョニングおよび管理します。
この実験では、非常にシンプルなリソースである「ローカルファイル」を作成することで、このワークフロー全体を体験します。local プロバイダーを使用することで、クラウドプロバイダーの認証情報を用意することなく、Terraformの仕組みを効率的に学習できます。ファイルの定義、作成の計画、変更の適用、そして結果の確認という一連の流れを実践します。
main.tf で local_file リソースを定義する
このステップでは、Terraform構成ファイルでリソースを定義することから始めます。すべてのTerraform構成は .tf 拡張子を持つファイルに記述されます。メインの構成ファイルは一般的に main.tf という名前が付けられます。
resource ブロックは、インフラストラクチャのオブジェクトを宣言するための主要な構文です。これは、指定されたタイプ(例: local_file)とローカル名(例: example)を持つリソースを定義します。タイプと名前の組み合わせは、モジュール内で一意である必要があります。
まず、nano テキストエディタを使用して、~/project ディレクトリにある main.tf ファイルを開きます。
nano main.tf
次に、以下のコードをファイルに追加します。これは local_file タイプのリソースを定義し、ローカル名 example を割り当てるものです。現時点では、リソースブロックの中身は空です。
resource "local_file" "example" {
}
コードを追加したら、Ctrl+X を押し、Y を入力し、最後に Enter を押してファイルを保存し、nano を終了します。
リソースブロックでファイル名と内容を指定する
このステップでは、リソースブロックに引数を追加して、作成するファイルのプロパティを指定します。引数とは、リソースブロック内で構成を定義するキーと値のペアのことです。local_file リソースにおいて最も重要な2つの引数は filename と content です。
filename: 作成されるファイルのパス。content: ファイルに書き込まれる内容。
もう一度 nano で main.tf ファイルを開きます。
nano main.tf
local_file リソースブロックを修正し、以下のように filename と content 引数を追加します。
resource "local_file" "example" {
content = "Hello, Terraform!"
filename = "${path.module}/hello.txt"
}
ここでは、現在のプロジェクトディレクトリに hello.txt という名前のファイルを作成するようにTerraformに指示しています。${path.module} は、現在のモジュールのパス(この場合は ~/project)に解決される特別なTerraform式です。ファイルの内容は "Hello, Terraform!" という文字列になります。
Ctrl+X、Y、Enter を押してファイルを保存し、nano を終了します。
Terraformの初期化と変更のプレビュー
このステップでは、まずTerraformプロジェクトを初期化し、次に terraform plan コマンドを実行して実行計画を作成します。
変更を計画する前に、プロジェクトを初期化する必要があります。terraform init コマンドは構成をスキャンし、必要なプロバイダー(今回は local_file 用)をダウンロードして、バックエンドをセットアップします。
ターミナルで、まず terraform init を実行します。
terraform init
初期化が成功したら、terraform plan を実行します。このコマンドはTerraformワークフローの重要な部分であり、変更の「ドライラン(予行演習)」を提供します。実際に変更を加えることなく、Terraformがインフラに対して何を行うかを確認できます。これにより、適用前に意図したアクションをレビューおよび検証できます。
terraform plan
Terraformは構成ファイルを読み込み、現在のインフラの状態(現在は空)と比較します。その後、アクションプランを表示します。以下のような出力が表示され、1つのリソースが作成されることが示されます。
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:
## local_file.example will be created
+ resource "local_file" "example" {
+ content = "Hello, Terraform!"
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./hello.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
resource "local_file" "example" の横にある + 記号は、このリソースが作成されることを意味します。出力には、新しいファイルに設定されるすべての属性が詳細に表示されます。
terraform apply を実行してリソースを作成する
このステップでは、terraform apply コマンドを使用して変更を適用し、実際にファイルを作成します。このコマンドは、terraform plan の出力で提案されたアクションを実行します。
デフォルトでは、terraform apply は再度プランを表示し、続行する前にインタラクティブな確認を求めます。実験や自動化に便利なように非対話型にするには、-auto-approve フラグを使用できます。
ターミナルで次のコマンドを実行します。
terraform apply -auto-approve
Terraformがプランを実行します。出力には再度プランが表示され、その後に適用状況が続きます。完了すると、確認メッセージが表示されます。
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:
## local_file.example will be created
+ resource "local_file" "example" {
+ content = "Hello, Terraform!"
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./hello.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
local_file.example: Creating...
local_file.example: Creation complete after 0s [id=42086c02e03bf671ddf621ed9922f52f2c7a605c]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
"Apply complete!" というメッセージは、Terraformが構成で定義された通りにリソースを正常に作成したことを示しています。
ファイルシステムに作成されたファイルが存在することを確認する
最後のステップでは、Terraformが指定通りにローカルファイルシステム上にファイルを作成したことを確認します。local_file リソースを使用したため、結果はプロジェクトディレクトリ内の実体のあるファイルとなります。
まず、ls コマンドを使用して現在のディレクトリ内のファイル一覧を表示します。Terraform構成ファイルと一緒に hello.txt が表示されるはずです。
ls
期待される出力:
hello.txt main.tf terraform.tfstate
次に、cat コマンドを使用して、新しく作成された hello.txt ファイルの内容を表示します。
cat hello.txt
main.tf で定義した内容が表示されるはずです。
Hello, Terraform!
これで、Terraformの構成が正常に適用され、コードで定義した通りにリソースが作成されたことが確認できました。
まとめ
おめでとうございます!最初のTerraformプロジェクトを無事に完了しました。
この実験では、Terraformの基本的なワークフローを学びました。
- Write(記述):
main.tf構成ファイルでlocal_fileリソースを定義しました。 - Plan(計画):
terraform planを使用して、変更を加えることなくファイルの作成をプレビューしました。 - Apply(適用):
terraform applyを使用してプランを実行し、ローカルファイルシステム上にファイルを作成しました。
このローカルファイルを作成するシンプルな例は、Infrastructure as Codeの核心的な力を示しています。構成ファイルでリソースの理想的な状態を宣言し、Terraformがその状態を実現するためのロジックを処理しました。この原則は、クラウド上の仮想マシン、ネットワーク、データベースなど、より複雑なインフラを管理する場合にも同様に適用されます。



