IT/Terraform

[Terraform] AWS 리소스별로 레이아웃을 나누는 방법

반응형

Intro

오늘은 테라폼 소스코드를 AWS리소스별로 레이아웃을 나누는 방법을 알아보도록 하겠습니다. 각각의 레아웃으로 나뉘어진 리소스는 각각의 terraform state 파일(.tfstate)을 갖게 됩니다. 하지만 AWS리소스를 생성하다보면 각 리소스를 참고해야할때가 많습니다. 만약 하나의 .tfstate 파일로 관리한다면 간단히 각 리소스를 참조할 수 있지만 레이아웃이 나뉘어져 있으면 output으로 리소스를 외부에서 사용할 수 있도록 정의하고, 참조할때는 data를 사용하여 외부 리소스를 가져올 수 있습니다.

리소스별로 레이아웃을 나누는 이유

클라우드나 Devops를 깊게 공부하신 분들은 한번쯤 “pets vs cattle” 에 들어보신적이 있을 겁니다. 클라우드와 DevOps에서 지향하는 자원관리 방법은 자원을 애완동물 처럼 유니크하게 관리하지말고 소떼 처럼 관리하라는 컨셉을 갖고 있습니다. 소떼에 속한 소들을 고유한 특정 번호를 갖고 있으며 그 번호는 어떤 소에 부여해도 여전히 소떼의 역할을 할 수 있습니다. 쉽게 말해 자원간의 Dependency를 최소화하고 언제든지 자원을 없앴다가 새로 생성할 수 있는 상태를 만들어라 라는것이 핵심입니다.

레이아웃을 나누는 것도 이와 같이 하나의 .tfstate파일로 관리를 하게 될때 유니크한 상태 파일에 문제가 생겼을때 전체의 리소스에 영향을 미칠 수가 있게 됩니다. 그러나 리소스별로 각각의 .tfstate파일로 관리를 하게되면 이와 같은 문제를 최소화할 수 있겠죠. 또한, 소떼 처럼 같은 역할의 리소스를 특정 이름을 부여해서 찍어낼 수도 있겠죠.

리소스별 레이아웃 구조

일반적으로 각 리소스는 아래와 같이 6개의 파일을 사용합니다.

terraform
└──DEV
      └──VPC
          └──backend.hcl
          └──data.tf
          └──main.tf
          └──outputs.tf
          └──vpc.tf
          └──variables.tf
      └──EC2
          └──backend.hcl
          └──data.tf
          └──main.tf
          └──outputs.tf
          └──ec2.tf
          └──variables.tf
      └──ELB
          └──backend.hcl
          └──data.tf
          └──main.tf
          └──outputs.tf
          └──elb.tf
          └──variables.tf
└──PROD
└──QA

외부 레이아웃에서 참조할 수 있도록 outputs 정의하기

만약 vpc폴더에서 생성된 vpc 리소스를 ec2폴더에서 참조하여 사용하려면 vpc폴더의 outputs.tf 파일에서 아래와 같이 output을 정의해주어야 합니다.

output hpg_vpc_id {
    value = module.vpc.vpc_id
}

output public_subnet_id {
    value = module.vpc.public_subnets
}

output private_subnet_id {
    value = module.vpc.private_subnets
}

외부 outputs 을 가져오도록 data를 설정하기

해당 소스코드는 ec2폴더의 data.tf 파일 입니다. vpc폴더의 outputs에서 정의한 자원을 참조할 수 있도록 아래와 같이 data를 정의 합니다.

data "terraform_remote_state" "vpc" {
    backend = "s3"
    config = {
        bucket = var.remote_state_bucket_name
        key = "vpc/terraform.tfstate"
        region = var.region
    }   
}

외부 outputs을 가져와서 data로 정의한 리소스 사용하기

아래 소스코드에 data.terraform_remote_state 부분이 data로 정의한 리소스를 사용하는 방법입니다. subnet_id 를 보면 위에서 정의한 vpc output리소스를 사용하는 부분입니다. data.terraform_remote_state.vpc.outputs.private_subnet_id

module "ec2_was"{
  source                 = "./modules/ec2"
  name                   = "example-ec2"

  instance_count         = 1

  ami                    = data.aws_ami.base_ami.id
  instance_type          = var.ec2_instnace_type

  key_name               = data.terraform_remote_state.keypair.outputs.keypair_ec2
  monitoring             = true
  vpc_security_group_ids = [
                            data.terraform_remote_state.sg.outputs.sg_common_id, 
                            data.terraform_remote_state.sg.outputs.sg_was_id
                           ]
  subnet_id              = data.terraform_remote_state.vpc.outputs.private_subnet_id
..... ommit...

마치며

오늘은 AWS를 리소스별로 레이아웃을 나누는 방법에 대해 소개해드렸습니다. 이처럼 리소스를 소떼처럼 관리하여 운영의 리스크를 줄이시기 바랍니다. 다음 시간에는 리소스를 소떼 처럼 관리 할때 가장 중요한 tags 구성 팁에 대해 이야기 해보도록 하겠습니다. 감사합니다.

반응형