Post

최종 프로젝트 인프라 구축⑬ - 서비스 EKS 적용과 HTTPS ALB 연결

최종 프로젝트 인프라 구축⑬ - 서비스 EKS 적용과 HTTPS ALB 연결

지난시간에 이어서

지난 시간에는 EKS 내 ArgoCD를 만들고, Argo 콘솔에 접근하기 위한 ALB 엔드포인트를 생성했었다.

이번에는 ArgoCD를 사용해 백엔드 서비스들을 EKS에 올리고, HTTPS가 적용된 ALB 엔드포인트를 만들어 볼 것이다.

ArgoCD로 백엔드 서비스 배포

do17-img1

일단 ArgoCD와 배포yaml이 담긴 깃허브 레포를 연결해 줘야 하니, 아르고 콘솔의 Settings→Repositories 탭에서 Connect Repo 버튼을 누르고, 위 사진처럼 등록해 주자.

참고로 누차 강조했지만 Password는 깃허브 비밀번호가 아닌 개인 토큰 값이다!

do17-img2

이렇게 Successful이 나오면 정상~ 안되면 보안 그룹 등 네트워크 연결을 체크해 보세요

do17-img3

서비스 배포도 귀찮으니 그냥 콘솔에서 진행해 버리자. Applications 탭→New App을 클릭하고, Edit As yaml 버턴을 눌러서

예전에 로컬에서 했었던 yaml파일을 그대로 붙여넣으면 되는데…

do17-img4

Prod CI 환경 구성 때 배포 레포에 서비스별로 values-prod.yaml 운영환경 변수를 추가했으니 valueFiles를 바꿔줘야 한다.

do17-img5

아무튼 이렇게 서비스별로 배포해서 모든 서비스를 올리면 된다.

막간-배포용 레포지토리 공유

여기서 공유합니다.

테라폼과 마찬가지로 민감 정보(aws 키, db 접속주소 등) 검열된 레포지토리입니다.

각 서비스별로 configmap, secret, service, deployment1가 구성되어 있고, values-devvalues-prod 파일로 관리합니다.

실제 서비스에 적용하기 보다는, ‘이렇게 구성하면 되구나~’라는 식으로 참고만 해 주세요 ^^

HTTPS ALB 엔드포인트 만들기

do16-img1

개발환경 때처럼 api gateway가 요청을 받아 각 서비스들로 전달해주는데,
ArgoCD 때와 마찬가지로 api gateway 서비스를 노드포트로 여는 게 아닌 잉그레스로 ALB를 만들어 줘야 한다.

이건 아르고CD와 달리 핵심(?) 서비스이므로, HTTPS를 적용해야 한다.

사실은 CloudFront로 올린 웹 클라이언트가 HTTPS 기반이라, api 호출을 HTTP로 하면 안 되기 때문인데…

막간 2-S3와 CloudFront로 프론트 배포

Amazon CloudFront를 사용하면 손쉽게 웹 서버를 배포할 수 있다. 방법은

do17-img6

우선 S3 버켓을 생성합니다.

do17-img7

do17-img8

버켓 설정에서 정적 웹 호스팅 활성화를 해 줍니다.

do17-img9

do17-img10

프론트 파일을 npm build하고, build 폴더 안의 내용물을 버켓에 넣어 줍니다.

do17-img11

CloudFront 콘솔에 들어가, 위 사진처럼 생성해 줍니다. 아까 만든 버켓을 선택하는 것이 중요!

do17-img12

만들어진 CloudFront의 배포 도메인로 접속해서 화면이 나오면 성공!

아무튼 다시 HTTPS로 넘어가

HTTPS를 만들려면 도메인과 인증서가 필요하다.

인증서는 Amazon Certificate Manager(ACM)에서 간편하게 만들 수 있다.

do17-img13

ACM 콘솔에 들어가 인증서 요청을 클릭하고

do17-img14

1단계 인증서 유형퍼블릭 인증서 요청을 선택한 다음

do17-img15

2단계 도메인 설정에 도메인을 입력해줘야 한다…

당직(当職)은 여기서 공짜 도메인을 만들 수 있었다.

나머지 설정은 다 그대로 두고…

do17-img16

인증서가 만들어지면 나오는 CNAME 이름CNAME 값을 도메인의 CNAME 항목에 넣어줘야 한다.

여기서 주의할 점으로, 위 싸이트에서 넣을 때 CNAME 이름은 도메인 주소를 제외한 값을, CNAME 값은 맨 뒤의 점(.)을 빼고 넣어줘야 한다.

do17-img17

이렇게 넣고 조금 기다리다 보면 인증서 상태가 발급됨으로 나와야 성공이다.

이제 이 인증서의 ARN 주소를 복사해서 ALB설정에 집어넣어야 한다.

HTTPS가 적용된 ALB 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-gateway-ingress
  namespace: default
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: (헬스체크 엔드포인트)
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
    alb.ingress.kubernetes.io/certificate-arn: (ARN 주소)
    
spec:
  ingressClassName: alb
  rules:
    - host: (도메인 이름)
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: (연결할 서비스 이름)
                port:
                  number: (연결할 서비스의 포트)
  tls:
    - hosts:
        - (도메인 이름)
      secretName: dummy-tls-secret

저번 시간의 ArgoCD와 비슷하게 잉그레스 yaml을 만들되, 도메인이 적용되었기 때문에 host 값이 추가되었고,

annotations 항목에서 alb.ingress.kubernetes.io/certificate-arn을 추가하고, 이 값을 아까 복사한 ARN 주소로 넣어줘야 한다.

alb.ingress.kubernetes.io/actions.ssl-redirectalb.ingress.kubernetes.io/listen-ports도 마찬가지로 HTTPS 포트(443)을 추가해 주고

이 파일을 kubectl apply 하면…

do17-img18

생성된 LB의 리스너에 HTTPS가 있고, 헬스체크가 정상이면 끝이다!
참고로 위 yaml에서는 헬스체크를 위해 HTTP 접속도 설정했는데, 각자의 사정에 따라 없애줘도 무방하다.

do17-img19

마지막 작업이다. 마찬가지로 kubectl ingress를 하면 LB의 엔드포인트가 나오는데, 이놈을 도메인과 최종적으로 연결해주기 위해

do17-img20

도메인 설정의 CNAME 항목에 값만 추가해줘야 한다.

이러고 프론트의 api 호출 엔드포인트를 이 도메인으로 바꿔 주면 완벽한 HTTPS 기반 웹서비스가 완성된다!!

프로젝트를 마치며

이 편을 끝으로 장장 2달에 거친 인프라 구성이 완료되었다.

프로젝트를 회고해 보면서, 엉성하게 만든 부분도 있고 공을 들여 만든 부분도 있고 했지만

kubeadm을 통한 쿠버 클러스터 구축, Jenkinsfile 제작법, Terraform IaC와 같이 현업 때는 써보기만 했던 기술들을 직접 만들 수 있었고

무엇보다 그 때 ‘클라우드 설계를 한 사람이 했다’라는 풍문에서 결심한 ‘혼자 시스템 설계를 할 수 있는 사람’을, 이런 프로젝트에서나마 이루었다는 점이 대단했다!

사실 이 시리즈를 쓴 것도 시간이 많이 갔지만, 이렇게라도 안 하면 또 잊어버릴 것 같아 최대한 자세하게 작성했다.

미래의 당직이 이 시리즈를 보고 부디 초심을 되찾았으면 하길 바란다…

This post is licensed under CC BY 4.0 by the author.