Terraform

hyeok3011·2023년 10월 23일
0

Terraform이란

API를 통해 클라우드 인프라를 안전하고 효율적으로 구축, 변경, 버전관리 하기 위한 자동화 툴이다.(라고 본인들을 소개한다.)

하시코프(Hashicorp)에서 클라우드 인프라 스트럭처 자동화를 위해 개발한 IaC(Infrastructure as Code)툴 이다.
IaC은 수동으로 인프라를 관리하는것이 아닌 코드를 통해 인프라를 관리한다는 개념으로 인프라스트럭처 = 코드, 코드 = 인프라스트럭처 가 된다.

코드로 인프라 스트럭처를 개발한다고 했는데 테라폼에서는 하시코프 설정 언어(HCL / Hashicorp Configuration Language)을 사용하여 인프라스트럭처를 선언한다.

테라폼은 AWS, GCP, Azure, OracleCloud, NCP, Heroku등 다양한 프로바이더를 지원한다.
다양한 클라우드 서비스를 사용하더라도 통합 인프라 관리에 용이하다.

이를 통해 테라폼만으로 멀티 클라우드의 리소스들을 선언하고 코드로 관리하는 것도 가능하다. (하지만 그것만은 피하고싶다.)

aws에서 iac를 사용하기 위해 cloudformation을 따로 공부할 필요가 없다는 말이 된다.

테라폼의 동작 과정과 용어를 살펴보자

Terraform Workflow

  1. Write
    1. HCL를 사용하여 Infrastructure의 리소스를 ".tf"확장자의 파일에 작성한다.
  2. Plan
    1. 내가 작성한 코드가 기존 인프라 및 구성을 기반으로 생성, 업데이트, 삭제 등 어떠한 행위를 할 것인지 실행 계획을 먼저 보여 준다.
  3. Apply
    1. 모든 리소스의 종속성을 고려하여 순서대로 제안된 작업을 수행한다.
      (security group간 종속성이나 vpc, cidr, routing table등 알아서 종속성을 고려하여 생성이 된다.)

기본적인 용어

  • Provisioning
    프로비저닝은 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말한다.
  • Provider
    테라폼과 외부 서비스를 연결해주는 기능을 하는 모듈입니다. (aws, gcp, azure, NCP, DataDog….)
  • Resource
    리소스란 특정 프로바이더가 제공해주는 서비스를 뜻하며 terraform이 조작할 대상이다. (ec2, recurity group, ecr)

간단한 실습

Write

먼저 provider선언 및 resource선언 한다.

# provider선언
provider "<PROVIER_NAME>" {
  access_key = "<ACCESS_KEY>"
  secret_key = "<SECRET_KEY>"
  region = "ap-northeast-2"
}

# 사용할 리소스 선언
resource "aws_key_pair" "ssh_key" {
    key_name = "web_admin"
    public_key = file("~/.ssh/web_admin.pub")
}


resource "aws_security_group" "security_group" {
  name = "web-admin-ec2-sg"
  description = "Allow SSH port from my home"
  ingress {
    from_port = 22
    to_port = 22
    protocol = "tcp"
    cidr_blocks = ["xxx.xxx.xxx.xxx/32"]
  }
}

resource "aws_instance" "instance" {
  ami = "ami-03221589fd7c8f183" # aws machine image (ubuntu, amazon linux)
  #instance_type = "t2.micro"
  key_name = aws_key_pair.ssh_key.key_name
  vpc_security_group_ids = [
    aws_security_group.security_group.id,
  ]
}

plan

추가, 업데이트, 삭제 리소스를 모두 확인가능하고 필수 옵션을 빼먹거나 잘못 작성한 경우에 바로 확인이 가능하다.

terraform plan
..............
  # aws_key_pair.ssh_key will be created
  + resource "aws_key_pair" "ssh_key" {
      + arn             = (known after apply)
      + fingerprint     = (known after apply)
      + id              = (known after apply)
      + key_name        = "web_admin"
      + key_name_prefix = (known after apply)
      + key_pair_id     = (known after apply)
      + key_type        = (known after apply)
      + public_key      = "{}"
      + tags_all        = (known after apply)
    }
..............
Plan: 3 to add, 0 to change, 0 to destroy.

apply

적용 결과를 보여준다.

terraform apply
.............
Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_key_pair.ssh_key: Creating...
aws_security_group.security_group: Creating...
aws_key_pair.ssh_key: Creation complete after 0s [id=web_admin]
aws_security_group.security_group: Creation complete after 1s [id=****]
aws_instance.instance: Creating...
aws_instance.instance: Still creating... [10s elapsed]
aws_instance.instance: Creation complete after 12s [id=****]

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

위처럼 간단하게 EC2를 만드는 구성정도는 쉬운데 실제 프로덕션 환경에서 사용하는것은 쉽지 않았다.

사용 후기

개인적으로 Plan, Apply기능이 조금 신선했다. 만약 AWS Console, CLI, SDK등 다른 방법으로 인프라를 구성할때는 인프라 구성 순서가 필요했다.
securiry group을 만들때 security group간 종속성을 위해 번거로운 작업들이 있었는데 이러한 작업들도 쉽게 처리가 된다.

코드로 관리하다보니 버전관리가 된다는점과 PR단계에서 리뷰를 받아 문제가 될만한 부분을 사전에 찾을수 있었다.

장점도 명확하지만 사용하면서 불편했던 점들도 분명 있었다.
기존에 이미 있던 서비스들을 terraform으로 마이그레이션 하는 작업들이 유독 힘들었다.
기회가 된다면 같이 과정 정리도 하면 좋을듯 하다.

profile
뇌가 디스크가 아니라는 사실을 깨달아 버린 사람

0개의 댓글