베하!! 안녕하세요 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 |
댓글