흰 스타렉스에서 내가 내리지

테라폼에서 *.tf 파일 설명 본문

DevOps

테라폼에서 *.tf 파일 설명

주씨. 2024. 8. 1. 22:42
728x90

나는 s3.tf 파일을 생성했고, 그 안에 들어있는 내용은 아래와 같다. 

resource "aws_s3_bucket" "test" {
  bucket = "terraform-cli-test-0123"
}

 

왜 첫줄에 이름이 두개이고, 왜 이러한 구조를 가지는 지 궁금했다. 

 


# 리소스 정의

resource "aws_s3_bucket" "test" {
  bucket = "terraform-cli-test-0123"
}
  • 1. resource "aws_s3_bucket" "test" 
    • 이 줄은 Terraform 에게 aws s3 버킷 리소스를 생성하라고 지시한다. 
    • "aws_s3_bucket" 는 리소스 타입을 지정하고, "test" 는 이 리소스의 로컬 이름이다. 
  • 2. bucket = "terraform-cli-test-0123"
    • 이 줄은 생성할 s3 버킷의 이름을 지정한다. 

 

# 이 코드가 수행하는 일 

  1. S3 버킷 생성
    • 이 코드를 실행하면 aws에서 이름이 'terraform-cli-test-0123' 인 새로운 s3 버킷이 생성된다. 
  2. 상태 파일 업데이트
    • Terraform 은 이 리소스를 추적하기 위해 상태 파일에 이 버킷의 정보를 기록한다. 
    • 이를 통해 다음에 'terraform apply' 를 실행할 때, 이 버킷이 이미 존재함을 인식하고 중복 생성을 방지한다. 

 

# Terrform 사용 예시 

1. 초기화: Terrafrom 프로젝트 디렉토리에서 다음 명령어를 실행하여 필요한 플러그인과 모듈을 다운로드한다. 

terraform init

 

2. 플랜 생성 : Terraform 이 어떤 작업을 수행할지 미리 본다. 

terraform plan

 

3. 적용 : 실제로 인프라 리소스를 생성한다. 

terraform apply

 

 


이 때, s3.tf 에서 "test" 의 역할이 무엇인가? 

즉, `리소스의 로컬 이름` 이라는 것은 무엇이고 어떤 역할을 하는가?

 

 

Terraform 에서 리소스의 로컬 이름은 리소스를 참조하고 관리하는 데 중요한 역할을 한다

 

# 로컬 이름의 역할

1. 고유 식별자 역할

  • Terraform 은 같은 리소스 유형의 여러 인스턴스를 정의할 수 있다. 로컬 이름은 각 리소스를 구분하기 위한 고유 식별자로 사용된다. 
  • 예를 들어, 동일한 파일에서 2개의 s3 버킷을 정의할 수 있다. 로컬 이름을 통해 각 버킷을 식별할 수 있다. 
resource "aws_s3_bucket" "test1" {
  bucket = "terraform-cli-test-0123"
}

resource "aws_s3_bucket" "test2" {
  bucket = "terraform-cli-test-0456"
}

 

 

2. 참조 

  • 다른 리소스나 모듈에서 이 리소스를 참조할 때 로컬 이름을 사용한다. 로컬 이름을 통해 해당 리소스의 속성에 접근할 수 있다. 
  • 예를 들어, 생성된 S3 버킷의 이름을 다른 리소스에서 참조할 수 있다. 
resource "aws_s3_bucket_object" "test_object" {
  bucket = aws_s3_bucket.test.bucket
  key    = "exampleobject"
  content = "This is an example object"
}

 

위 코드는 버킷 내에 `객체` 를 생성해주는 tf 파일 내용이다. 

 

 

3. 상태 파일 관리 

  • Terraform 은 상태 파일을 통해 리소스를 추적한다. 로컬 이름을 사용하여 상태 파일 내에서 특정 리소스를 추적하고 관리한다. 
  • 이는 `terraform apply` 명령을 실행할 때 Terraform 이 어떤 리소스가 이미 존재하는지, 어떤 리소스를 새로 만들어야 하는지, 어떤 리소스를 업데이트 해야 하는지를 결정하는 데 도움을 준다. 

 

실제로 terraform state list 명령어를 실행했을 때, 로컬 이름으로 state 가 저장된 것을 볼 수 있다. 

 

 

4. 모듈 간 충돌 방지 

  • 여러 모듈을 사용하는 경우 각 모듈 내에서 같은 리소스 타입을 사용하더라도 로컬 이름을 다르게 지정하여 충돌을 방지할 수 있다.
  • 예를 들어, 두 모듈 내에서 각각 `aws_s3_bucket` 리소스를 정의하지만, 각 모듈 내에서 로컬 이름이 다르기 때문에 충돌이 발생하지 않는다. 

 

# 예시 코드 

resource "aws_s3_bucket_object" "test_object" {
  bucket = aws_s3_bucket.test.bucket  # "test" 로컬 이름을 사용하여 S3 버킷 참조
  key    = "exampleobject"
  content = "This is an example object"
}

 

  • `aws_s3_bucket.test.bucket`
    • 로컬 이름 `test` 를 사용하여 `aws_s3_bucket` 리소스의 `bucket` 속성에 접근한다. 
    • 이렇게 하면 `aws_s3_bucket_object` 리소스가 올바른 s3 버킷에 객체를 추가할 수 있다. 

 

 

# 결론

로컬 이름은 Terraform 구성에서 리소스를 식별하고 참조하며, 상태 파일을 관리하는 데 중요한 역할을 한다.