Stack에서 컴포넌트와 리소스 관리하기
Stack에서 컴포넌트와 리소스 관리하기 (Manage components and resources in Stacks)
Stacks는 컴포넌트로 구성되며, 각 컴포넌트는 소스로 테라폼 모듈을 포함해요. Stack에 컴포넌트를 추가하고 제거하는 방법과, 각 컴포넌트가 소싱하는 모듈 안의 리소스를 관리하는 방법을 알아봐요.
출처: 문서
본문
컴포넌트 추가하기 (Add components)
component 블록은 Stack을 구성하는 조각들을 정의해요. Stack에 포함하려는 각 최상위 모듈마다 component 블록을 추가해요. component 블록을 정의할 때는 그 컴포넌트가 구성 소스를 가져오는 모듈, 모듈이 필요로 하는 입력 변수들, 그리고 프로바이더 구성을 지정해요.
component에 대해 더 알아보려면 component 블록 레퍼런스를 참고하세요.
컴포넌트 제거하기 (Remove components)
테라폼은 구성에서 Stack 컴포넌트를 체계적으로 제거해요. 테라폼이 컴포넌트를 성공적으로 제거하려면 컴포넌트의 프로바이더가 사용 가능해야 해요. 그 프로바이더를 필요로 하는 컴포넌트를 먼저 제거하지 않고서는 컴포넌트 구성에서 프로바이더를 제거하지 마세요.
Stack에서 컴포넌트를 제거하려면 다음 단계를 따라요.
- 구성 갱신:
- 제거하려는 컴포넌트의
component블록을 삭제해요. - 컴포넌트, 컴포넌트 소스 모듈, 컴포넌트의 프로바이더 구성을 지정하는
removed블록을 추가해요. 테라폼이 연관된 모든 리소스를 제대로 파괴할 수 있도록 컴포넌트의 모든 세부 사항을 지정해요.
- 제거하려는 컴포넌트의
- 구성 변경 사항을 HCP Terraform에 push하고 변경 사항을 Stack에 적용해요.
다음 구성은 제거하려는 예시 database 컴포넌트예요.
# component.tfcomponent.hcl
component "database" {
source = "./modules/database"
inputs = {
instance_class = "db.t3.micro"
}
providers = {
aws = provider.aws.main
}
}
database 컴포넌트를 제거하려면 제거할 컴포넌트, 컴포넌트가 소싱하는 모듈, 컴포넌트가 사용하는 프로바이더를 지정하는 대응하는 removed 블록을 추가해요.
removed {
source = "./modules/database"
from = component.database
providers = {
aws = provider.aws.main
}
}
HCP Terraform에서 구성을 적용하면 테라폼은 database 컴포넌트와 그 리소스를 연관된 Stack 배포에서 제거해요. 그런 다음 컴포넌트 구성 파일에서 removed 블록을 삭제할 수 있어요.
여러 컴포넌트 제거하기 (Remove multiple components)
component 블록이 for_each 메타 인자로 여러 컴포넌트를 정의한다면, removed 블록에서 for_each 메타 인자를 사용해 테라폼이 여러 컴포넌트 인스턴스를 파괴하게 할 수 있어요. removed 블록에서 for_each를 사용하면 컴포넌트의 모든 인스턴스 또는 그 중 일부를 제거할 수 있어요.
컴포넌트의 모든 인스턴스를 제거하려면 component 블록에서 사용하는 것과 동일한 for_each 표현식을 removed 블록에 복제해요. 예를 들어 env 컴포넌트의 모든 인스턴스를 제거하려면:
component "env" {
for_each = ["dev", "staging"]
source = "../local-component"
providers = {
#...
}
#...
}
env 컴포넌트 블록을 제거하고 동일한 for_each 표현식을 사용하는 removed 블록을 추가해요.
removed {
for_each = ["dev", "staging"]
from = component.env[each.key]
providers = {
#...
}
}
HCP Terraform에서 구성을 적용하면 테라폼은 env 컴포넌트의 모든 인스턴스와 그 리소스를 연관된 Stack 배포에서 제거해요. 그런 다음 컴포넌트 구성 파일에서 removed 블록을 삭제할 수 있어요.
컴포넌트 인스턴스의 부분집합을 제거하려면 유지하려는 인스턴스를 정의하는 component 블록을 계속 두어야 해요. 다음 예제에서 removed 블록은 local.deprecated_components를 순회하며 staging 컴포넌트와 대응 리소스들을 제거해요.
locals {
components = ["dev", "prod"]
deprecated_components = ["staging"]
}
component "env" {
for_each = toset(local.components)
source = "../local-component"
providers = {
#...
}
#...
}
removed {
for_each = toset(local.deprecated_components)
from = component.env[each.key]
providers = {
#...
}
}
HCP Terraform에서 구성을 적용하면 테라폼은 staging 컴포넌트를 제거하지만 dev와 prod 컴포넌트는 Stack에 남아 있어요. local.components 리스트에서 컴포넌트를 제거하고 local.removed_components 리스트에 추가해서 더 많은 컴포넌트를 삭제할 수도 있어요.
리소스 관리하기 (Manage resources)
Stack 컴포넌트는 모듈에서 구성을 소싱해요. 모듈은 .tf로 끝나는 전통적인 테라폼 구성 파일을 사용해요. 컴포넌트의 개별 리소스와 상호작용하려면 컴포넌트가 구성을 소싱하는 모듈을 갱신해야 해요. 자세한 내용은 모듈 만들기(Creating Modules)를 참고하세요.
리소스 가져오기 (Import a resource)
리소스를 모듈로 가져오면 테라폼이 그것을 Stacks 컴포넌트로 전달해요. 리소스를 모듈로 가져오는 것 외에도, 배포 구성에서도 선언해야 해요. 구성을 다시 적용하면 테라폼이 Stack 배포 전반에 걸쳐 리소스의 인스턴스를 프로비저닝해요.
tfdeploy.hcl구성 파일의 각deployment블록에서 리소스를inputs인자 맵에 추가해요. 다음 예제는dev와prod배포 환경에 대해bucket_name이라는 입력을 선언해요.
deployment "dev" {
inputs = {
..
bucket_name = "<name-for-dev>"
..
}
}
deployment "prod" {
inputs = {
..
bucket_name = "<name-for-prod>"
..
}
}
- 테라폼이 컴포넌트로 전달하는
tfcomponent.hcl구성 파일에 입력 변수를 추가해요. 입력 변수 정의 방법은 입력 변수로 모듈 인자 추가하기를 참고하세요. 다음 예제는bucket_name변수를 선언해요.
variable "bucket_name" {
type = string
}
tfcomponent.hcl구성 파일에서 이전 단계에서 선언한 입력 변수에 대한 참조를 추가해요. 리소스를 가져오려는 모듈의component블록에서 그 변수를 참조해요. 다음 예제는./components/microservices모듈의 리소스를 관리하는 컴포넌트에 대해bucket_name변수를 참조해요.
component "instance" {
source = "./components/microservice"
inputs = {
bucket_name = var.bucket_name
# other inputs
}
}
- 대상 모듈에서 가져올 리소스와 대상 주소를 지정하는
import구성을 추가해요. 이 구성은 모듈의 루트 구성 파일에 추가할 수 있지만, import를 체계적으로 정리하기 위해import.tf파일을 만드는 것을 권장해요. 자세한 내용은import블록 레퍼런스 페이지를 참고하세요.
다음 예제는 component "instance" 블록이 소비하는 ./components/microservice 모듈로 S3 버킷을 가져와요.
# ./components/microservices/import.tf
variable "bucket_name" {}
resource "aws_s3_bucket" "example" {
bucket = var.bucket_name
}
import {
to = aws_s3_bucket.example
id = var.bucket_name
}
- HCP Terraform이나 Terraform Enterprise에서 새 실행을 시작해서 새로 가져온 리소스로 인프라를 재배포해요.
각 환경의 bucket_name 입력을 바꿔서 동일한 컴포넌트를 재사용해 배포별로 다른 S3 버킷을 가져올 수 있어요.
모듈에서 리소스 제거하기 (Remove a resource from your module)
소스 모듈에서 리소스 구성을 삭제하면 테라폼 관리에서 제거되고 실제 인프라도 폐기(decommission)돼요. 대안으로 소스 모듈 구성에 removed 블록을 추가해서 실제 인프라 객체를 폐기하지 않고 테라폼 관리에서 리소스를 제거할 수도 있어요. 자세한 내용은 리소스 파괴하기를 참고하세요.
리소스 주소 변경하기 (Change a resource address)
소스 모듈 구성에 moved 블록을 추가해서 리소스를 한 모듈에서 다른 모듈로 이동할 수 있어요. 자세한 내용은 리소스 이동을 참고하세요.