Terraformの基本

この講座では、Terraformの基本構文とAWSリソース作成について実際にハンズオン形式で手を動かしながら体験します。

  • HCL(HashiCorp Configuration Language)の基本構文
  • ブロックの種類(provider・resource・variable・data・output)
  • terraform init / plan / apply / destroyコマンド
  • S3バケットの作成を通じた基本操作の習得

1. 事前準備

この講座のハンズオンでは、以下のツールやアカウントが必要です。まだ準備できていない場合は、リンク先の手順に沿って準備をお願いします。

Terraformの基本的なワークフローを以下の図に示します。

flowchart LR
    A["HCLコードを記述<br>.tf ファイル"] --> B["terraform init<br>プラグイン取得"]
    B --> C["terraform plan<br>実行計画の確認"]
    C --> D["terraform apply<br>リソースの作成"]
    D --> E["terraform destroy<br>リソースの削除"]

2. ブロックについて

Terraformのコード(HCL)は、すべて「ブロック」と呼ばれる単位で構成されています。 ブロックとは、特定の設定や定義をひとまとめにした単位のようなものです。

HCLのブロック記述は、基本的に以下のフォーマットで統一されています。

<ブロックタイプ> "ラベル" {
  # ブロック本体
  <設定項目> = <値>
}

すべてのブロックは、先頭に「ブロックタイプ」があり、その後に名前などの「ラベル」が続き、最後に波括弧 { } で囲まれた「ブロック本体」が来る、という構造になっています。

ブロックタイプには、providerresourcevariabledataoutput などいくつかの種類があります。それぞれの詳しい役割については、この後解説します。

ラベルは、ブロックの種類を識別したり、リソースに名前を付けたりするために使用します。 重要な点として、このラベルの数はブロックタイプによって異なります。例えば、リソースを作成する際は「種類」と「名前」の2つが必要ですが、変数を定義する際は「名前」の1つだけで済む、といった具合です。こちらも後ほど、実際のコードを見ながら説明します。

Terraformのコード記述は、目的に合わせてこれらのブロックを選び、パズルのように組み合わせていく作業となります。

3. プロバイダの定義

プロバイダとは、TerraformがAWSやGoogle Cloudなどの外部サービスを操作するためのプラグインのことです。Terraform本体は「どこのクラウドを操作するか」を知らないため、コードの中で明示的に指定する必要があります。

provider "aws" {
  region = "ap-northeast-1"
}

今回はAWSを使用するため、provider ブロックに "aws" を指定し、操作したいリージョン(地域)を設定します。何を指定するかは、ブロックとして指定するクラウドサービスに応じて異なります。

このコードは、「AWSプロバイダを使用し、東京リージョン(ap-northeast-1)に対して操作を行う」という宣言になります。

AWSプロバイダで指定できる引数の一覧や、認証情報の取得順序などの仕様は、AWS Provider(Terraform Registry公式ドキュメント)に記載があります。

4. 初期化(terraform init)

コードを記述したら、一番最初に行うコマンドが「初期化」です。 ターミナルで terraform init コマンドを実行します。

$ terraform init

このコマンドを実行すると、Terraformはカレントディレクトリにある .tf ファイルを読み込みます。そして、先ほど定義した "aws" というプロバイダに対応するプラグインを、インターネットから自動的にダウンロードし、このフォルダにインストールします。

5. コードの記述

次に、実際に作成したいリソースのコードを追記します。 今回は例として、AWSのS3バケットを作成するコードを記述します。

resource "aws_s3_bucket" "example" {
  bucket = "my-unique-bucket-name-12345" # ※一意な名前に変更してください
}

このコードでは、resource ブロックを使用して、AWSの実際のリソースを定義しています。

まず、一つ目のラベル "aws_s3_bucket" は、「AWSにおいてS3バケットを作成する」というリソースの種類を表しています。 続いて二つ目のラベル "example" は、このリソースに付ける名前です。今回は例としてexampleとしていますが、任意の名前で構いません。これはTerraformのコード内でのみ利用される識別名であり、実際のAWSのリソース名には反映されません。 なお、Terraformでは、単語と単語をアンダースコアで繋ぐ xxx_xxx という「スネークケース」でリソース名を定義することが慣例となっています。

ブロックの中には、bucket = "xxxx" という記載があります。 これはS3バケットの具体的な設定値(引数)を表す部分です。ここに何を指定できるかはリソースの種類によって異なります。 今回の bucket はS3のバケット名を設定する項目ですが、S3の仕様上、バケット名は全世界で重複しないユニークな値である必要があります。そのため、実際には日付やランダムな文字列を入れるなどして、一意な名前にする必要があります。

6. 実行計画(terraform plan)

コードの準備ができたら、適用する前に「実行計画」を確認します。 terraform plan コマンドを実行します。

$ terraform plan

このコマンドを実行すると、Terraformは「現在のAWSの状態」と「記述したコード」を比較します。 そして、「S3バケットが1つ追加(+ create)されます」といった変更内容をプレビュー表示します。 ここで意図しない変更や削除が含まれていないかを確認することが重要です。

7. 実行(terraform apply)

実行計画に問題がなければ、実際に変更を適用します。 terraform apply コマンドを実行します。

$ terraform apply

コマンドを実行すると、再度実行計画が表示され、最後に確認として Enter a value: と入力を求められます。 ここで yes と入力してEnterキーを押すことで、初めて実際にAWSのAPIが呼び出され、S3バケットが作成されます。

処理が完了し、「Apply complete!」と表示されれば、リソースの構築は成功です。

以上が、簡単なTerraformコードと、それに伴う実行方法の説明です。次のセクションでは、実際にこの流れでAWSにS3バケットを作成するハンズオンを行います。

8. TerraformでAWSリソースを作成しよう

8.1 ハンズオンの概要

実際にTerraformを使ってAWSリソースを作成するハンズオンを行います。

今回は、シンプルなS3バケットを作成します。

8.2 Terraformの初期化

作業フォルダの作成

任意の場所にterraform-basic-handsonフォルダを作成し、Visual Studio Codeの「ファイル」→「フォルダーを開く」から、作成したterraform-basic-handsonフォルダを開きます。

terraform-basic-handson  ← このフォルダを作成

main.tfの作成

main.tfファイルを作成します。Visual Studio Codeのエクスプローラーでterraform-basic-handsonフォルダを右クリックし、「新しいファイル」を選択してmain.tfという名前で作成してください。

terraform-basic-handson
└── main.tf  ← このファイルを作成

プロバイダブロックの作成

作成したファイルに以下の内容を記述して保存します。ここでは、AWSを使用するための設定(プロバイダブロック)として、リージョンに東京リージョンを指定しています。

provider "aws" {
  region = "ap-northeast-1" # 東京リージョン
}

terraform initの実行

記述したプロバイダ(今回はAWS)に必要なプラグインをダウンロードするために、初期化コマンドを実行します。

Visual Studio Codeにて、「ターミナル」メニューから「新しいターミナル」を選択すると、下の方にターミナルが表示されます。

ターミナルで作業ディレクトリに移動し、以下を実行してください。

terraform init

以下のメッセージが表示されれば、ここまでは成功です。

Terraform has been successfully initialized!
⚠️ 認証エラーが出る場合
terraform initが成功しても、後続のterraform planterraform applyで「No valid credential sources found」や「AuthorizationError」が表示される場合があります。
これはAWS CLIの認証設定が完了していないことが原因です。
aws configureコマンドでアクセスキーとシークレットキーを設定するか、AWS CLIの設定が正しく行われているか確認してください。

8.3 Terraformコードの作成

リソースブロックの作成

続いて、S3バケットを作成するための定義(リソースブロック)を main.tf に追記します。先ほど記述したプロバイダブロックの下に、以下の内容を追記して保存します。

resource "aws_s3_bucket" "example" {
  bucket = "my-unique-bucket-name-2025-test" # 必ず変更してください
}

bucket の値(バケット名)は、世界中で一意(ユニーク)である必要があります。末尾に日付や自分の名前を入れるなどして、他の人と被らない名前に変更してください。

8.4 実行計画

terraform planの実行

実際にリソースを作成する前に、コードに基づいてどのような変更が行われるかを確認(ドライラン)します。

下記のコマンドを実行してください。

terraform plan

変更内容の確認

コマンドを実行すると、多くのログが表示されます。以下の2点に注目して確認してください。

出力の途中に、以下のように緑色(環境による)の + 記号が表示されている箇所を探してください。

# aws_s3_bucket.example will be created
+ resource "aws_s3_bucket" "example" {
    + acceleration_status         = (known after apply)
    + acl                         = (known after apply)
    + bucket                      = "my-unique-bucket-name..."
    ...
  }

この + (プラス記号) は、そのリソースが**「新規作成」**(add)されることを意味しています(逆に - なら削除、~ なら変更を意味します)。

また、出力の最後に以下の行が表示されているか確認してください。

Plan: 1 to add, 0 to change, 0 to destroy.

これは「1つのリソースを追加、0個を変更、0個を削除」する計画であることを示しています。 エラーが出る場合は、コードのスペルミスや、bucket 名がすでに他で使用されていないかなどを確認してください。

⚠️ 「BucketAlreadyExists」エラーが出る場合
S3バケット名は全世界で一意である必要があります。
別の名前(例えば末尾に日付やランダムな文字列を追加)に変更してください。
⚠️ 構文エラーが出る場合
「Error: Unsupported argument」や「Error: Missing required argument」が表示される場合は、コードの構文エラーです。
=の前後にスペースがあるか、波括弧{}が正しく閉じているか、文字列がダブルクォート""で囲まれているかを確認してください。

8.5 実行

terraform applyの実行

計画内容に問題がなければ、実際にAWSへ適用してリソースを作成します。

terraform apply

途中で確認を求められるので、yes と入力してEnterキーを押してください。

「Apply complete!」と表示されれば作成成功です。

⚠️ 「Terraform AWS Provider」エラーが出る場合
AWSの認証情報が設定されていないか、無効です。
aws configureコマンドで認証情報を設定してください。
また、設定したIAMユーザに適切な権限(今回の場合はS3へのアクセス権限)があることを確認してください。
⚠️ 「Still creating...」が長時間続く場合
terraform apply実行後に「Still creating...」が10秒以上出続ける場合は、IAMユーザの権限が不足している可能性があります。Terraformはリソース作成後にAWS APIで結果を確認するため、作成権限だけでなく読み取り権限も必要です。
AWS CLIのインストール講座で作成したcli-userAdministratorAccess付き)を使用しているか確認してください。別のIAMユーザを使用している場合は、AdministratorAccessポリシーを付与するか、aws configurecli-userのアクセスキーに切り替えてください。

stateファイルの確認

作業ディレクトリ内に terraform.tfstate というファイルが生成されています。 これはTerraformが管理しているリソースの現在の状態(State)を記録した重要なファイルです。中身を見て、作成したバケットの情報(ARNやIDなど)がJSON形式で記録されていることを確認してください。

作成されたリソースの確認

terraform apply コマンドの実行が完了したら、実際にAWSマネジメントコンソールにアクセスして、S3バケットが正しく作成されているかを確認しましょう。

まず、ブラウザからAWSマネジメントコンソールにログインし、画面上部にある検索バーに「S3」と入力します。検索結果のサービス欄に表示される「S3」を選択して、S3のダッシュボードへ移動してください。

バケットの一覧画面が表示されますので、リストの中に先ほど main.tf ファイルで指定した名前のバケットが存在しているかを探します。指定した名前のバケットが見つかれば、TerraformによるS3バケットの作成は成功です。

8.6 リソースの削除

ハンズオン終了後は、不要な課金を防ぐために作成したリソースを削除します。Terraformでは、terraform destroy というコマンドを実行すると、Terraformで作成したリソースの削除が行えます。

terraform destroy

terraform apply と同様に確認を求められますので、yes と入力します。 「Destroy complete!」と表示され、AWSコンソール上からバケットが削除されていればハンズオンは完了です。

9. まとめ

この講座では、Terraformの基本について学びました。

  • Terraformは、HashiCorp社が提供するIaCツール
  • HCL(HashiCorp Configuration Language)でインフラを記述する
  • providerブロックでAWSなどのクラウドプロバイダを指定する
  • resourceブロックで作成するリソースを定義する
  • terraform initで初期化、terraform planで計画確認、terraform applyで適用
  • terraform destroyで作成したリソースを削除できる
  • terraform.tfstateファイルで現在の状態を管理する