はじめに
この記事では IaC(Infrastructure as Code) と Terraform を使って、AWSのネットワーク〜サーバーまでをコードで構築し、最後は跡形もなく削除するまでの一連の流れをハンズオン形式で体験します。
対象読者
- AWSを触り始めたばかりの方
- IaCやTerraformという言葉を聞いたことはあるが、まだ試したことがない方(単語を知らない人でもOK)
- Windows 11 環境で手を動かしたい方
おさえておきたい用語
IaC(Infrastructure as Code)とは?
IaC は「インフラをコードで管理する」という考え方です。
従来はAWSのコンソール画面を手動でポチポチ操作してサーバーやネットワークを作っていました。IaCでは、その操作内容をテキストファイル(コード)に書いておきます。
Terraform(テラフォーム)とは?
Terraform は HashiCorp 社が開発した、IaCを実現するためのオープンソースツールです。
AWSだけでなく、GCPやAzureなど様々なクラウドに対応しているのが特徴で、業界標準として広く使われています。.tf という拡張子のファイルにインフラの構成を記述し、コマンド一発でAWSに反映させることができます。
HCL(HashiCorp Configuration Language)とは?
Terraformのコードを書くための専用言語です。JSONに近い読みやすい構文で、初心者にも取り組みやすい設計になっています。
HCLで書いたコードをTerraformに読ませて、AWS上でシステムを作る仕組みがIaCの1種ということですな。
事前準備
必要なもの
- Windows 11 PC
- AWSアカウント(無料枠で対応可能)
本ハンズオンで作成するリソース(EC2、VPC等)は無料枠の範囲内ですが、作業後は必ず terraform destroy を実行してリソースを削除してください。 放置すると料金が発生する場合があります。
【STEP 1】AWS側の準備(コンソール操作)
TerraformがAWSを操作できるよう、AWS側でユーザーと認証情報を作成します。
1. IAMユーザーの作成
- AWSマネジメントコンソールにルートユーザーでログイン
-
IAM サービスを開き、新規ユーザー(例:
tf-user)を作成 - 許可ポリシーとして 「AdministratorAccess」 をアタッチ
AdministratorAccess は強力な権限です。今回は学習用のためフルコントロールを付与しますが、基本的には必要最小限の権限のみを付与するようにしましょう。
2. アクセスキーの発行
- 作成したユーザーの 「セキュリティ認証情報」 タブを開く
-
「アクセスキーを作成」 を選択(ユースケース:
CLI) - 表示される アクセスキーID と シークレットアクセスキー を必ずメモしておく
【STEP 2】ローカル環境の準備
1. AWS CLIの初期設定
コマンドプロンプトを開いて以下を実行します。
aws configure
プロンプトに従って入力します。
AWS Access Key ID [None]: <発行したアクセスキーID>
AWS Secret Access Key [None]: <発行したシークレットアクセスキー>
Default region name [None]: ap-northeast-1
Default output format [None]: json
2. AWSとの通信テスト
設定が正しく完了しているか確認します。
# IAMユーザーの一覧が表示されれば接続成功
aws iam list-users
ユーザー情報のJSONが返ってきたら成功です。
3. Terraformのインストール
コマンドプロンプトで以下のコマンドを実行します。
winget install Hashicorp.Terraform
※途中で同意を求められたら Y を入力します。
※インストール完了後、設定を反映させるためにコマンドプロンプトを一度閉じて、開き直してください。
4. Terraformのインストール確認
新しく開いたコマンドプロンプトで以下を実行します。
# バージョンが表示されればインストール成功
terraform -v
【STEP 3】作業フォルダとコードの作成
1. 作業フォルダの作成
# 作業用フォルダを作成して移動
mkdir aws-study
cd aws-study
2. main.tf の作成
フォルダ内に main.tf というファイルを作成し、以下の内容を記述します。
# AWSプロバイダーの設定(東京リージョンを使用)
provider "aws" {
region = "ap-northeast-1"
}
# VPC(仮想ネットワーク)の作成
resource "aws_vpc" "study_vpc" {
cidr_block = "10.0.0.0/16" # このVPCで使うIPアドレスの範囲
tags = { Name = "terraform-study-vpc" }
}
# サブネット(VPC内の小さなネットワーク区画)の作成
resource "aws_subnet" "study_subnet" {
vpc_id = aws_vpc.study_vpc.id # 上で作ったVPCの中に作成
cidr_block = "10.0.1.0/24" # サブネットのIPアドレス範囲
availability_zone = "ap-northeast-1a" # 東京AZを指定
tags = { Name = "terraform-study-subnet" }
}
# 最新のAmazon Linux 2023 AMIを自動取得
data "aws_ami" "amazon_linux_3" {
most_recent = true
owners = ["137112412989"] # AWSが公式に提供しているAMIのオーナーID
filter {
name = "name"
values = ["al2023-ami-2023.*-x86_64"] # Amazon Linux 2023のフィルター条件
}
}
# EC2インスタンス(仮想サーバー)の作成
resource "aws_instance" "hello_aws" {
ami = data.aws_ami.amazon_linux_3.id # 上で取得したAMIを使用
instance_type = "t2.micro" # 無料枠対象のインスタンスタイプ
subnet_id = aws_subnet.study_subnet.id # 上で作ったサブネットに配置
tags = { Name = "terraform-study-server" }
}
このコードで作成されるAWSリソースの構成は以下のとおりです。
AWS
└── VPC(10.0.0.0/16)
└── サブネット(10.0.1.0/24)
└── EC2インスタンス(Amazon Linux 2023 / t2.micro)
【STEP 4】Terraformコマンドの実行
ここからが本番です。4つのコマンドを順番に実行します。
1. terraform init(初期化)
# プロジェクトの初期化 & AWSプロバイダープラグインのダウンロード
terraform init
main.tf の provider "aws" を読み取り、AWSを操作するためのプラグインを自動ダウンロードします。
.terraform フォルダが生成されれば成功です。
2. terraform plan(実行計画の確認)
# 「何が作られるか」を事前確認(実際には何も作られない)
terraform plan
現在のコードをもとに「どんなリソースが作成・変更・削除されるか」をシミュレーション表示します。実際のAWSには何も変更を加えません。
+ マークが付いているリソースが新規作成対象です。エラーが出なければOKです。
3. terraform apply(インフラの構築)
# AWSに対してインフラを構築する
terraform apply
確認プロンプトが表示されるので yes と入力してEnterを押します。
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 と入力
成功すると Apply complete! と表示され、terraform.tfstate ファイルが自動生成されます。このファイルにはTerraformが管理するリソースの現在状態がJSON形式で記録されており、次回以降の差分計算に使われます。
4. terraform destroy(インフラの削除)
# 管理しているリソースをすべて削除する
terraform destroy
確認プロンプトに yes と入力すると、作成したリソースがすべて削除されます。
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes ← ここで yes と入力
Destroy complete! と表示されれば完了です。AWSコンソールで確認してリソースが消えていれば成功です!
【解説】4つのコマンドが裏側でやっていること
| コマンド | 役割 | AWSへの変更 |
|---|---|---|
terraform init |
プラグインのダウンロード・初期化 | なし |
terraform plan |
変更内容のシミュレーション表示 | なし |
terraform apply |
実際にリソースを作成・変更・削除 | あり |
terraform destroy |
管理リソースをすべて削除 | あり |
terraform init の仕組み
provider "aws" という記述を読み取り、AWSと通信するための専用プラグイン(プロバイダー)を Terraform Registry から自動ダウンロードします。このステップを踏まないとAWSのAPIを叩けません。
terraform plan の仕組み
「コード(理想)」 と 「tfstateの記録(現実)」 を比較し、差分を表示します。実務では apply の前に必ず実行して「意図しない削除や変更が含まれていないか」をレビューする習慣をつけましょう。
terraform apply の仕組み
plan の結果をもとにAWSのAPIを呼び出してリソースを作成します。構築成功後に自動生成される terraform.tfstate がTerraformの「記憶」です。AWS側で自動割り当てされたインスタンスIDやIPアドレスなど、実際に作られたリソースの全詳細が記録されます。
terraform destroy の仕組み
terraform.tfstate の情報をもとに、管理リソースを一括削除します。ただし「手当たり次第」に削除するのではなく、リソース間の依存関係を自動計算し、安全な順番で解体します。
削除順序(依存関係に従い自動判断)
EC2インスタンス → サブネット → VPC
「VPCを消すには先に中にあるサーバーを消さないといけない」といった依存関係をTerraformが自動で解決してくれます。
おわりに
今回は、まっさらなAWSアカウントに対してTerraformでネットワーク〜サーバーを構築し、最後は跡形もなく削除するという Terraformのライフサイクル全体 を体験しました。
手動(GUI)でのポチポチ作業と比べて、IaCがもたらすメリットを感じることができました。
- 再現性 :同じコードを流すだけで、何度でも同じ環境が作れる
-
差分管理 :
terraform planで変更内容を事前にレビューできる -
安全な削除:
terraform destroy一発で依存関係を考慮した完全削除
私も学習しつつ、記事に起こしつつ体系的な理解をしていきたいと思います。
最後まで読んでいただき、ありがとうございました!