클라우드/테라폼(Terraform)

테라폼 Terraform 리소스 종속성

두뚜 2021. 8. 5. 14:35

# Terraform 리소스 종속성

Terraform은 선언형이기 때문에 리소스에 종속성이 있으면 Terraform엔진이 파악을 한 후 순서대로 작업을 진행한다.

 

# 암시적 종속성 : 눈으로 보이지 않는다. 예를들어 VCP를 사용하는 EC2 인스턴스를 선언하게 되면, 암시적으로 Terraform 엔진이 알아서 네트워크를 설정하고 그 네트워크를 사용하는 EC2인스턴스를 나중에 생성하게 된다.

 

# 명시적 종속성 : 사용자가 명시적으로 선언해 줄 수 있다 . 예를들어 S3 버킷과 EC2인스턴스는 아무 관계가 없다. EC2 인스턴스 내부의 어플리케이션이 특정 S3 버킷에 있는 오브젝트에 접근해서 정보를 가져와야 한다면,암시적 종속성이 아니기 때문에 명시적으로 종속 선언을 해야한다.

 

 

# 기존 구성 파일 수정

provider 관련설정은 변경 될 일이 거의 없기 때문에 분리한다. 기능 별로 분리하면 가독성이 좋아지고 유지보수 관리가 쉬워진다.

 

 

# 주요 리소스 구성파일 수정

인스턴스 2개를 정의하고, my_instance_a 인스턴스에 Elastic IP를 적용하고, my_instance_b 인스턴스에는 S3 버킷을 의존하고 있다.

 

 

# 비 종속성

다른 리소스와 의존성을 가지고 있지 않은 리소스는 다른 리소스와 동시에 만들어 질 수 있다.

my_instance_a 인스턴스는 다른 리소스에 종속되지 않는다.

- aws_instance :  AWS 인스턴스

- ami : 이미지 ID

- instance_type : 인스턴스 타입

 

 

# 암시적 종속성

암시적 종속성은 Terraform이 자동으로 리소스 간에 의존성을 분석해 리소스의 생성, 변경, 삭제 등 순서를 결정한다.

Elastic IP를 할당하기 전에 인스턴스가 생성 되어 있어야 한다  eip를 my_instance_a 에 연결

- aws_eip : Elastic IP (외부 IP)

- vpc : EIP가 VPC에 있는지 여부

- instance : EIP를 할당 할 EC2 인스턴스의 ID

 

 

# 명시적 종속성

리소스를 정의 할 때 사용자가 직접 리소스 간에 의존성을 명확하게 정의한다.

my_instance_b는 my_bucket S3버킷을 의존하고 있다.

depends_on은 모든 리소스에 정의할 수 있는 Terraform만의 메타속성이다.

- aws_instance :  AWS 인스턴스

- ami : 이미지 ID

- instance_type : 인스턴스 타입

- depends_on : 종속적인 리소스 정의

- aws_s3_bucket : S3 버킷

- acl : 버킷의 접근 제어

 

 

# formatting , 유효성 검사

 

# 변경 사항 적용

4개의 리소스가 만들어진다.

my_instance_a, my_bucket -> 종속 관계가 없기 때문에 병렬로 같이 만들어 진다.

my_bucket 이 만들어진 후 my_instance_b가 만들어진다.

my_instance_a가 만들어진 후 my_eip가 만들어진다.

 

 

 

# AWS 콘솔에서 확인

 

 

#  리소스 삭제

역순으로 삭제

 

 

더보기

devops@control:~/aws-example$ vi provider.tf
devops@control:~/aws-example$ cat provider.tf 
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.34"
    }
  }
}

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

 

 

devops@control:~/aws-example$ vi main.tf 
devops@control:~/aws-example$ cat main.tf 
resource "aws_instance" "my_instance_a" {
  ami           = "ami-0b329fb1f17558744"
  instance_type = "t3.micro"

  tags = {
    Name = "MyInstanceA"
  }
}

resource "aws_instance" "my_instance_b" {
  ami           = "ami-0b329fb1f17558744"
  instance_type = "t3.micro"

  tags = {
    Name = "MyInstanceB"
  }


  depends_on = [aws_s3_bucket.my_bucket]

}


resource "aws_eip" "my_eip" {
  vpc      = true
  instance = aws_instance.my_instance_a.id
}

resource "aws_s3_bucket" "my_bucket" {
  acl = "private"
}
devops@control:~/aws-example$ terraform apply

devops@control:~/aws-example$ terraform destroy