AWS에 Jenkins를 구축해보자 - (2) EC2 인스턴스 생성

Jongwon·2023년 10월 7일
0

에피메테우스

목록 보기
2/6
post-thumbnail

이전 글에서 VPC를 설정했으니, 이제 각각의 서브넷 영역에 EC2를 생성해볼 차례입니다.

Jenkins 역시 외부 사용자로부터 접근이 허용될 필요가 없는 서비스이기 때문에 Private Subnet 영역에 있는 EC2에서 실행하도록 하겠습니다.

전제조건

확인해야 할 점은 EC2 인스턴스 콘솔로 접속했을 때, VPC를 생성했던 리전(아시아 태평양 서울)과 동일한 리전이어야 한다는 것입니다.

EC2 인스턴스 생성

인스턴스 생성은 간단한데, 몇가지 주의해서 해야할 점이 있습니다.

먼저 Jenkins부터 생성하겠습니다.

Jenkins 인스턴스

아래의 조건과 동일하게 설정해주세요.

  1. 이름 설정

  2. Ubuntu 이미지 선택

  3. 인스턴스 유형은 t3.micro로 설정(버전은 크게 상관없으나 micro 이상으로 권장합니다.)

  4. 키 페어 생성(기존에 키페어를 사용한다면 사용하셔도 됩니다.)
    => ex. jenkinsKey.pem이라는

  1. 네트워크 설정 -> 편집 클릭

  2. VPC는 방금 생성한 VPC로 변경

  3. Subnet은 Private subnet으로 설정

  4. Public IP 자동할당 -> 비활성화

  5. 보안그룹 생성
    => 새로운 보안그룹을 생성합니다. 이름은 상관없지만 구분을 쉽게 하기 위해 jenkinsVpcSecurity으로 짓겠습니다.

  1. 인바운드 보안 그룹 규칙
    => 추후 터널링을 진행하면 변경하겠지만, 현재는 SSH을 통한 접근만 허용하겠습니다.
유형프로토콜포트 범위소스 유형원본설명
sshTCP22위치 무관0.0.0.0/0

Bastion Host 인스턴스

Private 영역에 개발자가 접근하는 방법은 크게 3가지로 나눌 수 있습니다.

  • Bastion host를 통한 Jump <= 이번에 할 방식
  • VPN 설치
  • AWS Session Manager

이 외에도 여러 방법이 있을 수 있지만, 개인의 레벨에서 할 수 있는 최대 범위는 3가지라고 생각합니다. 하지만 VPN은 계속 장치와 부착되어 있어야하고, Session Manager도 한가지 방법이 될 수 있는데, 이는 IAM 권한을 부여해야 하므로 추후에 별도로 다루어보도록 하겠습니다.

  1. 인스턴스 생성

  2. OS는 Amazon Linux로 설정

  3. 인스턴스 유형은 t3.nano 설정(버전은 크게 상관없습니다.)

  4. 키 페어 생성(기존에 키페어를 사용한다면 사용하셔도 됩니다.)
    => jenkins 인스턴스와 다른 키페어를 사용하는 것을 권장합니다.

  5. 네트워크 설정 -> 편집 클릭

  6. VPC는 방금 생성한 VPC로 변경

  7. Subnet은 Public subnet으로 설정

  8. Public IP 자동할당 선택

  9. 보안그룹 생성
    => 새로운 보안그룹을 생성합니다. 저는 bastionGroup으로 짓겠습니다.

  10. 인바운드는 초기 설정 그대로 22번 포트만 열어두시면 됩니다.

유형프로토콜포트 범위소스 유형원본설명
sshTCP22위치 무관0.0.0.0/0

중간 점검

총 EC2는 2개를 만들었고, 한개는 Public, 한개는 Private 영역에 배정될 것입니다.

어플리케이션 및 OS 이미지인스턴스 유형키 페어Private IP 주소Public 여부
Ubuntut3 microjenkinsKey.pem10.100.0.132x
Amazon Linuxt3 microbastionKey.pem10.100.0.8o




Jenkins 설치

기본 환경은 구축했으니 Jenkins를 설치해야 합니다. 하지만 아직까지는 Jenkins를 설치할 인스턴스에 접근할 수 있는 방법이 없습니다.

여기서 Bastion Host의 역할이 생깁니다.

Jenkins 인스턴스 접속

Private 영역에 있는 인스턴스로 접근하기 위해 몇가지 작업이 필요합니다.

실행환경

실행환경은 Windows 11 OS에 WSL2 Ubuntu를 설치하여 Ubuntu 터미널에서 진행하도록 하겠습니다.

key를 저장할 폴더 생성

mkdir명령어를 통해 폴더를 생성합니다. 저는 Ubuntu의 home->keys라는 폴더에 저장하고 싶기 때문에 아래와 같이 명령어를 작성하겠습니다.

mkdir ~/keys

key 이동 및 권한 변경

먼저 앞서 생성했던 key들을 WSL에서 작업하기 좋은 위치로 복사하는 것이 좋습니다.
WSL이므로 리눅스 환경에서 /mnt/c 아래에 c드라이브 아래에 있는 파일들을 확인할 수 있습니다.

저는 key들을 Desktop에 저장했기 때문에 아래의 위치로 이동하겠습니다. 사용자의 컴퓨터마다 Desktop의 위치는 다르기 때문에 ls명령어를 통해 파일명을 확인해가며 이동하시기 바랍니다.

/mnt/c/Users/tank3/Onedrive/Desktop

다음으로 이전에 만들었던 keys폴더로 복사하겠습니다.
cp jenkinsKey.pem ~/keys
cp bastionKey.pem ~/keys

2개의 인스턴스를 만들었고, 2개의 키를 생성했으니 모두 복사해줍니다.

키를 복사했으므로 권한도 변경해줍니다.
chomd 400 jenkinsKey.pem
chomd 400 bastionKey.pem


jenkins 1차 접속시도

SSH 연결을 시도하지만 당연하게도(?) 실패합니다. 내부 사설 IP로는 접근을 할 수가 없기 때문입니다.

따라서 앞으로는 jenkins ec2에 접속할 때 bastion host에서 ssh 연결을 해서 접속을 하도록 만들겠습니다.


Jenkins EC2 인바운드 수정

  1. 젠킨스 인스턴스를 클릭하여 상세 페이지로 이동합니다.

  2. 아래 보안 -> 보안 그룹에 jenkinsSecurity에 걸려있는 하이퍼링크로 이동합니다.

  1. 아래 인바운드 규칙 -> 인바운드 규칙 편집을 클릭합니다.
    => 현재는 아래 그림에서 22번 포트만 작성되어 있을 것입니다.

  2. 기존 SSH 인바운드 규칙을 삭제합니다.

  3. 규칙 추가를 누르고 jenkins의 접속 포트가 될 8080포트를 개방합니다. 이때 소스를 bastionGroup에 해당하는 securityGroup으로 선택합니다.

    이렇게 함으로써 추후에 터널링을 할 때, local device에서 Jenkins의 8080포트로 직접접근이 가능해집니다.

  4. 22번 포트도 5번 방식과 동일하게 개방합니다.

  5. 저장합니다.


jenkins 키를 bastion host 내부로 복제

이제 bastion host에서는 22번 포트와 8080포트를 통해 Jenkins ec2로 접근가능합니다. 22번 포트는 SSH 포트이므로, 키를 가지고 접근해야하는데 아직 Bastion EC2에는 키가 존재하지 않습니다. 따라서 키 복사로 넣어주도록 하겠습니다.

Secure Copy 명령인 scp명령어를 사용하도록 하겠습니다.
scp -i bastionKey.pem jenkinsKey.pem ec2-user@***.***.***.***:~/
=> ip부분은 마스킹 되었습니다.

이때 앞의 bastionKey.pem은 접속할 ec2의 비밀키의 경로, 뒤의 jenkinsKey.pem은 복사할 파일의 경로입니다.
Amazon Linux이기 때문에 ec2-user이고, @뒤에는 bastion host의 public ip주소를 작성하면 됩니다.
ip주소 뒤에 :[파일경로]를 통해 해당 Bastion 인스턴스 내부 저장위치를 지정할 수 있습니다.

만약 ec2정보를 모른다면 해당 ec2 상세정보 -> 연결 -> ssh client를 통해 확인할 수 있습니다.


Bastion Host로 접속

이제 bastion ec2로 접속하여 실제로 키가 들어갔는지 확인해보겠습니다.

bastionKey.pem 파일이 있는 위치에서 위의 SSH 클라이언트 접속 가장 아래의 명령어를 통해 접속할 수 있습니다.
ssh -i "bastionKey.pem" ec2-user@***.***.***.***

ls명령어를 통해 실제로 키가 잘 들어갔는지 확인가능합니다.


Jenkins 2차 접속시도

이제 키가 존재하고, 같은 VPC 내부에 있으므로 접속이 가능합니다.



Jenkins 설치

젠킨스 설치는 버전마다 달라지기 때문에 공식문서를 참고하는 것이 가장 정확합니다.
https://www.jenkins.io/doc/book/installing/linux/#debianubuntu

LTS(Long Term Support) 릴리즈를 설치하는 것이 버그 발생 확률이 적으므로, LTS에 적혀있는 명령어를 한줄씩 복사하여 작성하시면 됩니다.

왜 설치가 가능할까?
이는 앞서 NAT Gateway를 Subnet에 연결해두었기 때문입니다. 따라서 설치가 끝났다면, 그리고 더이상 외부 인터넷 접속이 필요하지 않다고 판단되면 NAT Gateway를 중지하는 것이 좋습니다.



Jenkins 실행

설치가 끝났으니 실행해 보겠습니다.

실행: sudo service jenkins start
실행 상태: sudo service jenkins status
중지: sudo service jenkins stop
재시작: sudo service jenkins restart


다음에는 로컬 디바이스에서 브라우저를 통해 젠킨스 콘솔에 접속하고, 나머지 설정을 완료하도록 하겠습니다.

profile
Backend Engineer

0개의 댓글