CloudFront + 람다@ 리디렉션

반응형

최근 재미있는 업무 요청이 있었댜

 

EKS로의 접근 구간 게이트웨이는 대개 LB를 배치해서 진입 구간을 제한한댜 (인그레스)

그게 L4가 되었든 L7이 되었든...

 

AWS ELB들을 레버리징하는 EKS의 LB들은 SSL 오프로드가 LB레벨에서 이루어진댜

자세한건 밑의 AWS 레퍼런스를 보쟈

https://aws.amazon.com/ko/blogs/aws/elastic-load-balancer-ssl-support-options/

 

Elastic Load Balancer SSL Support Options | Amazon Web Services

We’ve added some additional flexibility to Amazon EC2’s Elastic Load Balancing feature: You can now terminate SSL sessions at the load balancer and then re-encrypt them before they are sent to the back-end EC2 instances. You can now configure the set o

aws.amazon.com

 

이 떄, 인그레스로 접근 시, path별 리스너가 모두 따로 나뉘게 된댜

/a -> A SVC오브젝트

/b -> B SVC 오브젝트

그리고 호스팅하는 도메인 주소는 AWS 디폴트 주소가 되었든 혹은 SSL 인증서를 입힌 도메인 주소가 된댜

 

따라서, 이 도메인을 myeks.com 이라고 가정하고, a 앱으로 요청하려면 하기 구조를 가진댜

myeks.com/a  ->  EKS내의 A SVC오브젝트 (쿠버프록시) -> A파드

 

이슈는 바로 반드시 /a 라는 컨텍스트 패스를 클라이언트가 명시해야한댜.

마이그레이션 하는 클라이언트는 기존에 xyz.com 이라는 도메인만 호출하고, HTTP 메서드도 유지해야 하는데...

 

처음 생각해본 리디렉션 프록시는 ALB 리디렉션 리스너이댜

https://aws.amazon.com/ko/premiumsupport/knowledge-center/elb-redirect-to-another-domain-with-alb/

 

Application Load Balancer를 사용하여 한 도메인을 다른 도메인으로 리디렉션

Application Load Balancer 서비스는 HTTP에서 HTTPS로의 리디렉션은 물론 도메인 이름의 리디렉션을 지원합니다. Application Load Balancer를 가리키는 도메인이 있는 경우, Amazon Simple Storage Service(Amazon S3) 대신

aws.amazon.com

 

여기서 xyz.com -> myeks.com/a  로 보내는 형태이다.

단 이 ALB 리디렉션은 큰 문제가 있댜

바로 301 / 302 응답만 리디렉션이 된댜

 

우리는 대개 2xx, 4xx, 5xx 응답만을 주로 보고 3xx 응답은 왠만하면 크게 볼일이 없댜

이번에 3xx 응답을 볼줄은...

 

만약 POST 메서드로, 고객이 xyz.com > myeks.com/a 로 ALB가 리디렉션하게 되면, 무조건 GET 메서드로 치환된다.

이는 301 / 302 응답을 좀 더 확인해볼 필요가 있댜...

다른 멋진 분이 3xx 응답에 대한 정의 다이어그램을 정리해두었으니, 가서 보쟈

https://perfectacle.github.io/2017/10/16/http-status-code-307-vs-308/

 

(HTTP) 상태 코드 - 307 vs 308

redirect를 위한 HTTP 상태 코드 301과 302에 대해 잘 모르겠다면 아래 링크를 참고하고 글을 읽도록 하자.301리디렉션 & 302리디렉션의 차이(사용법) 307 Temporary Redirect vs 308 Permanent Redirect307은 302와 유사

perfectacle.github.io

 

클라이언트가 POST로 요청하면, ALB 리디렉션은 이를 모두 GET으로 치환한댜

 

위와 같은 방법을 유지하고, HTTP Method도 유지할 수 있는 방법은?

307 / 308 응답을 주어서 메서드를 유지하며 리디렉션하는 것!

 

개인적으로 찾은 회피책은 CF와 람다엣지 조합이댜

xyz.com > CF > 람다엣지 - 307/308 응답 > myeks.com/a

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html

 

Lambda@Edge example functions - Amazon CloudFront

To use these examples, you must enable the include body option in the distribution’s Lambda function association. It is not enabled by default. To enable this setting in the CloudFront console, select the check box for Include Body in the Lambda Function

docs.aws.amazon.com

 

코드는 그리 어렵지 않댜

 

유의 사항으로, AWS 클라우드프론트 (CloudFront. CF. 클라우드포메이션 아님) 는 글로벌이고 각 리전 네트워크 엣지에서 서비스를 수행한댜

CF 도메인에 SSL 인증서 (AWS ACM) 을 입혀본 경험이 있는 사람은 바로 눈치챌 것이댜

CF 인증서는 us-east-1, 노스 버지니아에서 따서 입혀야 한다는 것을.

마찬가지로 CF에서 요청을 인터셉트하여 리디렉션을 수행하는 람다엣지 또한 노스 버지니아에 배포한 뒤, CF 요청을 트리거링해야 한댜

람다 콘솔에서 트리거 추가할 떄, 다른 리전과는 달리 us-east-1 에서 람다 트리거 항목에 유일하게 CloudFront가 있는 것을 확인할 수 있댜

 

CF의 네트워킹 구간은 4개로 나뉜다.

https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html

 

Using AWS Lambda with CloudFront Lambda@Edge - AWS Lambda

Using AWS Lambda with CloudFront Lambda@Edge Lambda@Edge lets you run Node.js and Python Lambda functions to customize content that CloudFront delivers, executing the functions in AWS locations closer to the viewer. The functions run in response to CloudFr

docs.aws.amazon.com

- 뷰어 리퀘스트

- 오리진 리퀘스트

- 오리진 리스판스

- 뷰어 리스판스

 

리디렉션 코드를 수행해야 하는 부분은 당연히 최초 요청이 진입하는 뷰어 리퀘스트 구간이므로, 이 구간에 람다 엣지로 인터셉트하여 리디렉션을 돌린댜

오리진 리퀘스트 구간에서는 수행해보진 않았는데 한번 테스트 돌려보길 희망할 수 있지만, 괜히 네트워크 레이턴시를 CF에서 뒤로 또 돌리는걸 원치 않아 뷰어 리퀘스트에서 이를 낚아챘댜

 

추가로, CF에서 람다엣지 인터셉트할 때, event 객체 안에 요청자의 uri path와 쿼리스트링이 들어있는 것을 조합해서 리디렉션해야한댜

이건 지금 참조페이지가 어딨는지 까먹었댜... 검색을 해보도록 하쟈

 

 

반응형

설정

트랙백

댓글

EKS Nginx NLB http > https 리디렉션 적용 QnA

IT/EKS 2022. 6. 16. 15:49
반응형

EKS NLB의 TLS 통신의 오프로드. TLS 터미네이션이 LB레벨에서 끝나도록 되어있댜

만약 80번으로 호출한다면, NLB를 바이패스해서 진입하고, 그게 Nginx 파드까지 요청이 들어온댜

이 떄, 이걸 https로 강제로 타게끔 해줘야 한댜 (http > https)

 

---------------------------------------------------------------------------------------------------

 

https://stackoverflow.com/questions/49856754/nginx-ingress-too-many-redirects-when-force-ssl-is-enabled

 

nginx-ingress: Too many redirects when force-ssl is enabled

I am setting up my first ingress in kubernetes using nginx-ingress. I set up the ingress-nginx load balancer service like so: { "kind": "Service", "apiVersion": "v1", "metadata": { "name...

stackoverflow.com

 

앞서서 밑에 이 글로 Nginx를 만들었다면, 위 리디렉션 가이드를 컨피그맵에 적용하여서 리디렉션을 쉽게 적용할 수 있댜 

https://devloper-angmond.tistory.com/96

 

Nginx NLB TLS적용 가이드

조건 : 현재 쿠버네티스 클러스터에 Nginx I.C가 없기를 권장함. 기존에 다른 Nginx IC가 있다면 네이밍을 별개로 분리독립할 것을 권함 본 템플릿에서 몇개의 수정부분이 있는데, 해당 부분은 가이

devloper-angmond.tistory.com

생각보다 다들 ssl force redirect 등등의 삼천포로 빠지는 글들이 굉장히 많았는데... 

답 자체가 템플릿을 좀만 더 들여다보면 확인할 수 있댜...

 

 

ssl redirect 어노테이션 및 기타 가이드는 오피셜 페이지를 참조해보도록 하쟈

https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/#backend-services-upstreams

 

Advanced Configuration with Annotations | NGINX Ingress Controller

Advanced Configuration with Annotations This document explains how to use advanced features using annotations. The Ingress resource only allows you to use basic NGINX features – host and path-based routing and TLS termination. Thus, advanced features lik

docs.nginx.com

 

반응형

설정

트랙백

댓글

Nginx NLB TLS적용 가이드

IT/EKS 2022. 6. 15. 07:52
반응형

조건 : 현재 쿠버네티스 클러스터에 Nginx I.C가 없기를 권장함. 기존에 다른 Nginx IC가 있다면 네이밍을 별개로 분리독립할 것을 권함

 

본 템플릿에서 몇개의 수정부분이 있는데, 해당 부분은 가이드를 잘 보고서 따라가야함.

그리고 이 템플릿에선 http > https 리디렉션 기능이 동작하지 않는데, 이 부분도 주의할 것 ㅇㅇ

https://habeeb-umo.medium.com/using-nginx-ingress-in-eks-with-tls-termination-in-a-network-load-balancer-1783fc92935

 

Using NGINX Ingress in EKS with TLS Termination in a Network Load Balancer

This article details the installation of the Kubernetes-managed NGINX Ingress Controller for use with a Network Load Balancer (NLB) in an…

habeeb-umo.medium.com

 

만약 프로메테우스를 EKS 내에 에코로 운영중에 있다면,

그리고 헬름차트로 이를 설치했다면,

위 nginx는 프로메테우스 연동이 되어있지 않기에, 메트릭 수집이 안되고 있을거댜

 

내부 SVC 클러스터ip 모드로 이를 추가해주고, 아마 디폴트가 8443포트였나? 그거로 추가해주면 된댜 ㅇㅇ

 

자세한건, ingress-nginx 헬름차트를 k8s 템플릿으로 리버싱해서 비교해보면, 어떤것을 추가해야하는지 확인할 수 있댜

https://helm.sh/docs/helm/helm_template/

 

Helm Template

Helm - The Kubernetes Package Manager.

helm.sh

헬름 커맨드로 리버싱해서 비교 후, 프로메테우스를 연동시키도록 하쟈

반응형

설정

트랙백

댓글

Nginx Ingress 트래픽 미러링 참조자료

IT/EKS 2022. 6. 9. 14:22
반응형
반응형

설정

트랙백

댓글