ecs 클러스터 내에서 도커 컨테이너를 실행시키는 것이 service다.
resource "aws_security_group" "ecs_service" {
description = "Access for the ECS Service"
name = "${local.prefix}-ecs-service"
vpc_id = aws_vpc.main.id
egress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 5432
to_port = 5432
protocol = "tcp"
cidr_blocks = [
aws_subnet.private_a.cidr_block,
aws_subnet.private_b.cidr_block
]
}
ingress {
from_port = 8000
to_port = 8000
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
tags = local.common_tags
}
인바운드 규칙:
proxy
아웃바운드 규칙:database
,ECR
resource "aws_ecs_service" "api" {
name = "${local.prefix}-api"
cluster = aws_ecs_cluster.main.name
task_definition = aws_ecs_task_definition.api.family
desired_count = 1
launch_type = "FARGATE"
network_configuration {
subnets = [
aws_subnet.public_a.id,
aws_subnet.public_b.id,
]
security_groups = [aws_security_group.ecs_service.id]
assign_public_ip = true
}
}
desired_count
: task의 수를 의미하며, 값이 높을 수록 비용도 증가한다.
network_configuration
: 현재 subnets이 퍼블릭 서브넷으로 지정 돼 있으나, 이후 로드밸런서를 구축 시 재수정 예정이다.
ecs 서비스를 구축했으니 그에 따라 database.tf 파일도 수정해야 한다.
ecs 서비스의 network 보안그룹을 지정할때,
outbound 규칙에 database 부분이 있었다.(5432 port)
따라서, database 관점에서는 ingress로, ecs의 접근을 허용해줘야 한다.
우리가 실행시키는 앱에서 DB로의 접근이 반드시 필요하기 때문이다.
즉,
bastion
을 통한 DB access와
ecs_service
를 통한 DB access를 허용하는 것이다.
(생략)
resource "aws_security_group" "rds" {
description = "Allow access to the RDS database instance"
name = "${local.prefix}-rds-inbound-access"
vpc_id = aws_vpc.main.id
ingress {
protocol = "tcp"
from_port = 5432
to_port = 5432
security_groups = [
aws_security_group.bastion.id,
aws_security_group.ecs_service.id
]
}
tags = local.common_tags
}
gitlab
으로 git push
AWS ECS 서비스 확인