ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Terraform] 테라폼이란? 테라폼으로 인프라 구성하기
    [IT] 공부하는 개발자/Open Source 2023. 4. 23. 20:40

     

    최근에 운영에서 AWS k8s 클러스터 셋업을 하면서... ALB, IAM 등을 테라폼으로 만들었는데 정말 편리하더라고요

    인간은 이렇게 계속해서 대체되어 가는군요..ㅠㅋㅋㅋ

    자동화의 물결을 피할 수가 없어요...

     

     

     

    테라폼이란?

    테라폼은 인프라를 코드로 관리할 수 있는 도구


     

    테라폼을 쓰는 이유

    1. 인프라를 코드로 관리할 수 있음 -> 자동화 가능!
    테라폼을 사용하면 인프라를 코드로 관리할 수 있습니다. 이를 통해 서버나 네트워크 등의 인프라를 쉽게 생성, 수정, 삭제할 수 있습니다. 또한, 코드로 관리하므로 변경 이력도 추적할 수 있습니다. 코드로 관리하기 때문에 인프라를 자동으로 생성할 수 있습니다. 자동화를 통해 Human error를 줄일 수 있습니다.

    2. 다양한 클라우드 서비스 지원
    테라폼은 AWS, Azure, Google Cloud Platform 등 다양한 클라우드 서비스를 지원합니다. 따라서, 다양한 클라우드 환경에서 일관된 방식으로 인프라를 관리할 수 있습니다.

    3. 코드 재사용성
    테라폼은 모듈을 제공하여 코드의 재사용성을 높일 수 있습니다. 모듈을 사용하면 공통된 코드를 한 번 작성해 두고, 재사용할 수 있습니다. 이는 특정 휴먼에 대한 의존성을 감소시킵니다. 인프라 담당자가 갑자기 퇴사하더라도, 후임 개발자가 코드를 보고 이전에 셋업 된 서버 구성을 이해하고 동일한 서버를 띄우는 것이 가능합니다.

    4. 변경 이력 관리 -> 안정성
    테라폼은 인프라를 변경할 때, 변경 이력을 추적하고, 변경 사항에 대한 검증을 수행합니다. 이를 통해 인프라 변경 시 발생할 수 있는 문제를 사전에 예방할 수 있습니다

     


    작성 예시

    Instance 생성하기

    ```
    # provider 설정
    provider "aws" {
      region = "us-west-2"
    }
    
    # 인스턴스 생성
    resource "aws_instance" "example" {
      ami           = "ami-0c55b159cbfafe1f0"
      instance_type = "t2.micro"
    
      # 보안 그룹 적용
      security_groups = [aws_security_group.instance.name]
    
      tags = {
        Name = "example-instance"
      }
    }
    
    # 보안 그룹 생성
    resource "aws_security_group" "instance" {
      name        = "example-instance-sg"
      description = "보안 그룹 설명"
    
      ingress {
        from_port   = 22
        to_port     = 22
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
      }
    }
    ```

     

    이 코드를 실행하면, AWS EC2 인스턴스와 보안 그룹이 자동으로 생성됩니다. `provider` 설정에서 AWS 서비스를 사용할 지역(region)을 지정하고, `resource` 블록에서 인스턴스와 보안 그룹을 생성합니다. `tags` 블록은 생성한 인스턴스에 이름을 지정하는 용도로 사용됩니다. 

     

     

    CI/CD 가 잘 적용된 플랫폼이라면, 이 코드를 Github에 머지하는 것만으로 검증 & 실행이 트리거 되어 바로 생성완료가 되겠죠!

     

    ALB 생성하기

    이번에는 AWS ALB 를 만들어 봅니다.

    Terraform 은 공식 문서가 정말 잘 되어 있습니다. 공식 홈페이지에 들어가서 ALB 로 키워드로 검색해서 ALB 생성 샘플 코드를 보고, 적용할 수 있는 옵션도 확인합니다.

    https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb

     

    Terraform Registry

     

    registry.terraform.io

     

     

     

    # AWS Application load balancer 정의
    
    resource "aws_lb" "test" {
      name               = "test-lb-tf"
      internal           = false
      load_balancer_type = "application"
      security_groups    = [aws_security_group.lb_sg.id]
      subnets            = [for subnet in aws_subnet.public : subnet.id]
    
      enable_deletion_protection = true
    
      access_logs {
        bucket  = aws_s3_bucket.lb_logs.id
        prefix  = "test-lb"
        enabled = true
      }
    
      tags = {
        Environment = "production"
      }
    }
    
    
    # ALB 의 listen 동작 정의
    
    resource "aws_lb_listener" "front_end" {
      load_balancer_arn = aws_lb.front_end.arn
      port              = "443"
      protocol          = "HTTPS"
      ssl_policy        = "ELBSecurityPolicy-2016-08"
      certificate_arn   = "arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4"
    
      default_action {
        type             = "forward"
        target_group_arn = aws_lb_target_group.front_end.arn
      } # aws_lb_target_group 도 정의해주어야 하는데 생략합니다 
      
      stickiness {
        enabled          = true
        duration         = 600
      }
    }

     

    위의 코드로 ALB 를 정의하고, ALB 의 listen 동작을 정의해주었습니다.

    공식 문서를 참고해서, 리스너의 동작에 고정 세션을 추가해 주기로 합니다. stickiness 설명을 잘 읽어보고 옵션으로 붙여 줍니다!

     

     

    enabled 를 true 로 두어 target group level 로 고정 세션이 활성화 되게 하고 (요청이 처음 연결된 target_group 으로 다시 연결 됩니다. target_group 안에서의 stickiness 는 별도로 다시 정의해 주어야 합니다.) duration 은 sec 단위입니다. 세션 지속 시간은 600초로 하였습니다.

     

    참고로 AWS ALB 는 immutable 한 자원이라, 생성 후에 변경되지 않습니다. 포트 번호등의 변경을 작업하기 위해서는 Terraform 코드 주석 처리 -> 주석 해제를 각각 다른 커밋으로 머지해서 삭제 -> 생성을 유도해야 했습니다...


     

     

    진정한 Continous delivery 를 테라폼이 완성합니다..!!!

    댓글

Copyright in 2020 (And Beyond)