はじめに
AWS SAAを取得したため、実際にAWS上へリソースを構築しながら理解を深めたいと考えました。
また、近年はIaC(Infrastructure as Code)を利用してクラウドインフラを構築する機会が増えています。
TerraformはAWSだけでなく、AzureやGCPにも対応したマルチクラウド対応のIaCツールです。
今回はTerraformを利用してAWS上へインフラを構築してみます。
今回やりたいこと
・Terraformのインストール
・AWS認証情報の登録
・Terraformを使ったAWSリソースの作成
・基本的なTerraformのコマンド
環境
・Mac OS Sequoia(15.7.7)
・Terraform (1.15.8)
・Homebrew (6.0.12)
実装
1. Homebrewのインストール
私の環境では、Homebrewのインストールがされているため、インストールについては記載しておりません。
公式サイトにてインストールについて記載されてますので、こちらを参照してください。
・インストールが完了しているか確認
$ brew update
==> Updating Homebrew...
Already up-to-date.
$ brew --version
Homebrew 6.0.12
2. Terraformのインストール
次はHomebrewを使って、実際にTerraformをインストールしていきます。
公式サイトに記載してあるインストール手順に沿って実行していきます。
・Terraformをインストール
$ brew tap hashicorp/tap
$ brew install hashicorp/tap/terraform
・インストールされているか確認
$ terraform version
Terraform v1.15.8
on darwin_arm64
・Homebrewで管理されていることを確認
$ which terraform
/opt/homebrew/bin/terraform
バージョンが返ってきていれば、Terraformインストール完了です。
3. AWS CLIのインストール
・AWS CLIをインストール
$ brew install awscli
・AWS CLIがインストールされていることを確認
$ aws --version
aws-cli/2.36.5 Python/3.14.6 Darwin/24.6.0 source/arm64
4. AWS認証情報の登録
次は、AWS認証情報を登録していきます。
TerraformがAWS APIを呼び出してリソースを作成・変更・削除するため、AWSへの認証情報を登録する必要があります。
まずはAWSのマネジメントコンソール上で、IAMユーザを作成します。
今回は、"terraform_study"グループを作成し、"tsumuraya_takumi"ユーザを追加してます。
今回は学習目的のため AdministratorAccess を付与していますが、実際の運用では、必要最小限のIAMポリシーを付与することが推奨されています。
・IAMユーザを作成
・アクセスキーを作成
作成されたキーを実際に登録していきます。
今回は東京リージョンかつJson形式で出力されるように設定します。
・アクセスキーとシークレットキーを登録
$ aws configure
# 下記のように聞かれるため、IAMユーザ作成した際に出力されたキーを入力
AWS Access Key ID [None]: (アクセスキー)
AWS Secret Access Key [None]: (シークレットキー)
Default region name [None]: (ap-northeast-1)
Default output format [None]: (json)
・設定した認証情報の確認
$ aws configure list
NAME : VALUE : TYPE : LOCATION
profile : <not set> : None : None
access_key : **************** : shared-credentials-file :
secret_key : **************** : shared-credentials-file :
region : ap-northeast-1 : config-file : ~/.aws/config
AWSの STS(Security Token Service) にリクエストを送り、「現在認証されているユーザーは誰か」を問い合わせていきます。
・AWSへ認証ユーザを問い合わせし、認証したユーザが登録されていることを確認
$ aws sts get-caller-identity
{
"UserId": "AIDAXXXXXXXXXXXXXXXX",
"Account": "1234567890",
"Arn": "arn:aws:iam::1234567890:user/tsumuraya_takumi"
}
5. AWSリソースの作成
これでリソースを作成する環境は整いました。
実際にTerraformのコードから、AWS上にEC2インスタンスを立ち上げてみたいと思います。
まずは実装したいAWS構成図は下記になります。
まずはサーバ接続に必要なキーペアをローカルで作成してきます。
$ ssh-keygen -t ed25519 -f ~/.ssh/terraform-key
・下記のように各ファイルを作成し編集
data.tf(AMI参照)
data "aws_ami" "app" {
most_recent = true
owners = ["self", "amazon"]
filter {
name = "name"
values = ["al2023-ami-*-x86_64"]
}
filter {
name = "root-device-type"
values = ["ebs"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
network.tf(ネットワーク設定)
# -----------------------
# Vpc
# -----------------------
resource "aws_vpc" "vpc" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"
enable_dns_hostnames = true
enable_dns_support = true
assign_generated_ipv6_cidr_block = false
tags = {
Name = "${var.project}-${var.environment}-vpc"
Project = var.project
Env = var.environment
}
}
# -----------------------
# Subnet
# -----------------------
resource "aws_subnet" "public_subnet_1a" {
vpc_id = aws_vpc.vpc.id
availability_zone = "ap-northeast-1a"
cidr_block = "10.0.0.0/24"
map_public_ip_on_launch = true
tags = {
Name = "${var.project}-${var.environment}-vpc"
Project = var.project
Env = var.environment
}
}
# ------------------------
# Route Table
# ------------------------
resource "aws_route_table" "public_rt_1a" {
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.environment}-public-rt-1a"
Project = var.project
Env = var.environment
Type = "public"
}
}
resource "aws_route_table_association" "public_rt_assoc_1a" {
route_table_id = aws_route_table.public_rt_1a.id
subnet_id = aws_subnet.public_subnet_1a.id
}
# ------------------------
# Internet Gateway
# ------------------------
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.vpc.id
tags = {
Name = "${var.project}-${var.environment}-igw"
Project = var.project
Env = var.environment
}
}
resource "aws_route" "public_rt_igw_1a" {
route_table_id = aws_route_table.public_rt_1a.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
provider.tf(プロバイダー設定)
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
security.tf(セキュリティ設定)
resource "aws_security_group" "server_sg" {
name = "${var.project}-${var.environment}-sg"
vpc_id = aws_vpc.vpc.id
ingress {
description = "SSH for Internet"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
description = "All outbound"
from_port = 0
to_port = 0
protocol = -1
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "${var.project}-${var.environment}-server-sg"
Project = var.project
Env = var.environment
}
}
server.tf(インスタンス設定)
# ------------------------
# Key pair
# ------------------------
resource "aws_key_pair" "keypair" {
key_name = "${var.project}-${var.environment}-keypair"
public_key = file(pathexpand("~/.ssh/terraform-key.pub"))
tags = {
Name = "${var.project}-${var.environment}-keypair"
Project = var.project
Env = var.environment
}
}
# ------------------------
# Server
# ------------------------
resource "aws_instance" "server" {
ami = data.aws_ami.app.id
instance_type = "t3.micro"
subnet_id = aws_subnet.public_subnet_1a.id
associate_public_ip_address = true
key_name = aws_key_pair.keypair.key_name
vpc_security_group_ids = [aws_security_group.server_sg.id]
tags = {
Name = "${var.project}-${var.environment}-server"
Project = var.project
Env = var.environment
}
}
terraform.tfvars(変数の値)
project = "terraform"
environment = "study"
variables.tf(変数定義)
# ------------------------
# Tag name
# ------------------------
variable "project" {
type = string
}
variable "environment" {
type = string
}
6. AWS上に反映
Terraformで記載した内容を、実際にapplyしてAWS上に反映していきましょう。
・Terraformの初期化(初回のみ実行)
$ terraform init
・記述したコードを見やすいように整形
$ terraform fmt
・構文のチェック
$ terraform validate
Success! The configuration is valid.
・作られるリソースの確認
$ terraform plan
・リソースの作成
$ terraform apply -auto-approve
-auto-approve を付与すると、実行前の確認画面をスキップしてリソースを作成できます。
付与しない場合は、作成予定のリソース一覧が表示され、最後に yes を入力することでリソースが作成されます。
apply を実行すると実際にEC2インスタンス上に、「terraform-study-server」という、インスタンスがAWS上に作られているはずです。
他にも、VPCやサブネットなどもAWSコンソール上で作成されていることを確認できると思います。
最後にSSHポートを開放しているので、SSHを使って、サーバに接続できる確認していきましょう。
・terraform-study-serverサーバに接続
$ ssh -i ~/.ssh/terraform-key ec2-user@[パブリックIP]
, #_
~\_ ####_
~~ \_#####\
~~ \###|
~~ \#/ ___ Amazon Linux 2023 (ECS Optimized)
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
For documentation, visit http://aws.amazon.com/documentation/ecs
[ec2-user@ip-10-0-0-123 ~]$
学習後は不要な課金を防ぐため、以下のコマンドでリソースを削除しましょう。
・リソースの削除
$ terraform destroy
AWSコンソール上でも作成されたリソースが削除されていることを確認できると思います。
学んだこと
今回Terraformを利用してAWS環境を構築したことで、以下の点を学ぶことができました。
- TerraformはコードからAWSリソースを構築できるIaCツールであること
- terraform init、plan、apply の役割
- AWS ProviderがAWS CLIの認証情報を利用してAWS APIへアクセスしていること
- Terraformではリソース間の依存関係を意識してコードを書くこと
- Terraformで構築したリソースは terraform destroy により簡単に削除できること
TerraformはAWSリソースをコードで管理できるため、同じ環境を何度でも再現できる点が大きなメリットだと感じました。今後はより実務に近い構成を構築しながら理解を深めていきたいと思います。
今後やりたいこと
今回はVPCとEC2を構築しましたが、今後は以下にも挑戦したいと思います。
- ALBの構築
- Auto Scaling
- RDS
- NAT Gateway
- S3
- Terraform Module
- Remote Backend(S3 + DynamoDB)
- GitHub ActionsによるTerraform自動実行
まとめ
Terraformを利用することで、AWSリソースをコードで管理・再現できることを体験できました。
今後はALBやRDS、Remote Backend、Moduleなども取り入れながら、より実務に近いAWS環境をTerraformで構築していきたいと思います。



