리소스 구성
리소스 구성 (Configure a resource)
리소스는 가상 네트워크, 컴퓨트 인스턴스, DNS 레코드 같은 상위 수준 컴포넌트를 포함해 Terraform으로 생성하고 관리하려는 모든 인프라 오브젝트예요. Terraform에서 리소스를 만들려면 Terraform 구성에 resource 블록을 추가하고 필요한 인자를 지정해요. 이 페이지에서는 resource 블록을 사용해 리소스를 생성하고 관리하는 방법을 다룰게요.
출처: 문서
본문
리소스는 가상 네트워크, 컴퓨트 인스턴스, DNS 레코드 같은 상위 수준 컴포넌트를 포함해 Terraform으로 생성하고 관리하려는 모든 인프라 오브젝트예요. Terraform에서 리소스를 만들려면 Terraform 구성에 resource 블록을 추가하고 필요한 인자를 지정해요.
이 주제는 resource 블록을 사용해 리소스를 생성하고 관리하는 방법에 대한 정보를 제공해요. 인프라를 프로비저닝하는 개요는 핵심 Terraform 워크플로를 참고해요. resource 블록 구성에 대한 자세한 내용은 프로바이더 문서와 resource 블록 참조를 참고해요. resource 블록 참조는 Terraform이 리소스를 생성하고 수명 주기를 관리하는 방법을 구성하는 데 사용할 수 있는 원시 Terraform 메타-인자를 설명해요.
실습: Terraform: 시작하기 튜토리얼을 따라 해 보세요.
개요 (Overview)
리소스를 구성하려면 다음 단계를 완료해요:
resource블록을 선언하고 그 타입과 이름을 지정해요.- 프로바이더 인자를 구성해요. 리소스 구성의 대부분의 인자는 프로바이더에 특정해요.
- Terraform 메타-인자를 구성해요. 메타-인자는 Terraform 구성 언어에 내장된 인자로, Terraform이 리소스를 어떻게 생성하고 관리할지를 제어해요.
전제 조건 (Prerequisites)
프로바이더를 선택하고 구성해요. 프로바이더는 프로비저닝할 수 있는 리소스 타입의 모음을 제공하는 Terraform용 플러그인이에요. 자세한 내용은 프로바이더를 참고해요.
대부분의 프로바이더는 원격 API에 접근하려면 인증 설정, 버전 요구 사항, 기타 인자가 필요해요. Terraform은 프로바이더 구성을 루트 모듈에서 기대해요. 자세한 내용은 provider 블록 참조를 참고해요.
리소스를 관리하려면 Terraform 모듈이 필요한 프로바이더를 지정해야 해요. 자세한 내용은 프로바이더 요구 사항을 참고해요.
리소스 선언 (Declare a resource)
구성에 resource 블록을 추가하고 타입을 선언하며 이름을 지정해요. 타입은 resource 블록이 관리하는 인프라 오브젝트의 종류와 리소스가 지원하는 인자를 결정해요. 대부분의 리소스 타입은 프로바이더가 구현하지만, Terraform에는 특수 사용 사례를 위한 리소스를 만드는 데 쓸 수 있는 원시 리소스 타입인 terraform_data가 포함돼 있어요.
또한 리소스의 로컬 이름을 지정해야 해요. Terraform은 리소스 타입과 이름을 워크스페이스의 상태 파일에서 리소스의 주소로 사용해요.
다음 예시는 web이라는 aws_instance 리소스를 정의해요:
resource "aws_instance" "web" {
#...
}
구성을 적용한 후 상태 파일에서 이 리소스의 주소는 aws_instance.web이에요.
프로바이더 특정 인자 구성 (Configure provider-specific arguments)
resource 블록 본문 안의 인자 대부분은 프로바이더 개발자가 정의한 대로 선택된 리소스 타입에 특정해요. 구성 인자에서 resource 블록의 인자에 값을 할당해 리소스를 구성해요. 리소스 타입의 문서는 어떤 인자가 필수이고 값을 어떻게 형식화하는지 나열해요. 자세한 내용은 프로바이더 문서를 참고해요.
다음 예시에서 ami와 instance_type 인자는 aws 프로바이더에 특정해요:
resource "aws_instance" "web" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}
값을 하드코딩하는 것 외에도 Terraform 식과 기타 동적 Terraform 언어 기능을 사용해 리소스 인자 값을 구성할 수 있어요.
Terraform 프로바이더는 자체 문서를 작성하고 유지 관리해요. 공개적으로 사용 가능한 모든 프로바이더 문서는 공개 Terraform 레지스트리를 참고해요.
작업 시간 초과 정의 (Define operation timeouts)
어떤 리소스 타입은 timeouts 인자를 지원해 특정 작업이 완료될 때까지 Terraform이 기다리는 시간을 사용자 지정할 수 있게 해 줘요. 시간 초과 오류로 종료되기 전까지요. 각 리소스 타입이 구성 작업 집합을 결정하고 시간 초과를 다르게 처리해요. 리소스가 timeout 인자를 지원하는지 확인하려면 프로바이더 문서를 참고해요.
timeouts 인자를 지원하는 리소스 타입은 다음 관례를 따릅니다:
- 리소스는
timeouts라는 자식 블록을 지원해요. - 자식 블록은 구성 가능한 시간 초과 값을 가진 각 작업에 대응하는 중첩 인자들을 포함해요.
- 각 인자는
"60m"(60분),"10s"(10초),"2h"(2시간) 같은 기간의 문자열 표현을 받아요.
다음 예시는 example AWS 데이터베이스 인스턴스를 생성하고 삭제할 때 Terraform이 시간 초과되기 전까지 실행되는 시간을 구성해요:
resource "aws_db_instance" "example" {
# ...
timeouts {
create = "60m"
delete = "2h"
}
}
Terraform 메타-인자 구성 (Configure Terraform meta-arguments)
Terraform 언어에는 모든 리소스 타입에서 사용할 수 있는 메타-인자라고 하는 내장 인자도 포함돼 있어요. 메타-인자는 리소스의 동작을 구성하는 대신 Terraform이 리소스를 어떻게 생성하고 관리하는지를 구성해요.
다음 예시는 resource 블록에서 메타-인자를 사용할 수 있는 몇 가지 일반적인 방법을 설명해요.
사용자 지정 조건 (Custom conditions)
precondition과 postcondition 블록을 추가해 리소스가 어떻게 동작하는지에 대한 가정과 보장을 지정해요. 이 블록들은 흔한 잘못된 구성을 피하는 데 도움을 주고 미래의 유지 관리자가 구성 설계와 의도를 이해하도록 도와줘요. 또한 오류에 대한 유용한 정보를 더 일찍 그리고 맥락에 맞게 반환해 소비자가 구성의 문제를 진단할 수 있게 해 줘요. 사용자 지정 조건 검사를 만드는 방법은 구성 검증을 참고해요.
예시 구성은 사용자 지정 조건 적용을 참고해요.
프로바이더 구성 별칭 정의 (Define provider configuration aliases)
Terraform은 리소스 타입의 이름을 사용해 사용할 프로바이더를 결정해요. 관례에 따라 리소스 타입 이름은 프로바이더의 선호 로컬 이름으로 시작해요. 구성에 여러 프로바이더 구성을 선언하고 각 리소스가 다른 구성을 사용하도록 구성할 수 있어요. 여러 프로바이더 구성을 사용할 때는 the provider 메타-인자를 사용해 프로바이더 구성을 수동으로 선택해요.
예시 구성은 대체 프로바이더 구성 선택을 참고해요.
리소스 의존성 지정 (Specify resource dependencies)
대부분의 경우 Terraform은 가능하면 리소스를 의존성 순서로 그리고 병렬로 자동으로 업데이트해요. Terraform은 resource 블록 안의 식을 분석해 다른 객체에 대한 참조를 찾고, 리소스를 생성·업데이트·파괴할 때 그 참조를 암시적 의존성으로 취급해요.
리소스가 다른 리소스에 의존할 때 그 구성은 종종 의존하는 리소스에서 가져온 정보를 포함해요. 그래서 보통 리소스 사이에 의존성을 수동으로 지정할 필요가 없어요.
Terraform이 두 리소스 사이의 의존성을 암시적으로 결정할 수 없다면, Terraform이 변경을 적용하는 순서를 제어하기 위해 명시적 의존성을 지정해야 할 수도 있어요. 예를 들어 Terraform이 접근 제어 정책을 관리하고 그 정책이 먼저 생성되어야 하는 작업을 수행해야 할 때, 접근 정책과 그 생성이 정책에 의존하는 리소스 사이에 숨겨진 의존성이 있어요.
Terraform이 리소스를 생성할 때 따르는 순서를 제어하려면 다음 방법을 사용할 수 있어요:
resource블록에depends_on메타-인자를 추가하고 Terraform이 먼저 생성해야 하는 업스트림 리소스를 참조해요. 예시 구성은 의존성 지정을 참고해요.resource블록에replace_triggered_bylifecycle 규칙을 추가해요. 이 인자는 참조된 리소스나 리소스 속성에 변경이 있을 때 부모 리소스를 대체하도록 Terraform을 강제해 독립적인 리소스 사이에 의존성을 추가해요. 예시 구성은 리소스를 대체하는 트리거 지정을 참고해요.
내장 리소스 구성 (Configure built-in resources)
실제 인프라에 영향을 주지 않고 작업을 프로그래밍하는 데 도움이 되는 특수 리소스 타입을 선언할 수 있어요.
terraform_data 리소스
terraform_data 리소스 타입은 표준 리소스 수명 주기를 구현하지만 다른 직접적인 작업은 하지 않아요. 자세한 내용은 terraform_data 리소스 참조를 참고해요.
로컬 전용 리소스 (Local-only resources)
Terraform 안에서 값을 계산하고 향후 사용을 위해 상태에 저장하는 리소스를 만들 수 있어요. 로컬 전용 리소스는 다른 리소스와 마찬가지로 구성할 수 있지만, 그 결과 데이터는 Terraform 상태 안에만 존재해요.
로컬 전용 리소스를 파괴하면 상태에서 제거되고 그 데이터는 버려져요. 클라우드 프로바이더에서 삭제할 대응하는 실제 인프라는 없어요.
로컬 전용 리소스는 내장 terraform.io/builtin/terraform 프로바이더를 사용하며, 다른 프로바이더 문서와 함께 공개 Terraform 레지스트리에 문서화돼 있어요.
로컬 전용 리소스 타입의 예시는 다음을 참고해요:
tls_private_key: TLS 연결을 위한 개인 키를 생성하는 리소스예요.tls_self_signed_cert: 자체 서명 TLS 인증서를 발급해요.random_id: 무작위 ID를 생성해요.
다음 단계 (Next steps)
- 새 Terraform 프로젝트이거나 프로바이더나 모듈 구성을 변경하는 경우 Terraform CLI를 사용해 구성을 초기화해요.
- Terraform CLI를 사용해 구성을 적용해요.
- 구성에 값을 하드코딩했다면 동적 언어 기능을 사용해 모듈을 구성 가능하게 만들 수 있어요.
- 구성을 재사용 가능한 모듈로 리팩터링하려면 모듈 만들기 지침을 참고해요.
- 더 이상 리소스가 필요 없으면 상태에서 리소스 제거 또는 리소스 파괴 방법을 알아보세요.