grep

DevOps

AWS PrivateLink로 만드는 안전한 프라이빗 네트워크

Jason여기어때

2025년 10월 15일

원문에서 보기 ↗

안녕하세요. 여기어때컴퍼니 SRE팀에서 클라우드 엔지니어링 업무를 하고 있는 제이슨 입니다.

최근 여기어때 고객센터 신규 구축 프로젝트를 진행하면서 세일즈포스(Salesforce) SaaS 솔루션을 AWS PrivateLink를 이용해서 구성하는 작업을 진행 했습니다.

이 과정에서 PrivateLink의 NLB(Network Load Balancer)가 Health Check에 실패하는 이슈를 겪었고, 이를 해결한 과정을 공유 하고자 합니다. 비슷한 문제를 겪고 계신 분들께 도움이 되었으면 좋겠습니다.

1. AWS PrivateLink란?

AWS PrivateLink는 AWS 서비스, 혹은 AWS에서 호스팅되는 서비스에 VPC(Virtual Private Cloud) 엔드포인트를 통해 퍼블릭 IP 및 인터넷을 거치지 않고 안전하게 프라이빗 네트워크로 접속할 수 있도록 해주는 기술입니다.

인터넷 게이트웨이, NAT 디바이스, VPN 연결 없이도 트래픽이 AWS 네트워크를 벗어나지 않기 때문에 보안이 강화됩니다.

by ChatGPT

2. AWS PrivateLink Architecture 구성

[AWS PrivateLink Architecture]

3. AWS PrivateLink Endpoint Service를 위한 NLB Health Check 이슈 발견

[AWS API Gateway와 VPC PrivateLink Architecture]

4. NLB → ALB(Ingress) Health Check 실패를 해결하기 위한 과정

1) 테스트 환경 구성

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cpu-nginx-test-1-ingress
  namespace: d-jason-test
  annotations:
    alb.ingress.kubernetes.io/group.name: jason-nginxingress
    alb.ingress.kubernetes.io/scheme: internal
    alb.ingress.kubernetes.io/security-groups: sg-0ece0272d8949102e, sg-0e23b60358e3f2f83
    alb.ingress.kubernetes.io/security-groups-auto-add: sg-0ece0272d8949102e
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthcheck-path: "/"
    alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=100
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:xxxxxxxxxxxxx:certificate/1938a1e7-8941-4e08-b5be-f4e7ee8bb978
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/backend-protocol: HTTP
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
    - host: dev-jason-nginx.xxxxxxxxx.xx
      http:
        paths:
          - backend:
              service:
                name: cpu-nginx-test-1-svc
                port:
                  number: 80
            path: /
            pathType: Prefix

2) Health Check 실패를 해결을 위한 과정

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cpu-nginx-test-1-ingress
  namespace: d-jason-test
  annotations:
    alb.ingress.kubernetes.io/group.name: jason-nginxingress
    alb.ingress.kubernetes.io/scheme: internal
    alb.ingress.kubernetes.io/security-groups: sg-0ece0272d8949102e, sg-0e23b60358e3f2f83
    alb.ingress.kubernetes.io/security-groups-auto-add: sg-0ece0272d8949102e
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthcheck-path: "/"
    alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=100
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:xxxxxxxxxxxx:certificate/1938a1e7-8941-4e08-b5be-f4e7ee8bb978
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/conditions.nlb-source-ip: >
      [{"field":"source-ip","sourceIpConfig":{"values":["xxx.xxx.xx.xxx/32", "xxx.xxx.xx.xxx/32", "xxx.xxx.xx.xxx/32"]}}]
    alb.ingress.kubernetes.io/actions.nlb-source-ip: >
      {"Type":"fixed-response","FixedResponseConfig":{"StatusCode":"200","ContentType":"text/plain","MessageBody":"OK"}}
    alb.ingress.kubernetes.io/backend-protocol: HTTP
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
    - host: dev-jason-nginx.xxxxxxxx.xx
      http:
        paths:
          - backend:
              service:
                name: cpu-nginx-test-1-svc
                port:
                  number: 80
            path: /
            pathType: Prefix
    - http:
        paths:
          - backend:
              service:
                name: nlb-source-ip
                port:
                  name: use-annotation
            path: /
            pathType: Prefix

5. 대안

6. 추가 테스트

7. 마무리

추가 테스트를 통해 NLB의 ENI IP를 소스 IP로 하는 호출은 Health Check 외에는 없다고 판단 했습니다. 또한, NLB가 ALB Ingress 환경에서 Host 헤더를 정상적으로 유지하는 것을 확인 했습니다.

따라서 ALB나 EKS의 Ingress에서 HTTP Host 헤더를 기반의 리스너 규칙을 사용하여도 문제가 없다는 것을 확인 할 수 있습니다.

결론적으로, ALB(Ingress)에 NLB의 ENI IP를 소스 IP로 하는 Health Check 정책을 추가하는 것은 시스템에 큰 영향을 주지 않으면서도 문제를 해결하는 가장 효과적인 방법 입니다.

이상으로 AWS PrivateLink를 활용한 프라이빗 네트워크 서비스 구성과 Health Check 이슈 해결 방안을 살펴 보았습니다.

안정적이고 보안성 높은 네트워크 설계에 도움이 되었기를 바랍니다.