private subnet에 Github와 Jenkins로 CI 구축하다가 ALB때문에 다시 한 이야기

젠킨스 설치하기 - AWS 설정

private subnet에다가 EC2를 띄어서 젠킨스를 설치할 것이다.

그래서 EC2를 먼저 생성해줬다.

젠킨스를 돌리기 위해서는 최소 t3.medium이 필요하기 때문에 t3.medium을 사용했고, ubuntu가 조금 더 익숙하기 때문에 ubuntu로 하였다.

인바운드 규칙은 위와 같다.

젠킨스 gui에 접근하기 위해서 퍼블릭 서브넷(10.0.0.0/23)에서 들어오는 8080과

젠킨스 설치를 위해서 마찬가지로 퍼블릭 서브넷에서 들어오는 22요청도 허용해줬다.

 

그리고 젠킨스는 Github에 접근해서 클론을 받아와야하기 때문에 인터넷과 연결이 가능해야한다.

퍼블릭 서브넷과 연결된 NAT gateway를 만들어줬다.

 

다음 private subnet 라우팅 테이블에 위와같이 nat를 연결해줬다.

+ 퍼블릭 서브넷은 인터넷 게이트웨이와 연결이 되어있다.

 

이제 그럼 bastion을 통해서 젠킨스를 설치할 ec2에 접속한다.

 

젠킨스 설치하기 - ec2

나는 젠킨스를 docker로 실행할거기 때문에 먼저 docker를 설치하고 젠킨스를 실행시켰다.

젠킨스 설치 후 실행까지는 다음글 참고

https://ministack.tistory.com/2

 

Gitlab과 Jenkins로 CI/CD 구축하기 with Docker

서비스 상태사용 도구이슈 관리 : Jira형상 관리 : GitLab커뮤니케이션 : Notion, MatterMost디자인 : Figma빌드 도구 : Jenkins개발 도구Visual Studio Code : ver 1.90.2IntelliJ IDEA Ultimate : 2024.1.4Pycharm : 2024.1.6DataGrip :

ministack.tistory.com

 

참고로 이번에는 docker hub가 아니라 ECR을 사용할 것이고, env파일들을 aws parameter store를 써보기로 했다.

 

그렇다면 프라이빗 서브넷에 있는 jenkins gui에는 어떻게 접근할까?

ssh -i {키파일} -L 8080:{젠킨스 EC2 IP}:8080 ec2-user@{bastion IP}

 

이렇게 ssh 터널링을 설정해주면 로컬머신에서 localhost:8080으로 jenkins gui에 접근할 수 있다.

 

깃허브 세팅하기

토큰을 생성한다.

 

젠킨스 관리 >Credentials에서 해당 토큰을 등록한다.

 

이제 새 item을 눌러서 파이프라인을 생성하고 설정을 해줄 것이다.

general에서 Github project를 체크하고 url에다가 레포 주소를 입력한다.

트리거는 이걸로 선택

스읍 근데 pipeline에서 깃 레포 주소를 입력하니 이런 경고가 떴다

밑에 Credentials을 아까 등록한 토큰으로 제대로 설정을 해주어도 경고가 안 사라졌다.

해결법 모르겠다 토큰 다시 만드니까 해결됨;

우린 main 브랜치에 있는거 가져와서 빌드할거기 때문에 브랜치 설정은 이렇게..

script path는 Jenkinsfile이 위치한 루트에 맞춰서 이렇게 작성해주었다.

github webhook연결을 위한 AWS ALB 설정

로컬에서는 ssh 터널링을 통해서 젠킨스에 접근을 했는데 그럼 대체 깃허브 웹훅에다가는 어떤 주소를 넣어야할까?

localhost:8080을 넣을 수는 없지 않나?

 

내가 생각한 논리는 그래서 ALB를 만들어서 퍼블릭 서브넷 쪽으로 접근을 하면 젠킨스로 보내주는 방식을 생각했다.

강사님께 여쭤보기도 했는데

보통 프라이빗 서브넷에 젠킨스가 위치하면 깃랩을 사용하는 경우가 많다고 한다.

깃랩이 같은 네트워크에 있으면 아무래도 이런 복잡한 생각을 할 필요가 없을거 같긴함.

그럼 깃허브를 사용할때는 어떻게 하는가? 했는데 젠킨스 자체를 온프레미스로 할 수도 있고 혹은 퍼블릭 서브넷에 위치시키기도 한다고 한다.

정답이 딱 정해져있으면 좋겠는데 정말 하기 나름..인거 같아서 일단 이렇게 만들었으니 이렇게 진행을 해보았다.

 

ALB를 위한 EC2 대상그룹 생성

대상은 인스턴스로 설정하고 젠킨스가 위치한 ec2를 선택해주었다.

 

이제 로드밸런서 생성을 누르고 ALB를 선택해준다음

이렇게 설정해주고 아래에서도 vpc랑 public subnet을 선택해준다.

리스너는 HTTP:80으로 하고 대상그룹은 위에서 만든 대상그룹으로 선택

보안그룹의 경우 이렇게 설정을 해주었다. 보안적으로 이게 맞나?라는 의문이 남아있기는함.

이제 LB가 생성되면 DNS이름 이라고 써있는 부분의 주소를 복사해서 입력해보면 jenkins gui로 잘 접근하는 것을 확인할 수 있다.

 

+여기서 접근이 안돼서 시간을 엄청 날렸는데

첫번째 이유 젠킨스 내부에서 url 설정을 안함.

처음 설정할때 localhost:8080으로 했던걸 alb주소로 바꾸니까 해결이 됐다.

 

두번째 이유 캐시문제

뭔가 나의 논리상으로는 진짜 완벽하게 돌아가야되는데 절대 안되는 문제가 발생해서 절망에 빠져있었는데

시크릿창을 켜서 접속하니까 잘뜸;;;; 세상에나.... 심지어 남들한테 링크를 줘서 들어가보라니까 나빼고 다 잘됨

그냥 내 브라우저의 캐시가 뭔가 잘못 남아있었던거 같다.

 

깃허브 웹훅 설정하기

payload URL에다가 ALB주소를 넣어주면 된다.

 

그런데 여기서 큰 문제가 발생했다.

jenkins gui가 너어어어어어어어무 느려서 정말 아무것도 할 수 없었다.

클릭 하나 할때마다 2분 기다려야됨 에바;;

 

나의 예상

뭘 하나 클릭할때마다 lb를 타서 느려지는거 아닐까? 생각해서

jenkins url을 Private IP로 변경을 해주었는데 야아악간 빨라졌지만 그래도 여전히 뭔가를 하기에 너무  느렸다.

 

cpu, 메모리 사용량을 봐도 인스턴스 스펙이 딸려서 그런것도 아니었고..

응답 시간 속도 측정도 해봤으나 굉장히 빨랐다. 그냥 오직 gui에 접속했을때만 느렸다.

원인을 너무 찾고 싶었는데 이렇게 구축한 사람이 별로 없어서 정보가 별로 없었다..

 

결국 우리의 결정은 public subnet으로 이사를 가기로 했다..

이제 public으로 이사간 후에 구축한 과정도 글을 올릴 예정.

끝.