-
[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
# 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 를 테라폼이 완성합니다..!!!
'[IT] 공부하는 개발자 > Open Source' 카테고리의 다른 글
[Auth] oAuth2 proxy + Okta 연동하기 예제 (0) 2023.06.11 Dockerfile 작성방법, 운영에서 알아야 할 주의 사항! (0) 2023.04.21 [Kubernetes] CrashLoopBackOff 이슈 트러블슈팅 (+Nginx) (0) 2023.04.15 [ELK Logstash] config 파일 작성 예시 - input, filter, output (0) 2022.02.20 맥 Numbers 앱에서 환율 / 주식 함수 사용하기 (STOCK, CURRENCY) (2) 2021.05.08