AWS Gateway API Controller

개요

AWS에서 게이트웨이API를 지원하는 애드온.
ALB Controller와 다르게 Amazon VPC Lattice를 조작하는 식으로 동작한다.
이것 때문에 흔히 생각하는 gateway api와 조금 다르게 동작한다.

gateway api는 기본적으로는 남북 트래픽을 조금 더 잘 관리할 수 있도록, 인그레스를 대체하기 위해 만들어진 api이다.
당연히 aws gateway api controller 역시 그러한 동작을 수행하긴 하는데, 라티스에서는 더 단지 쿠버네티스 클러스터가 하나의 클러스터가 아니라 그런 클러스터들을 여러 개 서비스 네트워크 붙일 수 있도록 하는데 초점을 맞춘다.
즉 달리 말해 게이트웨이 api관련 리소스를 만들면 클러스터로 치면 남북 트래픽을 설정하는 것 같지만, 라티스 서비스 네트워크 상에서는 동서 트래픽을 설정하는 꼴이란 것이다.
그래서 외부 통신을 위해서는 사실 그대로 ALB Controller를 사용해야만 한다;;

기능

그러면 구체적으로 언제 이걸 사용할 수 있을까?

동작 원리


이 컨트롤러를 설치하면 기본적으로 알아서 GatewayClass가 세팅된다.
여기에 클러스터 관리자가 Gateway를 만들면 이것은 곧 서비스 네트워크와 1:1 매핑된다.
말 그대로 test1이란 이름으로 게이트웨이를 만들었다면, 실제 AWS 측에서도 test1이란 이름의 서비스 네트워크가 있어야만 한다.
여기에 route 관련 리소스를 만들면 이것은 라티스 서비스로서 구성된다.
route 리소스에 세팅된 hosts, match, backendRef 등의 필드가 전부 라티스 서비스의 리스너, 룰, 타겟그룹으로서 구성된다.
타겟그룹은 구체적으로는 backendRef의 서비스가 가지는 엔드포인트들로 구성이 된다고 보는 게 조금 더 명확한 표현이겠다.

커스텀 리소스

image.png
라티스와 관련되는 몇 가지 커스텀 리소스가 있다.[1]
몇 가지만 정리한다.

IAMAuthPolicy

apiVersion: application-networking.k8s.aws/v1alpha1
kind: IAMAuthPolicy
metadata:
    name: -iam-auth-policy
spec:
    targetRef:
        group: "gateway.networking.k8s.io"
        kind: Gateway
        name: gateway
    policy: |
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": "*",
                    "Action": "vpc-lattice-svcs:Invoke",
                    "Resource": "*",
                    "Condition": {
                        "StringNotEqualsIgnoreCase": {
                            "aws:PrincipalType": "anonymous"
                        }
                    }
                }
            ]
        }

대상이 될 타겟을 정하고, 이에 대한 정책을 설정한다.
그러면 해당 타겟으로 가는 트래픽에 제약을 가할 수 있다.
위의 세팅의 경우 SigV4 서명 없이 들어온 요청은 anonymous 신원을 가지므로 그런 요청을 제외하고 모든 요청을 게이트웨이(서비스 네트워크)에 허용한다.

ServiceExport

apiVersion: application-networking.k8s.aws/v1alpha1
kind: ServiceExport
metadata:
  name: service-1
  annotations:
    application-networking.k8s.aws/port: "9200"
spec: {}

멀티 클러스터 환경에서 한 클러스터에서 만든 라티스 서비스를 다른 클러스터에서도 사용 가능하게 할 때 사용한다.

apiVersion: application-networking.k8s.aws/v1alpha1
kind: ServiceImport
metadata:
  name: service-1
  annotations:
    application-networking.k8s.aws/aws-eks-cluster-name: "service-1-owner-cluster"
    application-networking.k8s.aws/aws-vpc: "service-1-owner-vpc-id"
spec: {}

당연히 상대 클러스터쪽에서는 Import 리소스를 통해 이 설정을 가져와 클러스터에서 해당 라티스 서비스를 추적할 수 있다.

설치

helm install gateway-api-controller \
    oci://public.ecr.aws/aws-application-networking-k8s/aws-gateway-controller-chart \
    --version=v1.1.0 \
    --set=serviceAccount.create=false \
    --namespace aws-application-networking-system \
    --set=log.level=info # use "debug" for debug level logs

헬름으로 설치할 수 있다.
oci 스킴을 사용하기 위해서는 3.9 버전 이상이어야 한다.
커스텀 설정을 넣을 수 있기는 하나, 그렇게 많이 넣을 껀덕지도 없다.[2]

관련 문서

이름 noteType created
AWS Gateway API Controller knowledge 2025-04-27
12W - VPC Lattice 기반 gateway api published 2025-04-27

참고

워크샵 - https://www.eksworkshop.com/docs/networking/vpc-lattice/


  1. https://www.gateway-api-controller.eks.aws.dev/latest/api-reference/ ↩︎

  2. https://www.gateway-api-controller.eks.aws.dev/latest/guides/environment/ ↩︎