테라폼 Terraform 리소스 종속성
# 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