
# Terraform 리소스 종속성
Terraform은 선언형이기 때문에 리소스에 종속성이 있으면 Terraform엔진이 파악을 한 후 순서대로 작업을 진행한다.
암시적 종속성 : 눈으로 보이지 않는다. 예를들어 VCP를 사용하는 EC2 인스턴스를 선언하게 되면, 암시적으로 Terraform 엔진이 알아서 네트워크를 설정하고 그 네트워크를 사용하는 EC2인스턴스를 나중에 생성하게 된다.
명시적 종속성 : 사용자가 명시적으로 선언해 줄 수 있다 . 예를들어 S3 버킷과 EC2인스턴스는 아무 관계가 없다. EC2 인스턴스 내부의 어플리케이션이 특정 S3 버킷에 있는 오브젝트에 접근해서 정보를 가져와야 한다면,암시적 종속성이 아니기 때문에 명시적으로 종속 선언을 해야한다.
기존 구성 파일 수정
provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.34"
}
}
}
provider "aws" {
profile = "dev"
region = "ap-northeast-2"
}
provider 관련설정은 변경 될 일이 거의 없기 때문에 분리한다. 기능 별로 분리하면 가독성이 좋아지고 유지보수 관리가 쉬워진다.
주요 리소스 구성파일 수정
main.tf
resource "aws_instance" "my_instance_a" {
ami = "ami-0fd0765afb77bcca7"
instance_type = "t3.micro"
tags = {
Name = "MyinstanceA"
}
}
resource "aws_instance" "my_instance_b" {
ami = "ami-0fd0765afb77bcca7"
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" {
bucket = "my-bucket-ch"
}
resource "aws_s3_bucket_acl" "my_bucket_acl" {
bucket = aws_s3_bucket.my_bucket.id
acl = "private"
}
인스턴스 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
resource "aws_instance" "my_instance_a" {
ami = "ami-0fd0765afb77bcca7"
instance_type = "t3.micro"
tags = {
Name = "MyinstanceA"
}
}
resource "aws_eip" "my_eip" {
vpc = true
instance = aws_instance.my_instance_a.id
}
명시적 종속성
리소스를 정의 할 때 사용자가 직접 리소스 간에 의존성을 명확하게 정의한다
resource "aws_instance" "my_instance_b" {
ami = "ami-0fd0765afb77bcca7"
instance_type = "t3.micro"
tags = {
Name = "MyinstanceB"
}
depends_on = [aws_s3_bucket.my_bucket]
}
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-bucket-ch"
}
resource "aws_s3_bucket_acl" "my_bucket_acl" {
bucket = aws_s3_bucket.my_bucket.id
acl = "private"
}
formatting , 유효성 검사
terraform fmt
terraform validate
terraform apply
4개의 리소스가 만들어진다.
my_instance_a, my_bucket -> 종속 관계가 없기 때문에 병렬로 같이 만들어 진다.
my_bucket 이 만들어진 후 my_instance_b가 만들어진다.
my_instance_a가 만들어진 후 my_eip가 만들어진다.
리소스삭제
terraform destroy
'Infrastructure as Code > Terraform' 카테고리의 다른 글
| Terraform - 변경, 삭제 (0) | 2024.06.02 |
|---|---|
| Terraform - 생성, 배포 (0) | 2024.06.02 |
| Terraform With Windows (1) | 2024.06.02 |
| Terraform vs Ansible? (1) | 2024.06.02 |
| [T101 Study 7주차] 프로덕션 수준의 테라폼 코드 (0) | 2022.12.11 |