0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformでAWS環境を構築してみた ~Terraform導入からEC2作成・SSH接続まで~

0
Last updated at Posted at 2026-08-01

はじめに

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ユーザを作成

スクリーンショット 2026-07-23 11.16.37.png

・アクセスキーを作成

スクリーンショット 2026-07-23 11.29.38.png

作成されたキーを実際に登録していきます。
今回は東京リージョンかつ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構成図は下記になります。

スクリーンショット 2026-08-01 10.28.43.png

まずはサーバ接続に必要なキーペアをローカルで作成してきます。

$ ssh-keygen -t ed25519 -f ~/.ssh/terraform-key

・下記のように各ファイルを作成し編集

data.tf(AMI参照)
data.tf
  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(ネットワーク設定)
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(プロバイダー設定)
provider.tf
terraform {
  required_version = ">= 1.5"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}
security.tf(セキュリティ設定)
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(インスタンス設定)
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(変数の値)
terraform.tfvars
project     = "terraform"
environment = "study"
variables.tf(変数定義)
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上に作られているはずです。

スクリーンショット 2026-07-31 14.24.29.png

他にも、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で構築していきたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?