thumbnail thumbnail
  • devops
  • 개발

APEX Domain(루트 도메인)에는 CNAME을 지정할 수 없습니다.

goodgoodman

 

Route53의 도메인을 이용해서 Cloudflare Pages 를 호스팅하려고 작업하던 중 -누군가에게 당연하겠지만- APEX Domain 에는 CNAME 레코드를 사용할 수 없다는 것을 알았습니다. 몇몇 도메인 호스팅 업체에서는 ALIAS 레코드를 지원하겠지만 아쉽게도 Route53 에서는 지원하지 않았습니다. 일반적인 문제이기도하고, 제가 몰랐던 것 뿐이지 스펙상 지원이 안되는 거니까 불만을 가지지는 않습니다.

문제는 이 사실을 런칭하던 중, 서버 설정을 하면서 알게되었다는 것이죠.

 

[sm] 오픈 80분전 환상의 눈물쇼

결과적으로 쉽게 쉽게 해결하긴 하였지만, 오픈이라는 시간적 압박이 없었더라면 꽤 오랫동안 방법에 대해 생각해 보았을 것 같습니다. 짧은시간 동안 생각해낸 방법들과 이에 대한 장단점은 다음과 같습니다.

 

Cloudflare로 DNS를 넘겨버리자

사실 Pages 사이트를 APEX Domain으로 호스팅하는 가장 쉬운 방법이 있습니다. 바로 DNS를 Cloudflare 로 넘겨버리면, Custom Domain에 도메인을 넣기만 해도 자동으로 연결됩니다.

하지만 이러면 Route53 에 걸려있는 수많은 레코드들을 옯기가 부담스럽고, EKS에서의 연동성이 떨어지고, AWS 의 리소스에 별칭을 이용하기도 힘들다는 단점이 있어 사용하지 않았습니다.

 

Reverse Proxy 를 열자

그다음으로 들은 생각은 그냥 EC2 인스턴스를 하나 파서 NGINX를 프록시로 사용하여 redirection 해주는 생각을 했습니다. 아마 Route53을 반드시 써야하는 상황에서 가장 쉽게 접근할 수 있는 해결책이 아닐까 생각합니다.

하지만 관리할 인스턴스가 추가되면서 생기는 트러블을 굳이 만들고 싶지 않았습니다.

 

(A)LB를 파자

고민하던 중 ALB를 하나 파서 APEX Domain을 연결하고, APEX 도메인 요청을 죄다 www Sub Domain으로 보내는 방법을 고려하였습니다. 곧바로 설정을 해보았습니다.

아무런 문제 없이 동작하여 마음의 위안을 얻을 수 있었습니다. 하지만 겨우 리다이렉션 하나 하는데 들어갈 ALB 비용이 너무 안타까워 다른 방법을 고민중이었습니다. EKS 를 이용해서 Ingress를 노출하는 과정에 ALB를 하나 생성하게 되는데 이걸 공유하면 어떨까 생각을 해보았습니다.

 

(EKS 를 쓰는경우) Ingress 를 파버리자

생각해보니 Ingress 를 생성하면 되지 않을까? 하는 생각에 기존에(기존에는 on-premise 환경이었기 때문에 nginx controller를 사용했음) 하던대로 ingress를 작성해보았습니다. 그리고 곧장 새 환경은 metallb가 아니라 aws controller임을 깨닫고 적합한 설정을 찾아보았습니다.

 

Yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: redirect-shop namespace: ${namesapce} annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/load-balancer-name: ${lbname} alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' alb.ingress.kubernetes.io/actions.redirect-to-www: > {"Type":"redirect","RedirectConfig":{"Protocol":"HTTPS","Port":"443","Host":"www.my.domain","Path":"/#{path}","Query":"#{query}","StatusCode":"HTTP_301"}} alb.ingress.kubernetes.io/certificate-arn: ${arn} alb.ingress.kubernetes.io/healthcheck-interval-seconds: "180" alb.ingress.kubernetes.io/success-codes: "404" alb.ingress.kubernetes.io/group.name: ${group} spec: rules: - host: my.domain http: paths: - path: / pathType: Prefix backend: service: name: redirect-to-www port: name: use-annotation

 

위 ingress를 추가하였습니다. 여기서 실질적으로 redirection을 처리하는 부분은 alb.ingress.kubernetes.io/actions.redirect-to-www 이라는 annotation입니다. 자세한 내용은 문서를 참고하시면 좋을 것 같습니다. 해당 포스트에서는 다루지 않겠습니다.

spec.rules[].host.paths[]. 가 실제로 필요하지는 않습니다. 하지만 ingress 가 설정되는데 문제가 있을 수 있으므로 더미를 붙여놓았습니다. 어차피 모든 요청은 actions 에 의해 www로 redirect 됩니다.

 

[md] ArgoCD
[md] ALB 에 설정되어 있는걸 확인

 

 


 

갑작스럽게 만난 문제때문에 약간의 위경련이 오긴 했지만, 생각해보면 아주 재미있는 상황이었습니다. 항상 당장 달성하기 쉬운 방식으로 방안을 마련하고, 남은 시간동안 좋은 방안을 떠올려 보려 하는 버릇이 이번에 잘 대처할 수 있게 해주어서 좋았습니다.

위에 제가 올린 방법 말고로 여러 방법이 있을거라고 생각합니다. 특히 저는 eks 를 사용중인 상황이라 더욱 쉽게 해결헀을 것이고, 다른 수많은 케이스에선 해결하기 어려울 문제일수도 있다고생각합니다. 다른 분들은 어떻게 해결하셨는지 공유해주시면 재밌을것 같습니다.