[AWS] 트래픽 상황에서 NACL 최적화 하기

궁금하면 500원·2024년 12월 29일
0

데브옵스

목록 보기
27/36

대규모 트래픽 상황에서 AWS NACL 최적화로 성능 개선 사례

문제 개요

우리의 전자상거래 플랫폼은 주말 Flash Sale 이벤트 중, 예상보다 10배 이상 증가한 트래픽을 처리해야 했습니다.

이러한 급증한 트래픽을 처리하는 과정에서 성능 저하와 몇 가지 보안 문제를 경험했습니다.

주요 문제는 다음과 같습니다

  • 주문 처리 시스템의 성능 저하: 시스템의 응답 시간이 2초에서 8초로 증가했습니다.
  • 정상적인 사용자 트래픽 차단: 정상적인 트래픽이 일부 차단되는 현상이 발생했습니다.
  • 의심스러운 IP에서의 대량 접속 시도: 보안 문제가 우려되는 트래픽이 감지되었습니다.

시스템 초기 구성

이 문제를 해결하기 위해 시스템의 초기 구성은 다음과 같았습니다

  • 6개의 EC2 인스턴스가 3개의 가용영역(AZ)에서 분산 운영되고 있었습니다.
  • 기본 NACL 설정만 적용되었고, 트래픽 제어는 주로 Security Group만을 사용해왔습니다.

문제 분석

1. 성능 저하 분석

성능 문제를 분석하기 위해 네트워크 지연(latency)과 트래픽 처리 성능을 모니터링했습니다.
이를 위해 AWS CloudWatch를 사용하여 네트워크 지연을 측정하는 코드를 작성했습니다.

@Slf4j
@Component
public class TrafficAnalyzer {

    @Autowired
    private AWSCloudWatchClient cloudWatchClient;
    
    public Map<String, Double> analyzeNetworkLatency() {
        Map<String, Double> latencyMetrics = new HashMap<>();
        
        try {
            GetMetricDataRequest request = new GetMetricDataRequest()
                .withMetricDataQueries(Arrays.asList(
                    new MetricDataQuery()
                        .withId("networkLatency")
                        .withMetricStat(new MetricStat()
                            .withMetric(new Metric()
                                .withNamespace("AWS/EC2")
                                .withName("NetworkLatency"))
                            .withPeriod(60)
                            .withStat("Average"))
                ))
                .withStartTime(new Date(System.currentTimeMillis() - 3600000))
                .withEndTime(new Date());
                
            GetMetricDataResult result = cloudWatchClient.getMetricData(request);
            
            result.getMetricDataResults().forEach(data -> {
                double avgLatency = data.getValues().stream()
                    .mapToDouble(Double::doubleValue)
                    .average()
                    .orElse(0.0);
                latencyMetrics.put("averageLatency", avgLatency);
            });
            
        } catch (Exception e) {
            log.error("네트워크 지연 분석 중 오류 발생: ", e);
        }
        
        return latencyMetrics;
    }
}

이 코드에서는 AWS CloudWatch의 NetworkLatency 지표를 기반으로 네트워크 지연을 분석하고, 이를 통해 네트워크 성능을 확인했습니다.

분석 결과, 평상시에는 0.1%의 패킷 드롭률이었지만, 피크 시에는 15%로 증가한 것을 확인했습니다.

그 외에도 초당 트랜잭션 수(TPS)가 2,000에서 500으로 감소했으며, CPU 사용률은 40%에서 95%로 급증했습니다.

2. 병목 지점 분석

성능 저하의 주요 원인은 트래픽 급증과 네트워크 패킷 손실이었습니다.
이를 해결하기 위해서는 NACL 규칙 최적화와 트래픽 차단이 필요했습니다.
동시에 CloudWatch를 통해 트래픽을 실시간으로 모니터링하여 문제 발생 시 즉시 대응할 수 있는 시스템을 구축해야 했습니다.

해결 방안

1. NACL 최적화

NACL 규칙을 최적화하여 정상 트래픽을 허용하고 의심스러운 IP에서 오는 트래픽을 차단하는 방식으로 시스템을 개선했습니다.

여기서 중요한 점은 규칙 번호에 따라 우선순위를 설정하고, 의심스러운 트래픽이 들어오지 않도록 미리 차단하는 것입니다.

@Service
public class NACLOptimizationService {

    @Autowired
    private AmazonEC2Client ec2Client;

    public void optimizeNACL(String networkAclId) {
        // 정상 트래픽을 허용하는 규칙
        CreateNetworkAclEntryRequest allowLegitTraffic = new CreateNetworkAclEntryRequest()
            .withNetworkAclId(networkAclId)
            .withRuleNumber(100)
            .withProtocol("tcp")
            .withCidrBlock("10.0.0.0/16")
            .withEgress(false)
            .withRuleAction("allow")
            .withPortRange(new PortRange()
                .withFrom(80)
                .withTo(443));

        // 의심스러운 IP 차단
        CreateNetworkAclEntryRequest blockSuspiciousIPs = new CreateNetworkAclEntryRequest()
            .withNetworkAclId(networkAclId)
            .withRuleNumber(200)
            .withProtocol("-1")
            .withCidrBlock("suspicious-ip-range")
            .withEgress(false)
            .withRuleAction("deny");
        
        try {
            // 정상 트래픽 허용 규칙 추가
            ec2Client.createNetworkAclEntry(allowLegitTraffic);
            // 의심스러운 IP 차단 규칙 추가
            ec2Client.createNetworkAclEntry(blockSuspiciousIPs);

            // CloudWatch 경보 설정
            setupCloudWatchAlarms();

        } catch (AmazonEC2Exception e) {
            log.error("NACL 규칙 적용 중 오류 발생: ", e);
            throw new RuntimeException("NACL 최적화 실패", e);
        }
    }

    private void setupCloudWatchAlarms() {
        // CloudWatch 경보 설정 구현
    }
}

위 코드에서는 트래픽을 허용하는 규칙과 의심스러운 IP를 차단하는 규칙을 작성하여 NACL에 적용했습니다.

정상 트래픽은 80, 443 포트를 사용하며, 의심스러운 IP는 전송을 차단합니다.

2. 트래픽 모니터링 및 대시보드 설정

실시간 트래픽을 모니터링할 수 있도록, Grafana와 CloudWatch를 연동하여 대시보드를 설정했습니다.

이를 통해 트래픽을 실시간으로 모니터링하고, 문제 발생 시 즉시 알림을 받을 수 있도록 했습니다.

@Configuration
public class MonitoringDashboardConfig {

    @Bean
    public DashboardService dashboardService() {
        return new DashboardService() {
            @Override
            public void createDashboard() {
                // Grafana 대시보드 설정
                Map<String, Object> dashboard = new HashMap<>();
                dashboard.put("title", "트래픽 모니터링 대시보드");

                List<Map<String, Object>> panels = new ArrayList<>();
                panels.add(createLatencyPanel());
                panels.add(createTPSPanel());
                panels.add(createDropRatePanel());

                dashboard.put("panels", panels);
            }

            private Map<String, Object> createLatencyPanel() {
                // 레이턴시 패널 구성
                return new HashMap<>();
            }

            private Map<String, Object> createTPSPanel() {
                // TPS 패널 구성
                return new HashMap<>();
            }

            private Map<String, Object> createDropRatePanel() {
                // 드롭률 패널 구성
                return new HashMap<>();
            }
        };
    }
}

개선 결과

성능 개선 지표

  • 응답 시간: 8초 → 1.5초 (81.25% 개선)
  • 패킷 드롭률: 15% → 0.5% (96.67% 개선)
  • 정상 트래픽 처리율: 99.9% 달성

성능 테스트 결과

성능 테스트를 통해 응답 시간 및 TPS를 측정한 결과, 이전의 문제를 해결하고 정상적인 트래픽을 처리할 수 있게 되었습니다.

아래는 개선 전후의 성능 비교입니다.

  • 응답 시간: 8초 → 1.5초
  • 초당 트랜잭션 수(TPS): 500 TPS → 2,000 TPS
  • 패킷 드롭률: 15% → 0.5%

결론

이 프로젝트를 통해 NACL 규칙 최적화, 트래픽 모니터링 및 자동화된 대응 체계를 구축하여, 급격한 트래픽 증가에도 안정적인 서비스를 제공할 수 있게 되었습니다.

또한, 실시간 모니터링과 CloudWatch 경보를 활용하여 예상치 못한 문제 발생 시 빠르게 대응할 수 있는 시스템을 구축하였습니다.

교훈

  • NACL 규칙 우선순위 설정이 시스템 성능에 미치는 영향이 매우 큼
  • 실시간 트래픽 분석 및 자동화된 대응 체계의 중요성
  • 트래픽 패턴 분석을 통해 선제적 대응이 필요함
profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글