Terraform

Terraform 실습 해보기 - 1

황동리 2023. 12. 13. 22:00
반응형

Terraform 실습 목표

 

  1. WordPress + RDS 3Tier 연결 해보기
  2. AWS EKS 클러스터 구축

 

1. AWS CLI 설치 및 설정

 

  1. AWS CLI v2 다운로드
    => 구글에 검색해서 다운로드 하면 됨.
  2. AWS console 접속 -> IAM -> 엑세스 키 발급
    => 엑세스 키 발급 받을 때 꼭 저장해둘 것, 나중에 엑세스 키를 다시 볼 수 없음.
  3. Window cmd 창에서 명령어를 입력하여 AWS 로그인
    window cmd 창에서 AWS 로그인

Terraform으로 인프라 구성하기 전, 위와 같은 순서로 먼저 사전 준비를 해준다.

 

 

2. Terraform 설치 및 환경변수에 설정

https://developer.hashicorp.com/terraform/downloads?product_intent=terraform

 

Install | Terraform | HashiCorp Developer

Explore Terraform product documentation, tutorials, and examples.

developer.hashicorp.com

 

 

위의 홈페이지에서 window.amd 버전으로 설치 후 압축 해제 한 파일을 C:\01_terraform 경로에 넣어준다.
(폴더 경로는 자기가 원하는 곳으로 해주면 됨)

 

그리고 Window 키 + r sysdm.cpl 입력

 

그 후 고급 -> 환경 변수 선택해서 terraform 파일 경로를 추가 해준다.

 

 

환경 변수 설정을 해주면 Window CMD 창에서 terraform 명령어를 사용할 수 있게 된다.

 

 

3. vsCode에서 Terraform 사용하기

 

vsCode를 키고, 아 래 두 개 설치

 

 

 

그 후 vscode에서 터미널을 열어준 뒤 terraform init 명령어를 입력하여 초기 설정을 해준다.

 

 

이제 드디어 코드로 인프라 구성을 시작해보겠다.

 


 

1. VPC 생성

(예시 코드들은 registry.terraform.io 에 있습니다.)

# AWS VPC 생성
resource "aws_vpc" "ksh_vpc" {
  cidr_block           = "100.0.0.0/16"
  enable_dns_hostnames = "true"
  enable_dns_support   = "true"
  tags = {
    Name = "ksh-vpc"
  }
}

 

이후 터미널 창에서 "terraform apply" 를 입력해주면 vpc 생성

 

 

 

 

2. ssh 키 생성

 

  1. cmd 창에서 "ssh-keygen -m PEM -b 3072 -q -N "" -t rsa -f ksh" 명령어를 통해 ssh 키 생성
  2. vscode에서 키 생성
resource "aws_key_pair" "ksh_ssh" {
  key_name = "ksh"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDFaVacEU3z8dwDd0bAZhKdIcFhuw5UBM0PllL9YAxE58VJrDBB5tHdyifl7VIKpcQbdhWh0+MLrtRYRna9dft4KRA4IJXq01cCkOuEaUemqAtnHTSp/hqxIiqz3vBD8yPXtLcMd2WXKXV+QYA9dx7BLsTBUUqVSKsA+2+Eb4mGe26z2TT+jWzO9TNMHP1EJFCalKS/AHCEVLDCSAvMHwbjorye8f2rHP7MZltitMinEDbNykGoXC8U8Yz/5oMJc61JsRtQ2lkX//B7rBSU9JVF+ae6JNZw5Tu8eFmZiDyk1rywIL0L29pwvBJmIjJrE1d8kUX4nkv+yJ+axcx+Cc9FLCpmS4XvF+1UpyFgJzaWcUnkieroLKi9DXfO6s2/7EeN7952w2w9EtB1MZroyzeJqUfIhHPg2AfUGurLtFQqV/EBKcmW3Op7hJjnvbnyJQDNTe4nt7K/dd6G6N4zNKnZYI55Jmczm27BQzmACmMjyoreoYQE35tx9lzUQth4qbE= user@DESKTOP-8DFH9TO"
}
=> 위의 방식으로 만들면 다른 사용자도 public_key 값을 알 수 있기 때문에, 아래와 같이 파일의 경로를 지정해주는 방식으로 만드는 것이 좋다.

resource "aws_key_pair" "ksh1_ssh" {
  key_name = "ksh1"
  public_key = file("../../Users/user/.ssh/ksh.pub")
}

 

 

 

 

3. subnet 생성

resource "aws_subnet" "ksh_weba" {
  vpc_id            = aws_vpc.ksh_vpc.id
  cidr_block        = "100.0.1.0/24"
  availability_zone = "ap-northeast-2a"
  map_public_ip_on_launch = true	# public 존에는 자동 public_ip 할당을 켜준다.
  tags = {
    Name = "ksh-weba"
  }
}

resource "aws_subnet" "ksh_webc" {
  vpc_id            = aws_vpc.ksh_vpc.id
  cidr_block        = "100.0.2.0/24"
  availability_zone = "ap-northeast-2c"
  map_public_ip_on_launch = true
  tags = {
    Name = "ksh-webc"
  }
}

resource "aws_subnet" "ksh_wasa" {
  vpc_id            = aws_vpc.ksh_vpc.id
  cidr_block        = "100.0.3.0/24"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "ksh-wasa"
  }
}

resource "aws_subnet" "ksh_wasc" {
  vpc_id            = aws_vpc.ksh_vpc.id
  cidr_block        = "100.0.4.0/24"
  availability_zone = "ap-northeast-2c"
  tags = {
    Name = "ksh-wasc"
  }
}

resource "aws_subnet" "ksh_dba" {
  vpc_id            = aws_vpc.ksh_vpc.id
  cidr_block        = "100.0.5.0/24"
  availability_zone = "ap-northeast-2a"
  tags = {
    Name = "ksh-dba"
  }
}

resource "aws_subnet" "ksh_dbc" {
  vpc_id            = aws_vpc.ksh_vpc.id
  cidr_block        = "100.0.6.0/24"
  availability_zone = "ap-northeast-2c"
  tags = {
    Name = "ksh-dbc"
  }
}

 

 

 

4. 인터넷 게이트웨이 생성

resource "aws_internet_gateway" "ksh_igw" {
  vpc_id = aws_vpc.ksh_vpc.id
  tags = {
    Name = "ksh-igw"
  }
}

 

 

 

5. 라우팅 테이블 생성

 

생성한 인터넷 게이트웨이를 라우팅 테이블에 넣기 위해 라우팅 테이블을 생성해준다.

resource "aws_route_table" "ksh_route" {
  vpc_id = aws_vpc.ksh_vpc.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.ksh_igw.id
  }
  tags = {
    Name = "ksh-route"
  }
}

 

 

 

6. 라우팅 테이블 설정(인터넷 게이트웨이)

resource "aws_route_table_association" "ksh_rtasa" {
  subnet_id      = aws_subnet.ksh_weba.id
  route_table_id = aws_route_table.ksh_route.id
}

resource "aws_route_table_association" "ksh_rtasc" {
  subnet_id      = aws_subnet.ksh_webc.id
  route_table_id = aws_route_table.ksh_route.id
}

 

 

 

7. NAT 게이트웨이 생성

resource "aws_eip" "ksh_eip" {
  domain = "vpc"
}

resource "aws_nat_gateway" "ksh_ngw" {
  allocation_id = aws_eip.ksh_eip.id
  subnet_id     = aws_subnet.ksh_weba.id
  tags = {
    Name = "ksh-ngw"
  }
}

output "eip_public_ip" {
    value = aws_eip.ksh_eip.public_ip
}

 

 

 

8. 라우팅 테이블 생성(NAT용)

resource "aws_route_table" "ksh_ngrt" {
    vpc_id = aws_vpc.ksh_vpc.id

    route {
        cidr_block = "0.0.0.0/0"
        nat_gateway_id = aws_nat_gateway.ksh_ngw.id
    }
    tags = {
      Name = "ksh-ngtrt"
    }
}

 

 

 

9. 라우팅 테이블 설정(NAT)

resource "aws_route_table_association" "ksh_ngrtas_wasa" {
  subnet_id      = aws_subnet.ksh_wasa.id
  route_table_id = aws_route_table.ksh_ngrt.id
}

resource "aws_route_table_association" "ksh_ngrtas_wasc" {
  subnet_id      = aws_subnet.ksh_wasc.id
  route_table_id = aws_route_table.ksh_ngrt.id
}

resource "aws_route_table_association" "ksh_ngrtas_dba" {
  subnet_id      = aws_subnet.ksh_dba.id
  route_table_id = aws_route_table.ksh_ngrt.id
}

resource "aws_route_table_association" "ksh_ngrtas_dbc" {
  subnet_id      = aws_subnet.ksh_dbc.id
  route_table_id = aws_route_table.ksh_ngrt.id
}

 

 

 

10. 보안 그룹 생성

resource "aws_security_group" "ksh_sg" {
  name        = "ksh-sg"
  description = "Http_ICMP_SQL"
  vpc_id      = aws_vpc.ksh_vpc.id

  ingress = [
    {
      description      = "ssh"
      from_port        = 22
      to_port          = 22
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
      prefix_list_ids  = null
      security_groups  = null
      self             = null
    },
    {
      description      = "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
    },
    {
      description      = "icmp"
      from_port        = -1
      to_port          = -1
      protocol         = "icmp"
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
      prefix_list_ids  = null
      security_groups  = null
      self             = null
    },
    {
      description      = "mysql"
      from_port        = 3306
      to_port          = 3306
      protocol         = "tcp"
      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 = "ksh-sg"
  }
}

 

 

주의

  • 한 개 이상의 보안 규칙을 넣어줄 땐, "[대괄호]" 로 먼저 묶어준 후 "`{중괄호}" 로 묶어준 다음 ",(콤마)" 로 구별 해준다.
  • 보안 규칙을 한 개만 생성을 할 때는, "prefix_list_ids", "security_groups", "self" 옵션을 꼭 넣어주어야 에러가 안나온다.

 

 

 

11. EC2 생성

resource "aws_instance" "ksh-ec2_weba" {
  ami                    = "ami-084e92d3e117f7692" # ec2를 생성할 OS의 이미지
  instance_type          = "t2.small"
  key_name               = "ksh1"				   # ssh 접속에 필요한 key
  vpc_security_group_ids = [aws_security_group.ksh_sg.id]
  availability_zone      = "ap-northeast-2a"
  private_ip             = "100.0.1.11"
  subnet_id              = aws_subnet.ksh_weba.id

  tags = {
    Name = "ksh-ec2-weba"
  }
}

output "ec2-weba-ip" {
  value = aws_instance.ksh-ec2_weba.id
}

 

 

 

2편에 이어서 하겠습니다.

반응형

'Terraform' 카테고리의 다른 글

Terraform 404 error 해결  (0) 2024.07.01
Terraform 실습 해보기 - 2  (1) 2023.12.22