ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【Terraform + Windows OS】初心者がチュートリアルに従ってインスタンスを構築してみた

この記事を共有する

目次

はじめに

本記事は「【初心者向け】Windows OS 環境で Terraform を実行する準備手順」 の続編として、Terraform を用いて Amazon EC2 インスタンス(以下、「インスタンス」)を作成した手順を説明します。
前回に引き続き、Terraform 初心者である筆者が Windows OS 上で操作を行います。

作業手順は Terraform のチュートリアル「Create infrastructure」¹に沿って進めました。
別途注釈がない限り、本記事の手順や仕様説明は同チュートリアル¹を参照しています。

構築する環境

東京リージョン(ap-northeast-1)のデフォルト VPC にインスタンスを作成します。

作成手順

1. 作業用フォルダの作成

エクスプローラーを開き、作業用のフォルダ「C:\work」を作成します。
以降の作業は、本フォルダで実施します。

2. 「terraform.tf」の作成

「terraform.tf」ファイルを新規作成します。

「terraform.tf」を開き、以下を記載して保存します。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 6.33"
    }
  }
  required_version = ">= 1.14"
}

required_providers

Terraform で AWS の API を実行するためには、プロバイダーと呼ばれるプラグインをインストールする必要があります。
「required_providers」では、インストールするプロバイダーを記載しています。

  • source:AWS のプロバイダーに関するアドレスを記載します
  • version:プロバイダーのバージョン制約として、メジャーバージョンが 6 で、マイナーバージョンが 33 以上のプロバイダーが有効とします

筆者で最新バージョンの情報を探したところ、「hashicorp/aws | Terraform Registry」²で確認できました。

required_version

Terraform のバージョン制約として、バージョン 1.14 以上の Terraform が有効としています。
筆者で最新バージョンの情報を探したところ、「Terraform Versions | HashiCorp Releases」³で確認できました。

3. 「main.tf」の作成

「main.tf」ファイルを新規作成します。

「main.tf」を開き、以下を記載して保存します。

provider "aws" {
  region = "ap-northeast-1"
}
data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name = "name"
    values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
  }
  owners = ["099720109477"] # Canonical
}
resource "aws_instance" "app_server" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"
  tags = {
    Name = "learn-terraform"
  }
}

provider

プロバイダー「AWS」が管理するリソースを、東京リージョン(ap-northeast-1)に作成する設定です。

data "aws_ami"

Ubuntu の最新 AMI ID を AWS から取得して、後述の「resource」ブロックで使用します。

  • most_recent:true のため、AMI の検索結果が複数の場合、最新の AMI を使用します⁴
  • filter:AMI を検索するときのフィルター条件⁴として、AMI の名前で検索します⁵
  • owners:AMI の所有者を指定⁴します。ID 「099720109477」は Ubuntu 提供元の公式アカウントです⁶

resource "aws_instance"

インスタンスの構成要素を記載します。

  • ami:AMI ID は「data」ブロックで取得した ID 属性を使用します
  • instance_type:インスタンスタイプは「t2.micro」を使用します
  • tags:Name タグを指定しています

4. フォーマットのチェック

PowerShell を開き、次のコマンドを実行して作業用フォルダへ移動します。

cd C:\work

次のコマンドを実行し、作成したファイルのフォーマットをチェックします。

terraform fmt

修正点がある場合は自動でフォーマットが修正されて、対象のファイル名が表示されます。
修正点がない場合、ファイル名は表示されません。

PS C:\work> terraform fmt
main.tf

5. 作業ディレクトリの初期化

作業用フォルダを Terraform の作業ディレクトリとして初期化するため、以下のコマンドを実行します。

terraform init

初期化をすると、作業用フォルダの配下に「.terraform」フォルダと「.terraform.lock.hcl」ファイルが作成されます。

「.terraform」

初期化をすると、プロバイダーのダウンロードとインストールが実施されます。
「.terraform」配下を辿ると、インストールされたプロバイダーの実行ファイルがあります。

C:\work.terraform\providers\registry.terraform.io\hashicorp\aws\6.33.0\windows_amd64

「.terraform.lock.hcl」

「.terraform.lock.hcl」には、プロバイダーの情報が記載されます。

6. 構成の確認

次のコマンドを実行し、作成したファイルの構成に誤りがないことを確認します。

terraform validate

誤りがない場合、以下のとおり表示されます。

PS C:\work> terraform validate
Success! The configuration is valid.

誤りがある場合、該当箇所が指摘されます。
例として「main.tf」から「instance_type」の行を削除すると、以下の指摘がありました。

7. インスタンスの作成

Terraform でインフラを変更する際は、「変更点の確認⇒承認⇒適用」の段階を踏みます。
まずは次のコマンドを実行し、表示される変更点を確認します。

terraform apply

表示された変更点を確認すると、「main.tf」に記載したインスタンス「app_server」が作成対象であることが分かります。
なお、この変更点の一覧は実行計画(execution plan)といいます。

クリックして展開

PS C:\work> terraform apply
data.aws_ami.ubuntu: Reading...
data.aws_ami.ubuntu: Read complete after 0s [id=ami-04ae19f2563b23082]
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:
  # aws_instance.app_server will be created
  + resource "aws_instance" "app_server" {
      + ami                                  = "ami-04ae19f2563b23082"
      + arn                                  = (known after apply)
      + associate_public_ip_address          = (known after apply)
      + availability_zone                    = (known after apply)
      + disable_api_stop                     = (known after apply)
      + disable_api_termination              = (known after apply)
      + ebs_optimized                        = (known after apply)
      + enable_primary_ipv6                  = (known after apply)
      + force_destroy                        = false
      + get_password_data                    = false
      + host_id                              = (known after apply)
      + host_resource_group_arn              = (known after apply)
      + iam_instance_profile                 = (known after apply)
      + id                                   = (known after apply)
      + instance_initiated_shutdown_behavior = (known after apply)
      + instance_lifecycle                   = (known after apply)
      + instance_state                       = (known after apply)
      + instance_type                        = "t2.micro"
      + ipv6_address_count                   = (known after apply)
      + ipv6_addresses                       = (known after apply)
      + key_name                             = (known after apply)
      + monitoring                           = (known after apply)
      + outpost_arn                          = (known after apply)
      + password_data                        = (known after apply)
      + placement_group                      = (known after apply)
      + placement_group_id                   = (known after apply)
      + placement_partition_number           = (known after apply)
      + primary_network_interface_id         = (known after apply)
      + private_dns                          = (known after apply)
      + private_ip                           = (known after apply)
      + public_dns                           = (known after apply)
      + public_ip                            = (known after apply)
      + region                               = "ap-northeast-1"
      + secondary_private_ips                = (known after apply)
      + security_groups                      = (known after apply)
      + source_dest_check                    = true
      + spot_instance_request_id             = (known after apply)
      + subnet_id                            = (known after apply)
      + tags                                 = {
          + "Name" = "learn-terraform"
        }
      + tags_all                             = {
          + "Name" = "learn-terraform"
        }
      + tenancy                              = (known after apply)
      + user_data_base64                     = (known after apply)
      + user_data_replace_on_change          = false
      + vpc_security_group_ids               = (known after apply)
      + capacity_reservation_specification (known after apply)
      + cpu_options (known after apply)
      + ebs_block_device (known after apply)
      + enclave_options (known after apply)
      + ephemeral_block_device (known after apply)
      + instance_market_options (known after apply)
      + maintenance_options (known after apply)
      + metadata_options (known after apply)
      + network_interface (known after apply)
      + primary_network_interface (known after apply)
      + private_dns_name_options (known after apply)
      + root_block_device (known after apply)
      + secondary_network_interface (known after apply)
    }
Plan: 1 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.
  Enter a value:

変更を承認するため、「yes」と入力します。

承認後、インスタンスの作成が開始されるため、完了まで待機します。

完了後に AWS マネジメントコンソールにアクセスし、インスタンスが作成されたことを確認⁷できました。

8. 状態の確認

Terraform は適用済みインフラの状態を「terraform.tfstate」に記録・管理します。

次のコマンドを実行すると、「terraform.tfstate」のリソース一覧を確認できます。

terraform state list
PS C:\work> terraform state list
data.aws_ami.ubuntu
aws_instance.app_server

次のコマンドを実行すると、「terraform.tfstate」のリソースの詳細を確認できます。

terraform show

まとめ

本記事では「【初心者向け】Windows OS 環境で Terraform を実行する準備手順 」に続き、Terraform を用いてインスタンスを作成した手順を説明しました。
全体の流れは以下の 3 ステップです。

  1. Terraform の構成ファイル「terraform.tf」と「main.tf」を作成
  2. 作業ディレクトリを初期化(terraform init
  3. 構成ファイルに基づき、インフラを変更(terraform apply

今回は Terraform のチュートリアルに沿ってインスタンスを作成しました。
チュートリアルには続きとして「設定の変更」や「リソースの削除」があるため、これらも共有できればと思います。

本記事が少しでもお役に立てば幸いです。

参考文献

¹ "Create infrastructure | Terraform | HashiCorp Developer". HashiCorp Developer. https://developer.hashicorp.com/terraform/tutorials/aws-get-started/aws-create, (参照 2026-02-22)
² "hashicorp/aws | Terraform Registry". Terraform Registry. https://registry.terraform.io/providers/hashicorp/aws/latest, (参照 2026-02-22)
³ "Terraform Versions | HashiCorp Releases" HashiCorp Releases. https://releases.hashicorp.com/terraform/, (参照 2026-02-22)
⁴ "aws_ami | Data Sources | hashicorp/aws | Terraform | Terraform Registry". Terraform Registry. https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami, (参照 2026-02-24)
⁵ "describe-images -- AWS CLI 2.33.27 Command Reference". AWS Documentation. https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html, (参照 2026-02-24)
⁶ "Find Ubuntu images on AWS - Ubuntu on AWS documentation". ubuntu.com. https://documentation.ubuntu.com/aws/aws-how-to/instances/find-ubuntu-images/#ownership-verification, (参照 2026-02-24)
⁷ "インスタンス | EC2 | ap-northeast-1". Amazon Web Services. https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#Instances:, (参照 2026-02-22)

使用環境

作成手順」に掲載したスクリーンショットと出力は、以下環境での実行結果を引用しています。

  • OS: Windows Server 2025 Datacenter (24H2). Microsoft.
  • ターミナル: PowerShell (Ver 5.1.26100.32370). Microsoft.
  • Terraform (Ver 1.14.5). HashiCorp.
  • AWS CLI (Ver 2.33.27). Amazon Web Services.

この記事は私が書きました

Hirano

記事一覧

AWSの知見を身につけるため、一大決心でP&Sに入社しました。 目標はシステム改善に大きく貢献できるエンジニアになることです。 簡単な内容であっても自身が戸惑った点を投稿することで、同じ苦労をしている方の助けになれば嬉しいです!

Hirano

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。