본문 바로가기
CSP (Cloud Service Provider)/AWS

AWS Terraform 3tier (2)

by BTC_신지웅 2022. 12. 19.

베하!! 안녕하세요 BETTERMONDAY 팀입니다! 저번 포스팅에 이어 이번 포스팅에서도 Terraform을 이용한 AWS 3tier 생성에 대해 다루어 보도록 하겠습니다! 그럼 스따뚜!


1.Route,Route Table 생성 및 Security Group 생성

트래픽을 제대로 나누어 주기 위하여 Route설정과 Route Table 생성이 필요합니다. 만약 보안그룹을 제대로 설정하였는데도 불구하고 외부와 통신 또는 원하는 포트와 통신이 되지 않는다면, 이 부분에 문제이 있을 확률이 높습니다.

#public -> igw
resource "aws_route_table" "tier-rt-pub" {
  vpc_id = aws_vpc.tier.id

  tags = {
    "Name" = "tier-rt-pub"
  }
}
resource "aws_route" "tier-r-pub-igw" {
  route_table_id         = aws_route_table.tier-rt-pub.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.tier-igw.id
}


#Public subnet을 public route table에 연결
resource "aws_route_table_association" "tier-rtass-pub-a" {
  subnet_id      = aws_subnet.public-a.id
  route_table_id = aws_route_table.tier-rt-pub.id
}
resource "aws_route_table_association" "tier-rtass-pub-c" {
  subnet_id      = aws_subnet.public-c.id
  route_table_id = aws_route_table.tier-rt-pub.id

}

#private web -> nat
resource "aws_route_table" "tier-rt-pri-web" {
  vpc_id = aws_vpc.tier.id

  tags = {
    Name = "tier-rt-pri-web"
  }
}
resource "aws_route" "tier-r-pri-web" {
  route_table_id         = aws_route_table.tier-rt-pri-web.id
  destination_cidr_block = "0.0.0.0/0"
  nat_gateway_id         = aws_nat_gateway.tier-nat.id

  depends_on = [
    aws_nat_gateway.tier-nat
  ]
}

#private web -> private route table association
resource "aws_route_table_association" "tier-rtass-pri-a-web" {
  subnet_id      = aws_subnet.web-sub-a.id
  route_table_id = aws_route_table.tier-rt-pri-web.id

  depends_on = [
    aws_route.tier-r-pri-web
  ]

}
resource "aws_route_table_association" "tier-rtass-pri-c-web" {
  subnet_id      = aws_subnet.web-sub-c.id
  route_table_id = aws_route_table.tier-rt-pri-web.id

  depends_on = [
    aws_route.tier-r-pri-web
  ]
}
resource "aws_route_table_association" "tier-rtass-pri-a-was" {
  subnet_id      = aws_subnet.was-sub-a.id
  route_table_id = aws_route_table.tier-rt-pri-web.id

}
resource "aws_route_table_association" "tier-rtass-pri-c-was" {
  subnet_id      = aws_subnet.was-sub-c.id
  route_table_id = aws_route_table.tier-rt-pri-web.id

}

resource "aws_route_table_association" "tier-rtass-pri-a-db" {
  subnet_id      = aws_subnet.db-sub-a.id
  route_table_id = aws_route_table.tier-rt-pri-web.id

}

resource "aws_route_table_association" "tier-rtass-pri-c-db" {
  subnet_id      = aws_subnet.db-sub-c.id
  route_table_id = aws_route_table.tier-rt-pri-web.id

}

2. Security Group 생성

다음은 SG 생성입니다.각 층별로 필요한 Port만을 열어주고, 필요하지 않은 Port는 닫아주어 보안상 조금 더 제한을 걸 수 있습니다. 

2 - 1 SG - Bastion

먼저 Bastion입니다. Bastion은 내부 통신을 위해 SSH Port를 열어주어야 합니다. 

#Bastion Security Group
resource "aws_security_group" "tier-sg-pub-bastion" {
  name        = "tier-sg-pub-bastion"
  description = "tier-sg-pub-bastion"
  vpc_id      = aws_vpc.tier.id

  ingress {
    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" = "tier-sg-pub-bastion"
  }

}

2 -2 . SG - Web

Web은 Apache를 사용하여 화면을 띄우고, Bastion을 통한 SSH접속이 필요합니다.

#Web Security Group
resource "aws_security_group" "tier-sg-pri-web" {
  name   = "tier-sg-pri-web"
  vpc_id = aws_vpc.tier.id

  ingress {
    from_port       = 22
    to_port         = 22
    protocol        = "tcp"
    security_groups = [aws_security_group.tier-sg-pub-bastion.id]
  }
  ingress {
    from_port   = 80
    to_port     = 80
    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" = "tier-sg-pri-web"
  }
  # output "name" {
  #   value = ""
  # }
}

2 - 3. SG - WAS

was서버는 Tomcat이란 Application을 사용하고,  8080 Port를 사용합니다. 또한 Bastion과의 SSH 접속이 필요하기 때문에 22번 Port에서 Bastion의 SG 만을 허용합니다.

#Was Sicurity Group
resource "aws_security_group" "tier-sg-pri-was" {
  name   = "tier-sg-pri-was"
  vpc_id = aws_vpc.tier.id

  ingress {
    from_port       = 22
    to_port         = 8080
    protocol        = "tcp"
    security_groups = [aws_security_group.tier-sg-pub-bastion.id]
  }
  ingress {
    from_port   = 8080
    to_port     = 8080
    protocol    = "tcp"
    cidr_blocks = ["10.0.10.0/24", "10.0.20.0/24"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    "Name" = "tier-sg-pri-was"
  }
}

2 - 4. SG - DB

DB는 3306 Port를 사용할 것이고, 마찬가지로 Bastion과의 통신만을 위한 22번 Port를 열어줍니다.

#DB Security Group
resource "aws_security_group" "tier-sg-pri-db" {
  name   = "tier-sg-pri-db"
  vpc_id = aws_vpc.tier.id

  ingress {
    from_port       = 22
    to_port         = 22
    protocol        = "tcp"
    security_groups = [aws_security_group.tier-sg-pub-bastion.id]
  }

  ingress {
    from_port   = 3306
    to_port     = 3306
    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" = "tier-sg-pri-db"
  }
}

2 - 4. SG - ALB 

앞단에 Application Loadbalancer를 사용하기때문에 ALB의 SecurityGroup도 생성해줍니다.

#ALB Security Group 생성
# alb sg
resource "aws_security_group" "tier-sg-alb-web" {
  name        = "tier-sg-alb-web"
  description = "tier-sg-alb-web"
  vpc_id      = aws_vpc.tier.id

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 80
    to_port     = 80
    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 = "tier-sg-alb-web"
  }
}

여기까지  Route 및 SG생성에 관한 내용이였습니다. 이제 네트워크 부분은 끝이났네요! 다음 포스팅엔 EC2생성에 대해 다뤄보도록 하겠습니다! 감사합니다. 그럼 베바~~

'CSP (Cloud Service Provider) > AWS' 카테고리의 다른 글

AWS Terraform 3tier (4)  (0) 2022.12.19
AWS Terraform 3tier (3)  (0) 2022.12.19
AWS Terraform 3tier (1)  (0) 2022.12.19
AWS Outposts  (0) 2022.12.19
[AWS] CloudWatch  (0) 2022.12.17

댓글