AWS Fargate를 사용해 jenkins master <-> agent를 구성해보자. Info
AWS Fargate를 사용해서 Jenkins를 구축하는 간단한 프로젝트를 진행해 봅니다.
목차.
- https://hwan-shell.tistory.com/375 (Jenkins ECS Fargate 설명)
- https://hwan-shell.tistory.com/376 (네트워크 구축)
- https://hwan-shell.tistory.com/377 (ECS, Cloud Map, EFS 구축)
- https://hwan-shell.tistory.com/378 (Jenkins Node 설정 및 테스트)
AWS Fargate로 Jenkins master <-> agent를 구성했을 때의 장단점은 다음과 같습니다.
장점
- Agent를 관리할 필요가 없다.
- 여러 곳에서 Build를 해도 Throughput이 발생하지 않는다.
- 원하는 Docker image를 정의해놓으면 손쉽게 사용할 수 있고, 재사용 성도 증가한다.
(예를 들어 python을 빌드하는 Docker image를 만들면 다른 사람도 사용할 수 있다.) - Build task 단위를 좀 더 나눌 수 있으며, 로그, 실패지점 파악 등이 용이하다.
단점
- 속도가 느리다. (Docker가 띄워지는 시간이 좀 걸린다.)
- Fargate이다 보니 제약사항이 생긴다.
- Maven agent, python agent 등 Docker agent image 버전관리가 안되어 있는 것들이 있어서,
직접 만들어서 관리해야 한다. - 처음 셋팅하는 부분이 어렵다.
- Fargate 형태이므로 Build 과정 중 docker in docker 과정이 들어갈 수 있다.
관리하는 코드들이 작을 땐 굳이 이렇게 할 필요는 없지만,
여러 곳에서 Jenkins를 사용하고, Slave가 3~4개 이상이 된다면 AWS Fargate 구조를 고려해볼만 하다고 생각합니다.
Terraform 코드
https://github.com/dnfwlq8054/jenkins_in_fargate
Architecture
설명.
AWS Fargate를 사용하기 때문에 파일을 영구히 저장할 AWS EFS가 필요합니다.
Jenkins master <-> agent간 통신을 IP로도 할 수 있지만,
AWS Cloud Map을 사용해 Private DNS를 설정한 후 Domain name을 사용해 통신하도록 합니다.
IaC
Terraform으로 구성합니다.
완성본은 Github에 올립니다.
협업과정이 아니기 때문에 Terraform lock은 사용하지 않습니다.
준비물은 AWS IAM계정에서 Architecture에 나와있는 AWS Resource들을 배포할 수 있는 권한만 있으면 됩니다.
(저는 귀찮아서 배포 계정에는 AdministratorAccess 권한을 줬습니다.)
혹시나 Cloudformation으로 작업할 분이 계시다면 아래 링크를 참고해 주세요.
https://jenkinshero.com/jenkins-jobs-in-aws-ecs-with-slave-agents/
Terraform 구조는 다음과 같습니다.
`-- terraform
|-- main.tf
|-- resources
| |-- cloud_map
| | |-- main.tf
| | |-- outputs.tf
| | `-- variables.tf
| |-- ecs
| | |-- main.tf
| | `-- variables.tf
| |-- efs
| | |-- main.tf
| | |-- outputs.tf
| | `-- variables.tf
| |-- elb
| | |-- main.tf
| | |-- outputs.tf
| | `-- variables.tf
| |-- iam
| | |-- main.tf
| | |-- outputs.tf
| | `-- variables.tf
| |-- sg
| | |-- main.tf
| | |-- outputs.tf
| | `-- variables.tf
| `-- vpc
| |-- main.tf
| |-- outputs.tf
| `-- variables.tf
Part 별로 정리한 글입니다.
Part 1. Jenkins Network 구축
https://hwan-shell.tistory.com/376
Part 2. Jenkins AWS ECS Fargate 구축
https://hwan-shell.tistory.com/377