잡다한 IT 지식
Terraform 보안 그룹 구성 시 순환 참조를 피하는 방법 본문
Terraform을 사용해 AWS 인프라를 구성할 때, 보안 그룹(Security Group)을 설정하는 과정에서 종종 순환 참조(Circular Dependency) 문제가 발생하곤 합니다.
특히 서로 통신해야 하는 두 리소스가 각자의 보안 그룹에서 서로를 참조하는 구조일 경우 이 문제가 쉽게 발생합니다.
대표적인 예로, AWS Lambda 함수가 RDS(MySQL 등)에 접근해야 하는 상황을 들 수 있습니다.
RDS와 Lambda 연결 예제
기본적으로 Lambda와 RDS가 통신하기 위해선 보안그룹 허용이 필요합니다.
Lambda에선 egress로 RDS의 보안그룹을, RDS에선 ingress로 Lambda의 보안 그룹이 필요합니다.
이제 해당 코드를 작성해보겠습니다.
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
resource "aws_security_group" "lambda_sg" {
name = "lambda-sg"
vpc_id = aws_vpc.main.id
egress {
from_port = 3306
to_port = 3306
protocol = "tcp"
security_groups = [aws_security_group.rds_sg.id] # RDS에 접속하기 위한 보안 그룹 참조
}
}
resource "aws_security_group" "rds_sg" {
name = "rds-sg"
vpc_id = aws_vpc.main.id
ingress {
from_port = 3306
to_port = 3306
security_groups = [aws_security_group.lambda_sg.id] # Lambda의 접속을 허용하기 위한 보안 그룹 참조
}
}
이제 terraform plan을 통해 리소스 생성을 시도해보겠습니다.
원인
Lambda의 보안 그룹을 만들기 위해선 RDS의 보안 그룹이 필요합니다. 그러나, RDS의 보안 그룹을 만들기 위해서도 Lambda의 보안 그룹이 필요합니다. 따라서, Cycle이 발생하여 리소스 생성이 불가능해집니다.
보안그룹 규칙 분리로 순환 참조 없애기
이를 위해서 ingress rule과 egress rule을 보안 그룹에서 분리해서 사용합니다.
이제 ingress rule과 egress rule로 보안그룹의 인라인 규칙들을 분리해보겠습니다.
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
resource "aws_security_group" "lambda_sg" {
name = "lambda-sg"
vpc_id = aws_vpc.main.id
}
resource "aws_security_group" "rds_sg" {
name = "rds-sg"
vpc_id = aws_vpc.main.id
}
resource "aws_vpc_security_group_egress_rule" "lambda_to_rds" {
security_group_id = aws_security_group.lambda_sg.id
from_port = 3306
to_port = 3306
ip_protocol = "tcp"
referenced_security_group_id = aws_security_group.rds_sg.id
}
resource "aws_vpc_security_group_ingress_rule" "rds_from_lambda" {
security_group_id = aws_security_group.rds_sg.id
from_port = 3306
to_port = 3306
ip_protocol = "tcp"
referenced_security_group_id = aws_security_group.lambda_sg.id
}
다시 한 번 terraform plan을 실행해보겠습니다.
보안그룹과 규칙을 분리함으로써 각 보안 그룹의 순환 참조가 제거됩니다.
결론
보안 그룹과 보안 그룹 규칙을 분리하면 리소스 간의 의존성을 줄일 수 있어, 순환 참조(Circular Dependency) 문제를 방지할 수 있습니다. 따라서, 보안 그룹은 인라인 규칙 없이 정의하고, 규칙은 별도의 리소스로 관리하는 것이 좋습니다.
'Terraform' 카테고리의 다른 글
Terraform - check 블록을 활용한 외부 상태 검증 (0) | 2025.07.06 |
---|