【未経験向け】CCNA(200-301)とは? NW未経験が1ヶ月で合格した際に使用した魔法の学習教材、サイトを紹介!!!

TerraformでAWS上にWebサーバを立てるだけの記事

AWS

本記事は表題の通り、TerraformでAWS上にWebサーバを立てるだけの記事になります。

Terraform初学者が最初に訪れる場所、振り返れる場所になれば良いかなと思います。

スポンサーリンク

概要

  • 目的:
    TerraformでAWS上にWebサーバを構築する
  • 注意事項:
    Amazon Linux 2の使用を前提としています。2023verで試すとApacheのページが反映されない、SSH接続できない等の事象が発生する可能性があります
  • 環境:
    • IaaS:AWS
    • Terraform Version:Terraform v1.7.5

ハンズオン

Terraformのコード

構築するリソースは下記の通りです。

  • VPC ※Cidr 10.0.0.0/16
  • Subnet(1つ) ※Cidr 10.0.1.0/24
  • RouteTable
  • Elastic Internet Gateway
  • Security Group
  • EC2(1台)
# Configure the AWS Provider
provider "aws" {
  region = "ap-northeast-1"
  access_key = "********************"
  secret_key = "****************************************"
}

# Row Code
# resource "<provider>_<resource_type>" "name" {
#   key1 = "value1"
#   key2 = "value2"
# }

#1 VPC作成
resource "aws_vpc" "sample-vpc" {
  cidr_block       = "10.0.0.0/16"
  tags = {
    Name = "sample-vpc"
  }
}

#2 インターネットゲートウェイ作成
resource "aws_internet_gateway" "sample-internet-gateway" {
  vpc_id = aws_vpc.sample-vpc.id
  tags = {
    Name = "sample-internet-gateway"
  }
}

#3 ルートテーブル作成
resource "aws_route_table" "sample-route-table" {
  vpc_id = aws_vpc.sample-vpc.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.sample-internet-gateway.id
  }
  route {
    ipv6_cidr_block = "::/0"
    gateway_id = aws_internet_gateway.sample-internet-gateway.id
  }
  tags = {
    Name = "sample-route-table"
  }
}

#4 サブネット作成
resource "aws_subnet" "sample-subnet" {
  vpc_id     = aws_vpc.sample-vpc.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "ap-northeast-1c"
  tags = {
    Name = "sample-subnet"
  }
}

#5 サブネットとルートテーブルの紐付け
resource "aws_route_table_association" "sample-association" {
  subnet_id      = aws_subnet.sample-subnet.id
  route_table_id = aws_route_table.sample-route-table.id
}

#6 セキュリティグループ作成(ポート22,80,443許可)
resource "aws_security_group" "sample-security-group" {
  name        = "sample-security-group"
  description = "Allow Web Inbound Traffic"
  vpc_id      = aws_vpc.sample-vpc.id

  ingress {
    description      = "HTTPS"
    from_port        = 443
    to_port          = 443
    protocol         = "tcp"
    cidr_blocks      = ["0.0.0.0/0"]
  }
  ingress {
    description      = "HTTP"
    from_port        = 80
    to_port          = 80
    protocol         = "tcp"
    cidr_blocks      = ["0.0.0.0/0"]
  }
  ingress {
    description      = "SSH"
    from_port        = 22
    to_port          = 22
    protocol         = "tcp"
    cidr_blocks      = ["0.0.0.0/0"]
  }
  egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
  }
  tags = {
    Name = "sample-security-group"
  }
}

#7 Elastic Network Interface(ENI)作成
resource "aws_network_interface" "sample-nw-interface" {
  subnet_id       = aws_subnet.sample-subnet.id
  private_ips     = ["10.0.1.50"]
  security_groups = [aws_security_group.sample-security-group.id]
}

#8 EIP(Elastic IP)作成、ENIに紐付け
resource "aws_eip" "sample-eip" {
  vpc                       = true
  network_interface         = aws_network_interface.sample-nw-interface.id
  associate_with_private_ip = "10.0.1.50"
  depends_on = [aws_internet_gateway.sample-internet-gateway, aws_instance.sample-instance]
}

#9 Webサーバー構築(Linuxサーバー構築、Apacheインストール、index.html作成)
resource "aws_instance" "sample-instance" {
  ami = "**AMIID**" # AL2を指定して下さい
  instance_type = "t2.micro"
  availability_zone = "ap-northeast-1c"
  # key_name = "**KeyName**"

  network_interface {
    device_index = 0
    network_interface_id = aws_network_interface.sample-nw-interface.id
  }

  user_data = <<-EOF
              #!/bin/bash
              sudo yum -y install httpd
              sudo systemctl start httpd.service
              sudo bash -c 'echo Success Page > /var/www/html/index.html'
              EOF
  tags = {
    Name = "sample-ec2-instance"
  }
}

AWS環境へデプロイする

  • planコマンドでリソースの作成結果をDryRun出力する
$ terraform plan
  • applyコマンドで実際にリソースを構築する
$ terraform apply

動作確認

  • 動作確認内容:
    構築したWebサーバにブラウザアクセスし、index.htmlの内容が表示されることを確認する

コメント

タイトルとURLをコピーしました