본문 바로가기
  • lakescript
스터디 이야기/AWS EKS

[AEWS] 8-2. Amazon EKS - IaC (Terraform 심화)

by lakescript 2024. 4. 26.

 

 

 

이전 글에서 terraform의 기초에 대해 실습과 함께 해보았습니다. 이번엔 terraform의 심화 내용에 대해 정리해보겠습니다.

 

Terraform Provider

테라폼은 terraform 바이너리 파일을 시작으로 로컬 환경에나 배포 서버와 같은 원격 환경에서 원하는 대상을 호출하는 방식으로 실행됩니다. 이때 ‘원하는 대상’은 호출하는 방식이 서로 다르지만 대상의 공급자, 즉 프로바이더가 제공하는 API를 호출해 상호작용을 합니다. 여기서 테라폼이 대상과의 상호작용을 할 수 있도록 하는 것이 ‘Provider’입니다.

 

즉, terraform은 provider 없이는 어떤 종류의 인프라와 서비스도 관리할 수 없다는 의미합니다. 

 

local 이름과 provider 지정

terraform 블록의 required_providers 블록 내에 <local 이름> = { } 으로 여러 개의 provider 정의할 수 있습니다.

만약 동일한 접두사를 사용하는 Provider가 선언되는 경우 local 이름을 달리해 관련 리소스에서 어떤 Provider를 사용하는지 명시적으로 지정할 수 있습니다.

 

http 접두사를 사용하는 다수의 프로바이더 사용 정의

terraform {
  required_providers {
    architech-http = {
      source = "architect-team/http"
      version = "~> 3.0"
    }
    http = {
      source = "hashicorp/http"
    }
    aws-http = {
      source = "terraform-aws-modules/http"
    }
  }
}

data "http" "example" {
  provider = aws-http
  url = "https://checkpoint-api.hashicorp.com/v1/check/terraform"

  request_headers = {
    Accept = "application/json"
  }
}

 

동일한 http 이름을 사용하는 다수의 프로바이더가 있는 경우 각 프로바이더에 고유한 이름을 부여하고 리소스와 데이터 소스에 어떤 프로바이더를 사용할지 provider 인수에 명시합니다. 단, 동일한 source에 대해 다수의 정의는 불가능합니다.

 

단일 Provider의 다중 정의

사용되는 리소스마다 별도로 선언된 Provider를 지정해야 하는 경우가 있습니다. 예를 들면, AWS Provider를 사용하는데 서로 다른 권한의 IAM을 갖는 Access ID 또는 대상 리전을 지정해야 하는 경우입니다. 이때는 Provider 선언에서 alias를 명시하고 사용하는 리소스와 데이터 소스에서는 Provider 메타인수를 사용해 특정 Provider를 지정할 수 있습니다. Provider 메타인수에 지정되지 않은 경우 alias가 없는 프로바이더가 기본 Provider로 동작합니다.

 

provider "aws" {
  region = "ap-southeast-1"
}

provider "aws" {
  alias = "seoul"
  region = "ap-northeast-2"
}

resource "aws_instance" "app_server1" {
  ami           = "ami-06b79cf2aee0d5c92"
  instance_type = "t2.micro"
}

resource "aws_instance" "app_server2" {
  provider      = aws.seoul
  ami           = "ami-0ea4d4b8dc1e46212"
  instance_type = "t2.micro"
}

 

위의 코드는 region을 다르게 구성한 AWS Provider를 aws_instance에 지정하는 방법입니다.

provider에 region을 다르게 하고, alias를 추가하여 resouce에서 사용할 수 있게 설정합니다.

 

required_providers 정의

terraform 실행 시 요구되는 provider의 요구사항은 terraform 블록의 required_providers 블록에 여러 개를 정의하여 설정합니다. 

terraform {
  required_providers {
    <프로바이더 로컬 이름> = {
      source = [<호스트 주소>/]<네임스페이스>/<유형>
      version = <버전 제약>
    }
    ...
  }
}

 

- 호스트 주소 : 프로바이더를 배포하는 주소로서 기본값은 registry.terraform.io입니다.
- 네임스페이스 : 지정된 레지스트리 내에서 구분하는 네임스페이스로, 공개된 레지스트리 및 Terraform Cloud의 비공개 레지스트리의 프로바이더를 게시하는 조직을 의미합니다.
- 유형 : 프로바이더에서 관리되는 플랫폼이나 서비스 이름으로 일반적으로 접두사와 일치하나 일부 예외가 있을 수 있습니다.

 

 

 

Terraform Module

terraform으로 인프라와 리소스를 관리하면 시간이 지날수록 구성이 복잡해지고 관리하는 리소스가 늘어나게 되며 아래의 문제를 야기합니다.

 

- 테라폼 구성에서 원하는 항목을 찾고 수정하는 것이 점점 어려워짐
- 리소스들 간의 연관 관계가 복잡해질수록 변경 작업의 영향도를 분석하기 위한 노력이 늘어남
- 개발/스테이징/프로덕션 환경으로 구분된 경우 비슷한 형태의 구성이 반복되어 업무 효율이 줄어듦

- 새로운 프로젝트를 구성하는 경우 기존 구성에서 취해야 할 리소스 구성과 종속성 파악이 어려움

 

이를 효과적으로 해결하기 위해 terraform module을 사용해서 관리합니다.

 

Terraform 모듈은 Terraform 코드의 집합으로, 재사용 가능하고, 공유 가능하며, 조직화된 방법으로 Terraform 구성을 관리할 수 있게 해줍니다. 다른 Terraform 프로젝트에서 재사용할 수 있도록 독립적인 패키지로 구성됩니다.

 

즉, 테라폼으로 관리하는 대상의 규모가 커지고 복잡해져 생긴 문제를 보완하고 관리 작업을 수월하게 하기 위한 방안으로 활용할 수 있는 것이 module입니다.

 

구성 요소

모듈은 루트 모듈과 자식 모듈로 구분됩니다.

 

루트 모듈(Root Module)

테라폼을 실행하고 프로비저닝하는 최상위 모듈
자식 모듈(Chile Module)

루트 모듈의 구성에서 호출되는 외부 구성 집합

 

 

모듈화

모듈의 기본적 구조는 테라폼 구성으로 입력 변수를 구성하고 결과를 출력하기 위한 구조로 구성합니다. 즉, 모듈화라는 용어는 이런 구조를 재활용하기 위한 템플릿 작업을 말합니다. 애플리케이션 개발시에도 자주 사용되는 용어로 테라폼은 작성된 모듈을 다른 루트 모듈에서 가져다 사용하며 이를 통해 재사용성과 표준화 구조를 구성할 수 있습니다. 모듈에서 필요한 값은 variable로 선언해 설정하고, 모듈에서 생성된 값 중 외부 모듈에서 참조하고 싶은 값은 output으로 설정합니다.

 

 

실습

모듈 다운로드

git clone https://github.com/terraform-aws-modules/terraform-aws-vpc/

 

위의 명령어로 terraform aws vpc module을 다운로드합니다.

 

모듈 구조 확인

tree ../../modules

코드 수정

리전 변경

sed -i -e 's/eu-west-1/ap-northeast-2/g' main.tf

VPC CIDR 변경

sed -i -e 's/10.0.0.0/10.10.0.0/g' main.tf

 

 

terraform 실행

terraform init & plan & apply -auto-approve

 

terraform init, plan, apply를 한번에 실행하겠습니다.

 

 

위의 사진과 같이 apply가 완료된 것을 확인하실 수 있습니다.

 

 

Terraform 확인

terraform state list

 

위의 명령어를 통해 terraform으로 생성한 리소스 목록들을 확인해보겠습니다.

 

 

module이 생성되어 배포된 것을 확인하실 수 있습니다.

 

 

정리

이렇게 module을 가져와 내가 원하는 값으로만 수정하여 편리하게 사용할 수 있다는 것을 확인하실 수 있습니다.

 

https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest

 

Terraform Registry

 

registry.terraform.io

 

위의 페이지에 접근해서 아래의 사진과 같이 Inputs, Outpus, Resources를 확인하실 수 있습니다.

 

이처럼 module을 통해 input값들, outputs값들, resource값들을 수정하여 원하는 값만 내 terraform에 배포할 수 있습니다.