Jenkins 배포하기

Jenkins 배포 핵심

Jenkins 배포에서 중요한 것은 EFS 활용과 Userdata 부분입니다. ALB + Autoscaling 을 생성하는 부분은 앞선 실습에서 했기 때문에 이번 실습에서는 생략하겠습니다.

3. 어플리케이션 서비스 만들기chevron-right

Elastic File System 생성

  • Terraform으로 Elastic file system을 생성합니다.

  • 생성된 EFS의 Domain name은 Instance의 Userdata에서 참조됩니다.

vim terraform/platform/jenkins/_module/jenkins/efs.tf
# Security Group for EFS
## Should allow Jenkins Instance ONLY!!!
resource "aws_security_group" "efs" {
  name        = "${var.service_name}-efs-${var.vpc_name}"
  description = "${var.service_name} efs sg for ${var.vpc_name}"
  vpc_id      = var.target_vpc

  ingress {
    from_port = 2049 # for NFS

    to_port  = 2049
    protocol = "tcp"
    security_groups = [
      # EC2 Instance Security Group
      aws_security_group.ec2.id,
    ]
  }

  tags = {
    Name = "${var.service_name}-efs-${var.vpc_name}"
  }
}

resource "aws_efs_file_system" "file_system" {
  tags = {
    Name = "${var.service_name}-efs-${var.vpc_name}"
  }
  
  #You can control this value through variable
  provisioned_throughput_in_mibps = var.efs_provisioned_throughput_in_mibps
  
  #You can control this mode through variable
  throughput_mode = var.efs_throughput_mode

}

resource "aws_efs_mount_target" "mount_target" {
  # If you do not have NAT gateway  or NAT instance in private subnets,
  # You should deploy jenkins to public subnet!
  count          = length(var.private_subnets)
  #count          = length(var.public_subnets)
  file_system_id = aws_efs_file_system.file_system.id

  subnet_id      = element(var.private_subnets, count.index)
  #subnet_id      = element(var.public_subnets, count.index)
  security_groups = [
    aws_security_group.efs.id,
  ]
}

User data 정의

  • Userdata에 efs 도메인 이름을 참조하기 위해서 테라폼의 template_file을 활용합니다.

먼저 userdata.sh.tpl 을 살펴보겠습니다. Userdata에서 배포에 필요한 기본 패키지를 설치하고, 생성된 EFS를 /var/lib/jenkins 에mount합니다.

위에서 정의한 user_data 파일은 template_file 형태로 참조합니다. 변수로는 EFS dns_name을 넘겨줍니다.

Module 사용 부분

  • Jenkins 전체 세트는 Module을 통해서 정의하고, 실제 변수들은 환경에 따라 다르게 세팅합니다.

  • terraform/platform/jenkins/<환경> directory를 통째로 복사해서 새로운 환경 변수를 정의하면, 동일한 jenkins 세트를 생성하실 수 있습니다.

  • 배포하는 리전이 서울(ap-northeast-2)가 아니면, terraform.tfvars 파일에서 jenkins_master_ami 를 해당 리전의 AMI ID로 변경해주시기 바랍니다.(Amazon Linux 2)

  • External LB는 보안을 위해서 반드시 내부망만 오픈하시기 바랍니다!!!

배포 후 세팅

  • Jenkins를 배포하고 나면 Route53 URL을 통해서 Jenkins에 접속하실 수 있습니다.

  • 홈페이지에 접속하시면 아래와 같이 init password를 입력하라고 나옵니다.

    • 배포된 인스턴스에 접속하셔서 웹페이지에 적힌 path 파일에서 패스워드를 얻으신 후에 붙여넣으시면 됩니다.

    • Instance 접속은 bastion host -> instance로 하셔도 되고, aws sessions manager를 통해서 접속하실 수도 있습니다.

    • SSM 접속을 위한 기본적인 Permission은 이미 IAM Role에 들어 있습니다.

이후에 설치를 진행합니다. 원하시는 메뉴로 설치를 진행하시기 바랍니다.

Last updated

Was this helpful?