본문 바로가기
INFRA/Operation

Terraform Script 파일 사용 웹 설치 방법 - AWS

by BTC_Dana 2022. 8. 9.
안녕하세요!
하씨가문의 영광입니다!

지난 시간에 Azure Terraform에서 Script 파일을 통해서 웹 어플리케이션을 만들어봤는데요!
이번 시간에는 AWS Terraform의 Script 파일을 이용하여 웹 어플리케이션을 띄어보도록 하겠습니다!!
Don't have a good day, Have a great day!

 

목차

  1. AWS Terraform 리소스 사전 작업
  2. Terraform 리소스 배포
  3. 웹 어플리케이션

 


1. AWS Terraform 리소스 사전 작업
  • 사전 작업은 지~~난번 시간에 세팅 작업을 한번 구성해보아서 스킵하고 넘어가겠습니다.
  • 사전 작업의 내용은 이렇게 구성되어 있습니다.
    • AWS IAM 계정 생성
    • VSCode 워크스페이스 생성
    • AWS CLI 설치
    • AWS CLI 사용자 설정
    • 테라폼 초기화
참조 문서 : https://btcd.tistory.com/244?category=927626

 

2. Terraform 리소스 배포
  • 앞선 사전 작업을 마쳤다면 지금부터는 리소스 배포를 시작하겠습니다.

 

2.1 main.tf
  • 먼저 Main.tf에서는 aws provider가 설정되어야 합니다.
  • 되도록이면 Terraform은 최신버전권장합니다.
2.2 VPC
  • VPC 구성 목록은 다음과 같습니다.
    • VPC
    • Subnet
    • Internet-gateway
    • Route-table
    • Route-table-assosiation
# VPC
resource "aws_vpc" "dana-vpc" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "dana-vpc"
  }
}

# VPC의 Subnet
resource "aws_subnet" "dana-subnet-1" {
  vpc_id     = aws_vpc.dana-vpc.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "ap-northeast-2a"

  tags = {
    Name = "dana-subnet-01"
  }
}

# 인터넷 게이트웨이
resource "aws_internet_gateway" "dana-ig" {
  vpc_id = aws_vpc.dana-vpc.id

  tags = {
    Name = "dana-ig"
  }
}

# 라우팅 테이블
resource "aws_route_table" "dana-rt" {
  vpc_id = aws_vpc.dana-vpc.id
  route  {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.dana-ig.id
  }
  tags = {
    "Name" = "dana-rt"
  }
}

# 라우팅 테이블에 서브넷 연결
resource "aws_route_table_association" "dana-rta" {
  subnet_id = aws_subnet.dana-subnet-1.id
  route_table_id = aws_route_table.dana-rt.id
}
2.3 Security Group
  • 다음은 보안 그룹입니다.
    • Inbound-Rule - HTTP(Web), SSH(원격접속), ICMP(Ping)
    • Outbound-Rule
# 보안 그룹
resource "aws_security_group" "jinwoo-sg" {
  name        = "Allow Basic"
  description = "Allow HTTP,SSH"
  vpc_id      = aws_vpc.dana-vpc.id

  # HTTP 허용
  ingress = [
    {
      description      = "Allow HTTP"
      from_port        = 80
      to_port          = 80
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
      prefix_list_ids  = null
      security_groups  = null
      self             = null
    },
  # SSH 허용
    {
      description      = "Allow SSH"
      from_port        = 22
      to_port          = 22
      protocol         = "tcp"
      cidr_blocks      = ["211.205.9.172/32"]
      ipv6_cidr_blocks = ["::/0"]
      prefix_list_ids  = null
      security_groups  = null
      self             = null
    },
  # ICMP 허용
    {
      description      = "Allow ICMP"
      from_port        = 0
      to_port          = 0
      protocol         = "icmp"
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
      prefix_list_ids  = null
      security_groups  = null
      self             = null
    }
  ]

  # 아웃바운드
  egress = [
    {
      description      = "ALL"
      from_port        = 0
      to_port          = 0
      protocol         = -1
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
      prefix_list_ids  = null
      security_groups  = null
      self             = null
    }
  ]

  tags = {
    "Name" = "web-sg"
  }
}
2.4 EC2
  • 다음은 인스턴스구성 목록리소스 구성입니다.
    • Network-interface
    • instance
    • Key-pair
    • Eip
# 네트워크 인터페이스
resource "aws_network_interface" "dana-ni" {
  subnet_id = aws_subnet.dana-subnet-1.id
  security_groups = [aws_security_group.jinwoo-sg.id]
  tags = {
    "Name" = "dana-web-ni"
  }
}

# 인스턴스
resource "aws_instance" "dana-web" {
  ami = "ami-0e4a9ad2eb120e054" # 기존 프리티어 이미지입니다.
  instance_type = "t2.small" # 프리티어
  key_name = "dana_key" # 키는 로컬에서 발급받은 키입니다.
  availability_zone = "ap-northeast-2a"

# 위에서 만든 네트워크 인터페이스를 부착하는 부분입니다.
  network_interface {
    network_interface_id = aws_network_interface.dana-ni.id
    device_index = 0
  }

# 중요!! 오늘의 주제에 해당하는 스크립트 파일입니다.
# 원래는 파일을 생성하여 파일경로를 추가해야 하는 데 그 작업은 다음 시간에 알려드리겠습니다.
# 설명하자면 인스턴스를 업데이트 아파치를 설치하고 시작하는 부분입니다.
  user_data = <<EOF
  #!/bin/bash
  sudo yum update -y
  sudo yum install httpd -y
  sudo systemctl start httpd
  sudo systemctl enable httpd
  EOF

  tags = {
    "Name" = "dana-web"
  }
}

# 로컬에서 만든 PUB키를 AWS에 등록하는 부분입니다.
resource "aws_key_pair" "dana_key" {
  key_name   = "dana_key"
  public_key = "${file("./dana.key.pub")}"
}

# Elastic IP 
resource "aws_eip" "dana-eip" {
  vpc = true
  instance = aws_instance.dana-web.id # 원하는 인스턴스에 부착
  depends_on = [
    aws_internet_gateway.dana-ig
  ]
}
2.5 파일 구성
  • 파일은 main, ec2, sg, vpc로 구성하였고, 각 파일에 만들어둔 테라폼 코드를 입력하시면 됩니다!!

3. 웹 어플리케이션
  • 모든 작업이 끝났다면 지~~~난 시간에 배웠던 PowerShell에서 apply실행시킵니다!
terraform apply --auto-approve
  • 적용이 완료되면 다음과 같이 리소스 배포가 다되었다는 화면을 출력합니다!

 

  • 그리고 웹 어플리케이션에 접속하여 웹 화면이 잘 나오는지 확인해봅시다!!

다음과 같이 나왔다면 성공입니다!

만약에 오류가 발생한다면 키를 생성하는 부분, 스크립트 파일을 확인해보시길 바랍니다!

추가적으로 다음 주제는 테라폼안에서 각 리소스들에 대한 설명과 역할에 대해서 설명드리겠습니다..!

 

 

이렇게 테라폼에서 script 파일을 적용시켜 웹 어플리케이션을 띄어봤는데요!
간단하면서 세밀한 작업이 필요한 거 같아요!
인스턴스에 접속해서 커멘드를 날릴 필요없이 테라폼내에서 바로 적용하여 웹을 띄우는 작업
실질적으로 굉장히 편리한 거 같습니다!
오늘도 읽어주셔서 감사합니다!

댓글