

- Jenkins & GitLab & Terraform을 연동해서 AWS에 VPC를 생성해보자
AWS EKS 구축
EKS에 TLS 인증서를 적용한 GitLab 구축

- Terraform을 통해 AWS에 인프라를 구축할 때, AWS Access Key가 필요하다. AWS CLI용 Access Key를 생성하자

- 작업을 위한 SSH 접속을 위한 22번 포트와 Jenkins 접속을 위한 TCP 8080번 포트에 대한 인바운드 트래픽을 허용하자

- 인스턴스 이미지는 Amazon Linux2023을 사용한다

- 사양은 t3.medium으로 한다. Jenkins와 Terraform을 실행해야 하므로, 성능을 넉넉하게 주어야 한다

- 스토리지는 30GB로 할당하자

- 탄력적 IP를 할당 받고, 생성한 EC2 인스턴스에 연결하자
SSH 접속을 통해 EC2 인스턴스에 접속하자
sudo yum update -y
wget https://releases.hashicorp.com/terraform/1.3.9/terraform_1.3.9_linux_amd64.zip
sudo yum -y install unzip
unzip terraform_1.3.9_linux_amd64.zip
sudo mv terraform /usr/local/bin/
- Terraform을 설치하자. 바이너리 파일을 다운 받고, 원하는 경로에 옮기면 된다. 해당 경로는 Jenkins 설정에 필요하므로 기억해두자
terraform version
terraform -install-autocomplete
source ~/.bashrc
- 설치된 Terraform 버전을 확인하고, Terraform 명령어 자동 완성 기능을 설치하자
sudo yum -y install git
- GIT을 설치하자
- AWS 에 대한 Terraform 리소스가 없거나, CLI / SDK를 통해서만 API 작업을 실행할 수 있는 경우가 발생할 수 있다. 따라서 AWS CLI를 같이 사용하는 것이 좋다
참조 : https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install -y java-11-amazon-corretto
sudo yum install -y jenkins
- Jenkins를 설치하자
sudo service jenkins start
sudo systemctl enable jenkins
- Jenkins를 실행하고, 인스턴스 부팅 시 자동으로 실행되게 설정하자
sudo visudo
- Jenkins에서 Job 실행 시, sudo 명령을 쓰는데 password를 요구하지 않도록 설정하자
- visudo는 /etc/sudoers 파일을 관리해주는 애플리케이션이다
- vi /etc/sudoers를 통해 직접 수정할 수 있지만, /etc/sudoers 파일은 기본적으로 퍼미션이 0440이다. 쓰기 작업에 대한 권한이 없으므로, 직접 수정하려면 파일의 퍼미션을 변경해야 한다
- visudo는 이러한 퍼미션 문제를 해결해주며, 문법 & 설정이 올바른지 확인 해준다

- 위와 같이 설정하자
# sudo vi /etc/hosts
11.111.111.111 gitlab.hong.com
- GitLab Ingress에 설정한 Domain 주소와 Ingress LB의 IP 주소를 /etc/hosts에 등록하자
- Root CA 인증서를 가져오자
sudo yum -y install openssl
- 인증서 등록을 위해 openssl을 설치하자
sudo cp localCA.pem /etc/pki/ca-trust/source/anchors/.
sudo update-ca-trust
- RHEL과 CentOS는 /etc/pki/ca-trust/source/anchors/ 에 인증서 파일을 넣고, 적용 명령을 내리면 된다
http://EIP주소:8080 으로 접속하자

- 위 화면이 출력된다
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

- Admin 계정을 생성하고, 권장된 Plugin을 설치하자

- User 설정에 들어가자

- admin User의 설정에 들어가자

- User Defined Time Zone에 원하는 Time Zone을 선택하면 된다

- System 설정에 들어가 executor 수를 설정하자. 4를 10으로 바꾸면 된다
- 위 설정은 Node에서 동시에 Build할 수 있는 Job의 최대 숫자이다
- executor : Node에서 Job을 Build하기 위해 실행시키는 리소스의 기본 단위
해당 과정은 선택 사항이다

- Terraform Plugin은 Jenkins 서버에서 bintray.com을 통해, Terraform을 자동으로 다운받아 설치해주는 기능을 제공한다

- Terraform 플러그인을 이용하면, 위와 같이 Job 생성 시에 Terraform 구성 파일 내용을 직접 입력할 수 있는 Configuration Text나 Terraform에 적용시킬 구성 파일의 위치를 지정하는 Configuration Path와 같은 편의 기능을 사용할 수 있다
- Configuration Text를 통해 생성된 임시 tf 파일은 작업 실행 후 삭제된다
- 준비된 Terraform 구성 파일을 사용
- Terraform을 미리 설치
- Job에서 Execute Shell의 Shell 명령을 통해 Terraform 을 실행

- Terraform Plugin을 설치하고, Jenkins를 재시작하자

- Jenkins 관리 -> Tools에 들어가자

- Terraform 항목에서 Add Terraform 클릭

- Install automatically 체크를 해제하고, Terraform이 설치된 경로를 설정해주면 된다
- Install automatically를 사용하면, bintray.com을 통해 원하는 버전의 Terraform을 자동으로 다운받아 설치해준다

- Terraform Plugin을 설치하고, Jenkins를 재시작하자

- GitLab에서 Access Token을 발급하자

- Gloabl credentials 설정에 들어가서 Credentials를 추가하자

- 먼저, Job 실행에 사용할 Credentials를 생성하자
- Username : GitLab ID
- Password : 발급한 GitLab Access Token

- 다음으로, Jenkins에 GitLab Connection을 생성하기 위한 Credentials를 생성하자

- System 설정에 들어가서 GitLab Connection을 생성하자
- GitLab Ingress에 설정한 Domain 주소와 위에서 생성한 API token Credential을 지정해주면 된다

- Private Project를 생성하자
terraform {
required_version = "1.3.9" #자신의 terraform 버전으로 설정.
required_providers {
aws = { #사용할 프로바이더 aws 설정
source = "hashicorp/aws" #저장 경로 설정
version = "~> 5.0" #버전 설정
}
}
}
provider "aws" {
region = "ap-northeast-2" # 적용할 AWS Profile의 Region
profile = "default" # 적용할 AWS Profile 이름
}
resource "aws_vpc" "example223" { # 생성할 리소스는 vpc 이며, 이름은 example223 이다
cidr_block = "10.123.123.0/24" # vpc 대역
}
- Project 안에 main.tf 파일을 생성하자. terraform.required_version은 꼭 설치한 Terraform 버전으로 설정해야 한다
- AWS Profile을 Provider에 적용할 것이다. 따라서 AWS Access Key와 Secret Key는 따로 입력하지 않는다
- 우리는 Terraform에 AWS 인증 정보를 설정할 때, AWS Profile을 Terraform Provider에 적용하는 방법을 사용한다. 따라서 Jenkins에서 AWS Access Key와 Secret Key를 매개변수로 입력 받아 .aws/credentials 파일에 등록할 것이다
- Terraform은 AWS Profile을 이용한 자격증명도 지원한다. Profile을 사용할 경우, Terraform이 자동으로 AWS Credential 파일인 ~/.aws/credentials 파일을 참조한다
- 허나 이 방법은 Profile 공유가 어려우므로 다수의 사용자가 작업할 때는 적합하지 않은 방법이다
- AWS credentials 파일에는 AWS Profile 인증 정보를 담을 수 있다. 파일에는 다수의 Profile 설정이 가능하다. 해당 파일은 AWS CLI에 의해 관리된다
- AWS Profile이란? AWS에서 API 호출 시, 인증/인가와 같이 확인에 필요한 정보이다. Profile은 config와 credentials로 분류된다. Region / Role 과 같이 API를 요청한 주체에 대한 정보는 config에 있으며, 인증정보는 credentials에 있다
참조 : https://banhawy.medium.com/3-ways-to-configure-terraform-to-use-your-aws-account-fb00a08ded5
1. main.tf에 직접 인증 정보 기입
2. Terraform이 설치된 Node에 환경 변수로 기입 ( AWS_ACCESS_KEY_ID , AWS_SECRET_ACCESS_KEY )
3. AWS Profile 사용
4. 인증 정보가 기입된 File 사용

- 생성한 GitLab Connection을 선택하자
- AWS Access Key와 Secret Key는 Job Build 할 때, 매개변수로 입력받도록 설정하자

- 소스 코드 관리에서 레포지토리 주소, 사용할 GitLab Credential, Branch를 설정하자
- Job Build 할 때, 해당 레포지토리/Branch에 저장된 리소스를 사용할 수 있다

export AWS_ACCESS_KEY_ID=$ACCESS_KEY export AWS_SECRET_ACCESS_KEY=$SECRET_KEY echo [default] | sudo tee /home/ec2-user/.aws/credentials echo aws_access_key_id=$AWS_ACCESS_KEY_ID | sudo tee -a /home/ec2-user/.aws/credentials echo aws_secret_access_key=$AWS_SECRET_ACCESS_KEY | sudo tee -a /home/ec2-user/.aws/credentials terraform init && terraform apply --auto-approve
- 작업 내용은 다음과 같다
- 입력 받은 Access Key 매개변수를 Jenkins 노드 환경 변수로 등록한다
- 우리는 AWS Profile을 Terraform AWS 인증 정보 설정에 사용하므로, ~/.aws/credientials 파일에 Profile 인증 정보를 입력한다. region의 경우, main.tf에 입력했으므로 따로 설정하지 않아도 된다
- 가져온 main.tf를 기반으로 Terraform 실행. auto approve 옵션을 사용 안하면, 작업 진행 여부를 물어봐서 Job Build가 중단되므로 필수로 사용해야 한다

- 파라미터와 함께 빌드를 선택하자. AWS Access Key와 Secret Key를 입력하고, Build를 실행하자

- Console OutPut을 통해 실행 결과 확인

- AWS Console에 들어가서 확인하자. 잘 생성되었다
감사합니다