본문 바로가기

AWS - KOR

#010) 테라폼 terraform 으로 VPC, EC2 생성하기

https://www.terraform.io/intro

 

What is Terraform | Terraform by HashiCorp

Terraform is an infrastructure as code tool that lets you build, change, and version cloud and on-prem resources safely and efficiently.

www.terraform.io

사이트로 가서 테라폼 설치 가능합니다.

 

terraform 이란?

인프라스트럭처 자동화중의 하나로 코드로 서비스들을 관리할 수 있는 오픈소스입니다.
오류를 줄이고 관리작업의 효율을 높일 수 있습니다. 

Cloudformation VS Terraform

Cloudformation : aws 자체 서비스로 다른 클라우드 서비스와는 사용이 어렵습니다.
스택 및 구축 관리시 UI 와 호환이 가능하므로 쉽게 제어 및 확인 가능합니다. 
자체로 모듈을 사용하진 않지만 중첩된 스택으로 가능합니다.

Terraform : aws 내부 서비스 cloudformation 과 달리 다른 클라우드 서비스들이나
리소스들을 지원 해 사용 유연성이 큽니다. 따라서 커뮤니티 규모도 클라우드포메이션보다 큽니다.
모듈 사용으로 동일한 구성의 리소스를 재사용할 수 있습니다.

 

 

1. 테라폼 사용 환경 구축하기

 

테라폼 사용을 위한 테스트용 EC2 를 리눅스로 설정 해 둡니다.

 

 

사용할 키를 선택하고 나머지 네트워크들은 기본값으로 해서 바로 생성 합니다.

 

 

방금 생성한 EC2 의 public ip 를 이용 해 ssh 로 접속 해 줍니다. 

 

 

aws cli 사용을 위한 환경을 명령어를 통해 구축 해 줍니다.

cli 설정방법 

 

#008) AWS CLI 로 VPC 와 EC2 생성하기

https://aws.amazon.com/ko/cli/ AWS 명령줄 인터페이스 aws-shell은 명령줄 셸 프로그램으로서, AWS 명령줄 인터페이스를 사용하는 새로운 사용자와 고급 사용자 모두에게 도움이 되는 편의 기능 및 생산성

cloudbim.tistory.com

1. ec2 생성하기 -> 2. cli 유저 생성하기 -> 3.cli 설치 및 설정하기 의 단계를 그대로 따라하시면 됩니다.

 

 

2. 테라폼 설치하기

 

cd ~
mkdir terra
cd terra
wget https://releases.hashicorp.com/terraform/1.2.3/terraform_1.2.3_linux_amd64.zip
unzip terraform_1.2.3_linux_amd64.zip
./terraform --version
cd ~
pwd
PATH=${PATH}:/home/ec2-user/terra
terraform --version

wget 명령어로 terraform v1.2.3 버전을 다운 받습니다.

PATH 명령어로 어디서든 terraform 명령어를 사용하도록 해주고 버전을 확인 해 봅니다.

 

이렇게 버전이 확인 가능하면 테라폼 설치가 완료 된 것입니다.

 

 

 

mkdir aws && cd $_
vi provider.tf
provider "aws" {
  # access_key = "YOUR-ACCESS-KEY"
  # secret_key = "YOUR-SECRETK-KEY"
  region = "ap-northeast-2"
}

terraform init
terraform plan
terraform apply

기본 설정으로 aws 파일에 provider.tf 파일을 만들어주고 기본 값을 설정해줍니다. 

이미 aws 의 cli 에 접속한 상태라서 액세스 키는 상관이 없으며 나머지 값들도 따라서 이미 설정 되어있습니다.

terraform init/plan/apply 명령어로 한번 더 확인 해 봅니다.

 

terraform init : 테라폼의 코드를 스캔하고 어느 공급자인지 확인 한 후 필요한 코드를 다운 받습니다.

terraform plan : 테라폼 작업 수행전 기본 코드의 큰 오류값을 확인 해 줍니다.

terraform apply : 테라폼의 구성파일을 실행합니다. plan 명령어에서 잡지 못한 오류들을 발견 해 줍니다.

 

 

 

3. 테라폼으로 VPC 생성하기

 

terra-vpc.txt
0.00MB

# vi new-vpc.tf
data "aws_availability_zones" "available" {
  state = "available"
}
resource "aws_vpc" "new_vpc" {
  cidr_block  = "192.168.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support = true
  instance_tenancy = "default"

  tags = {
    Name = "NEW-VPC"
  }
}
resource "aws_subnet" "new_public_subnet_2a" {
  vpc_id = aws_vpc.new_vpc.id
  cidr_block = "192.168.0.0/20"
  map_public_ip_on_launch = true
  availability_zone = data.aws_availability_zones.available.names[0]
  tags = {
    Name = "NEW-PUBLIC-SUBNET-2A"
  }
}
resource "aws_subnet" "new_public_subnet_2b" {
  vpc_id = aws_vpc.new_vpc.id
  cidr_block = "192.168.16.0/20"
  map_public_ip_on_launch = true
  availability_zone = data.aws_availability_zones.available.names[1]
  tags = {
    Name = "NEW-PUBLIC-SUBNET-2B"
  }
}
resource "aws_subnet" "new_public_subnet_2c" {
  vpc_id = aws_vpc.new_vpc.id
  cidr_block = "192.168.32.0/20"
  map_public_ip_on_launch = true
  availability_zone = data.aws_availability_zones.available.names[2]
  tags = {
    Name = "NEW-PUBLIC-SUBNET-2C"
  }
}
resource "aws_subnet" "new_public_subnet_2d" {
  vpc_id = aws_vpc.new_vpc.id
  cidr_block = "192.168.48.0/20"
  map_public_ip_on_launch = true
  availability_zone = data.aws_availability_zones.available.names[3]
  tags = {
    Name = "NEW-PUBLIC-SUBNET-2D"
  }
}
resource "aws_internet_gateway" "new_igw" {
  vpc_id = aws_vpc.new_vpc.id
  tags = {
    Name = "NEW-IGW"
  }
}
resource "aws_route_table" "new_public_rtb" {
  vpc_id = aws_vpc.new_vpc.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.new_igw.id
  }
  tags = {
    Name = "NEW-PUBLIC-RTB"
  }
}
resource "aws_route_table_association" "new_public_subnet_2a_association" {
  subnet_id = aws_subnet.new_public_subnet_2a.id
  route_table_id = aws_route_table.new_public_rtb.id
}
resource "aws_route_table_association" "new_public_subnet_2b_association" {
  subnet_id = aws_subnet.new_public_subnet_2b.id
  route_table_id = aws_route_table.new_public_rtb.id
}
resource "aws_route_table_association" "new_public_subnet_2c_association" {
  subnet_id = aws_subnet.new_public_subnet_2c.id
  route_table_id = aws_route_table.new_public_rtb.id
}
resource "aws_route_table_association" "new_public_subnet_2d_association" {
  subnet_id = aws_subnet.new_public_subnet_2d.id
  route_table_id = aws_route_table.new_public_rtb.id
}

VPC 생성을 위해 new-vpc.tf 파일로 다음과 같이 vpc 생성에 필요한 구성요소들을 적어 줍니다.

 

 

terraform init
terraform plan
terraform apply

테라폼 파일을 적용시키기 위한 3가지 명령어를 실행 한 후 마지막 단계에서 yes 로 확인 해 줍니다.

 

 

다음과 같이 새롭게 11개의 구성요소가 추가된것 확인 할 수 있습니다.

 

 

다음과 VPC, 서브넷, 라우트테이블, 인터넷 게이트웨이와 연결상태가 잘 만들어졌습니다.

 

 

4. 테라폼으로 EC2 생성하기

terra-ec2.txt
0.00MB

# vi terra-ec2.tf
resource "aws_instance" "example" {
  ami                    = "ami-0fd0765afb77bcca7"
  instance_type          = "t2.micro"
  subnet_id              = "${aws_subnet.new_public_subnet_2a.id}"
  vpc_security_group_ids = [aws_security_group.instance.id]
  key_name  = "BIM-KEY"
  user_data = <<-EOF
              #!/bin/bash
              yum install -y httpd
              systemctl enable --now httpd
              echo "Hello, Terraform" > /var/www/html/index.html
              EOF

  tags = {
    Name = "terraform-example"
  }
}

resource "aws_security_group" "instance" {

  name = var.security_group_name
  vpc_id = "${aws_vpc.new_vpc.id}"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["192.168.0.0/32"]
  }
  ingress {
    from_port   = -1
    to_port     = -1
    protocol    = "icmp"
    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 = "terraform-sg"
  }
}

variable "security_group_name" {
  description = "The name of the security group"
  type        = string
  default     = "terraform-example-instance"
}

output "public_ip" {
  value       = aws_instance.example.public_ip
  description = "The public IP of the Instance"
}

output "public_dns" {
  value       = aws_instance.example.public_dns
  description = "The Public dns of the Instance"
}

output "private_ip" {
  value       = aws_instance.example.private_ip
  description = "The Private_ip of the Instance"
}

ec2 생성에 필요한 구성요소들을 넣어주고 입력 해 줍니다. 앞서 만든 vpc 의 가용역역 a 에 있는 서브넷을 이용하기 위해 참조 명령어로 넣어주고 보안그룹도 생성해주면서 vpc id 를 참조해 줍니다.

테라폼으로 직접 키를 생성하지 못하기 때문에 미리 만들어놓은 BIM-KEY 키를 사용하겠습니다.

22 포트의 ip 주소는 본인의 ip 주소로 바꿔주어야 합니다.

 

 

terraform init
terraform plan
terraform apply

마찬가지로 terraform 실행 명령어를 적용합니다.

 

 

 

잘 적용됬다는 메세지와 private ip 와 public ip 를 할당 받았습니다.

 

 

테스트용 EC2 와 금방 생성한 terraform-example EC2 가 잘 작동하고 있습니다.

 

 

주소창에 퍼블릭 IP 로 접근하니 유저데이터에 넣었던 문구가 잘 나오고 있습니다.

 

 

마지막으로 ssh 에 키와 함께 접속해보니 잘 접속 할 수 있습니다.

 

 

5. 테라폼으로 삭제하기

 

terraform destroy

terraform destory 명령어로 앞서 생성했던 자원들을 손쉽게 지울 수 있습니다.

 

 

VPC 와 EC2 는 모두 정상적으로 제거되었으며 파일에는 아직 남아있기 때문에 다시 terraform 실행 명령어만 넣어주면

같은 자원들을 쉽게 생성할 수 있으며 필요에 따라 코드를 수정한 뒤 다시 생성할 수 도있습니다.

테스트용 ec2 로 지우면서 마무리 해 줍니다.