IaC

Terraform - (5) Modules

Operation CWAL 2021. 6. 10. 23:17

Module

지금까지는 main.tf에 모든 코드를 작성하는 방식으로 진행하였다. 이번 시간엔 용도에 따라, Terraform 파일을 분리하고 이를 main.tf에서 호출하는 방식으로 구성해보자. 우선 'modules/ec2' 라는 디렉토리 하위에 ec2.tf 파일을 다음과 같이 작성한다.

variable "ec2name" {
    type = string
}
resource "aws_instance" "ec2" {
    ami = "ami-0094965d55b3bb1ff"
    instance_type = "t2.micro"
    tags = {
        Name = var.ec2name
    }
}

output "instance_id" {
    value = aws_instance.ec2.id
}

'ec2name' 변수는 해당 모듈을 호출하는 곳에서 값을 할당하도록 하였다. 그 외엔 기존 Terraform 파일과 큰 차이가 없는 것을 알 수 있다.

다음은 'modules' 디렉토리에 아래와 같은 main.tf를 추가한다.

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

module "ec2module" {
    source = "./ec2"
    ec2name = "Name from Module"
}

output "module_output" {
    value = module.ec2module.instance_id
}

가장 눈여겨 볼 곳은 모듈을 불러오는 module block이다. 모듈 이름과 경로(디렉토리), 그리고 해당 모듈에 속한 변수에 값을 할당하는 부분으로 구성되어 있다.
output block이 'ec2module' 모듈과 main.tf 양쪽에 모두 있는 이유는 다음과 같다. module 내부에 존재하는 output은 그 자체로는 출력되지 않으며, main.tf에서 output 변수를 자신의 output block에 추가해야만 화면에 출력되기 때문이다.

 

다음은 'terraform apply' 명령어 결과이다. ec2 관련 리소스를 모두 ec2module로 옮겼음에도 불구하고, 기존과 동일하게 동작하는 것을 알 수 있다.

AWS 콘솔에서 ID가 'i-0bbfde1144e17bc60'인 EC2 인스턴스를 확인해보자. 이름 역시 'Name from Module'로 설정되었는가?

 

Remote Modules

위에서는 직접 만든 모듈을 Local에서 불러오는 방식으로 구성하였지만, 사실 우리가 필요로 하는 대부분의 모듈은 Terraform Registry에 이미 존재한다. 예를 들어, 'vpc' 모듈 같은 경우 다음과 같이 선언하는 것만으로 바로 사용 가능하다.

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "3.1.0"
  # insert the 18 required variables here
}

모듈 다운로드는 'terraform init' 명령어를 통해 자동으로 수행되며, 사용자는 자신이 사용하고자 하는 모듈의 사용법만 알면 된다.

 

'IaC' 카테고리의 다른 글

Terraform - (7) Advanced  (1) 2021.06.19
Terraform - (6) IAM  (0) 2021.06.18
Terraform - (4) 기본 AWS 리소스  (0) 2021.06.08
Terraform - (3) Variables  (0) 2021.06.07
Terraform - (2) 기본 사용법  (0) 2021.06.06