Stack 설계하기

Stack 설계하기 (Design a Stack)

Stacks를 사용하면 기존 인프라를 논리적인 컴포넌트로 나눠서, 하나의 응집된 시스템으로 배포·관리하기 더 쉽게 만들 수 있어요. Stack을 설계하는 것은 인프라를 어떻게 구조화할지 계획하고, Stack이 정의하는 리소스를 어떻게 배포할지 생각하는 것에서 시작해요.

출처: 문서

본문

배경 (Background)

모든 Stack은 두 개의 파일을 필요로 해요. 컴포넌트 구성 파일과 배포 구성 파일이요. 컴포넌트 구성 파일은 Stack이 배포할 때 프로비저닝하는 인프라를 정의해요. 배포 구성 파일은 Stack이 정의하는 인프라를 몇 번 배포할지 정의하는 곳이에요.

컴포넌트 구성을 작성하기 전에 새 Stack을 어떻게 사용할지 계획하고 설계하는 것을 권장해요.

  • 기존 인프라를 이해하고 관리 가능한 컴포넌트로 나눠요.
  • Stack이 정의하는 인프라를 어떻게 배포할지 이해해요.
  • Stack의 컴포넌트 구성을 배포 전략과 정렬해요.

유연하고 재사용 가능한 컴포넌트 구성을 만들어 인프라 생명주기를 효율적으로 관리하는 것을 목표로 해요.

인프라 이해하기 (Understand your infrastructure)

컴포넌트 구성을 작성하기 전에 현재 인프라 구성을 평가하고 Stack의 인프라를 어떻게 배포할지 계획하는 것을 권장해요.

인프라 나누기 (Break down your infrastructure)

각 Stack은 공유된 생명주기를 가진 단일 시스템이나 애플리케이션을 나타내야 해요. 현재 인프라를 분석하고 HCP Terraform이 함께 관리해야 하는 컴포넌트를 파악하는 것으로 시작해요. 컴포넌트는 보통 연관된 리소스의 그룹이에요. 예를 들어 애플리케이션의 백엔드, 프런트엔드, 또는 데이터베이스 계층처럼 함께 배포되고 확장되는 것들이에요.

Stack을 기술적 경계를 따라 구성해서 모듈식이고 관리 가능하게 유지하는 것을 권장해요. 예를 들어 VPC, 서브넷, 라우팅 테이블을 위한 네트워킹 인프라 같은 공유 서비스용 전용 Stack을 만들고, 그 공유 서비스를 소비하는 애플리케이션 컴포넌트용으로는 별도의 Stacks를 만들 수 있어요. 이렇게 분리하면 공유 서비스를 독립적으로 관리하면서도 Stacks 간에 정보를 전달할 수 있어요. 자세한 내용은 Stack 간 데이터 전달을 참고하세요.

구성 스케치하기 (Sketch out your configuration)

컴포넌트 구성을 구성할 때는 기술적 경계를 지키는 것을 권장해요. 단일 Stack은 공유된 생명주기를 가진 단일 시스템을 나타내야 해요.

Stack을 가능한 한 독립적(self-contained)으로 유지하는 것이 이상적이지만, Stack이 다른 Stack의 출력을 소비해야 하는 타당한 경우도 있어요. 예를 들어 공유 네트워킹 Stack은 vpc_id나 서브넷 ID 같은 출력을 게시할 수 있고, 다운스트림 애플리케이션 Stacks가 그것을 입력으로 소비할 수 있어요. 이 접근 방식은 모듈성을 보장하고 잘 정의된 인터페이스로 Stacks 간 의존성을 관리할 수 있게 해줘요. 자세한 내용은 Stack 간 데이터 전달을 참고하세요.

Stack에 포함하려는 각 최상위 모듈마다 구성에 컴포넌트 블록을 추가할 계획을 세워요. 최상위 모듈을 확립한 뒤에는 추가 component 블록 없이도 자식 모듈을 사용할 수 있어요.

배포 계획하기 (Plan your deployments)

Stack 배포는 Stack이 정의하는 인프라를 어떻게 반복할지 정의해요. HCP Terraform이 Stack이 정의하는 인프라를 어떻게 배포해야 하는지 고려하는 것을 권장해요. 서로 다른 환경, 클라우드 프로바이더 계정, 또는 리전에 대해 별도의 배포가 필요한지에 따라 계획이 달라질 수 있어요.

배포 프로세스에 자동화가 필요하다면(예: 테스트 배포에서 특정 변경을 자동 승인), 배포 그룹 오케스트레이션 규칙을 작성해 Stack 배포를 관리하는 데 도움을 줄 수 있어요. Stack 배포 plan에 대한 조건 설정에 대해 더 알아보세요.

확장성 계획 (Plan for scalability)

Stack을 설계할 때는 인프라가 커짐에 따라 어떻게 확장되어야 할지 고려해요. 예를 들어 더 많은 환경이나 리전을 추가할 것으로 예상된다면, 그 변화를 수용하도록 Stack을 설계해요.

컴포넌트 구성을 간결하게 유지하려면 locals 블록을 사용해 배포 간에 값을 공유해요. 예를 들어 다음 locals 블록은 여러 배포에서 재사용할 tf_organizationtf_project_name 변수를 정의해요.

# deployments.tfdeploy.hcl
locals {
    tf_organization    = "<ORGANIZATION_NAME>"
    tf_project_name    = "<PROJECT_NAME>"
}

또한 구성에서 for_each 같은 메타 인자를 사용하면 여러 컴포넌트 생성을 간소화해서 구성을 더 유연하고 확장 가능하게 만들 수 있어요. 자세한 내용은 component 블록 문서를 참고하세요.

다음 단계

Stack을 계획한 뒤에는 컴포넌트 구성 정의로 설계를 실제로 구현하는 방법을 배워요.

더 알아보기 (Learn more)