본문 바로가기

Terraform

[Terraform] Terraform 사용법

이번 시간 Terraform을 이용하여 AWS에 Ec2 실행하는법에 대해서 작성 하겠습니다.

 

먼저 AWS 에 가입이 되어 있다는 전제로 글을 작성 하겠습니다.

우선 IAM에서 새로운 계정을 만드시거나 Admin 계정을 이용하여 액세스키를 발급을 받아줍니다.

이때 발급 받은 액세스키는 다시 볼 수 없기 때문에 엑셀 파일을 저장하거나 키를 어딘가에 저장 해주시기를 바랍니다.

 

AWS CLI 설치 및 Credentials 등록

 

brew install awscli

aws configure

aws configure list

aws cli가 설치가 안되어 있다면 먼저 cli를 설치 해줍니다.

그 후에 aws configure 명령어를 입력하여 위에 발급 받은 액세스키와 시크릿키 그리고 해당 리전들을 입력해줍니다.

 

위의 그림와 같이 나오면 제대로 등록이 된거입니다.

 

Key Pair  등록

먼저 KeyPair 등록하기 위해서 keygen을 만들어줍니다.

 

# -t: 암호화 타입
# -b: 비트 수
# -C: 코멘트
# -f: 파일 저장 경로
# -N: 암호화 옵션
$ ssh-keygen -t rsa -b 4096 -C "" -f "{저장하고자하는 경로}/tf-key-pair" -N ""

ssh-keygen -t rsa -b 4096 -C "" -f "./terraform"

 

 

resource "aws_key_pair" "tf-key" {
  key_name   = "terraform"
  public_key = file("./key/terraform.pub")

  tags = {
    description = "terraform key pair import"
  }
}

그 후 위와 같이 입력 후 terraform을 시작하면 아래의 이미지처럼 키페어가 생성된 것을 볼수 있습니다. 

key pair을 생성을 했으니 Ec2를 만들어보겠습니다. 

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

// Ec2 설정
resource "aws_instance" "example" {
  //위에 설정한 AMI로 생성
  ami                    = data.aws_ami.ubuntu.id
  //EC2 type 지정
  instance_type          = "t2.micro"
  //EC2 만들때 Key설정
  key_name               = aws_key_pair.tf-key.key_name


  //Tag 이름
  tags = {
    Name = "Single-WebSrv"
  }
}

위의 로직을 실행하면 Ec2가 생성되는 모습을 볼 수 있습니다만, 보안 그룹이 설정이 되어 있지 않아 접속이 되지 않습니다

아래와 같이 보안 그룹을 생성 해줍니다.

 

//보안 그룹 룰 지정
resource "aws_security_group" "terraform-sg" {
  name        = "terraform-sg"
  description = "terraform-sg"

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

// 보안 그룹 인바운드 설정 
resource "aws_security_group_rule" "terraform-http" {
  type              = "ingress"
  // Port 범위 설정
  from_port         = 80
  to_port           = 80
  //프로토콜 설정
  protocol          = "TCP"
  // IP 설정
  cidr_blocks       = ["0.0.0.0/0"]
  // 보안 그룹 지정
  security_group_id = aws_security_group.terraform-sg.id

  lifecycle { create_before_destroy = true }
}

// 보안 그룹 아웃바운드 설정
resource "aws_security_group_rule" "terraform-http-egress" {
  type              = "egress"
  // Port 범위 설정
  from_port         = 80
  to_port           = 80
  //프로토콜 설정
  protocol          = "TCP"
  // IP 설정
  cidr_blocks       = ["0.0.0.0/0"]
  // 보안 그룹 지정
  security_group_id = aws_security_group.terraform-sg.id

  lifecycle { create_before_destroy = true }
}

resource "aws_security_group_rule" "terraform-ssh" {
  type              = "ingress"
  from_port         = 22
  to_port           = 22
  protocol          = "TCP"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.terraform-sg.id

  lifecycle { create_before_destroy = true }
}

resource "aws_security_group_rule" "terraform-https-ssh" {
  type              = "egress"
  from_port         = 22
  to_port           = 22
  protocol          = "TCP"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.terraform-sg.id

  lifecycle { create_before_destroy = true }
}

이러면 이제 ec2를 ssh로 접속 할 수 있습니다. 

이제 ec2가 생성되면서 자동으로 apache를 설치하여 실행되게 할려면 user_data를 이용하여 할 수 있습니다.

Ec2생성할 때 사용자 데이터라고 생각하면 됩니다.

 

아래는 총 코드입니다.

resource "aws_instance" "example" {
  ami                    = data.aws_ami.ubuntu.id
  instance_type          = "t2.micro"
  //보안 그룹 지정 
  vpc_security_group_ids = [aws_security_group.terraform-sg.id]
  key_name               = aws_key_pair.tf-key.key_name

  //사용자 데이터 설정
  user_data = <<-EOF
                #!/bin/bash
                sudo apt-get update -y
                sudo apt-get install -y apache2
                sudo echo "<html><body><h1>Hello</h1></body></html>" > /var/www/html/index.html
                sudo systemctl enable apache2
                sudo systemctl start apache2
                EOF

  tags = {
    Name = "Single-WebSrv"
  }
}

resource "aws_security_group" "terraform-sg" {
  name        = "terraform-sg"
  description = "terraform-sg"

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

resource "aws_security_group_rule" "terraform-http" {
  type              = "ingress"
  from_port         = 80
  to_port           = 80
  protocol          = "TCP"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.terraform-sg.id

  lifecycle { create_before_destroy = true }
}

resource "aws_security_group_rule" "terraform-http-egress" {
  type              = "egress"
  from_port         = 80
  to_port           = 80
  protocol          = "TCP"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.terraform-sg.id

  lifecycle { create_before_destroy = true }
}

resource "aws_security_group_rule" "terraform-ssh" {
  type              = "ingress"
  from_port         = 22
  to_port           = 22
  protocol          = "TCP"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.terraform-sg.id

  lifecycle { create_before_destroy = true }
}

resource "aws_security_group_rule" "terraform-https-ssh" {
  type              = "egress"
  from_port         = 22
  to_port           = 22
  protocol          = "TCP"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.terraform-sg.id

  lifecycle { create_before_destroy = true }
}

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_key_pair" "tf-key" {
  key_name   = "terraform"
  public_key = file("./key/terraform.pub")

  tags = {
    description = "terraform key pair import"
  }
}


// 테라폼 터미널에서 나올 로그
output "public_ip" {
  value       = aws_instance.example.public_ip
  description = "The public IP of the Instance"
}

// 테라폼에서 사용할 변수 사용
variable "nickname" {
  description = "Your nickname"
  type        = string
  default     = "테스트 이름" # 원하는 닉네임으로 변경하세요
}

그러면 아래와 같이 나옵니다.