콘텐츠로 이동

테라폼 인프라스트럭처

Terraform는 인프라를 안전하게 예측 가능하게 생성, 변경 및 개선할 수 있는 오픈소스 Infrastructure as Code(IaC) 도구입니다.

Terraform 인프라 생성기는 Terraform 인프라 프로젝트를 생성합니다. 생성된 애플리케이션에는 Checkov 보안 검사를 통한 보안 모범 사례가 포함됩니다.

새 Terraform 프로젝트를 두 가지 방법으로 생성할 수 있습니다:

  1. 설치 Nx Console VSCode Plugin 아직 설치하지 않았다면
  2. VSCode에서 Nx 콘솔 열기
  3. 클릭 Generate (UI) "Common Nx Commands" 섹션에서
  4. 검색 @aws/nx-plugin - terraform#project
  5. 필수 매개변수 입력
    • name: tf-infra
  6. 클릭 Generate
매개변수 타입 기본값 설명
name 필수 string - The name of the project.
type string application Whether this is a terraform lib (re-usable modules) or app (deployable).
directory string packages The directory of the new project.

생성기는 프로젝트 유형에 따라 다른 파일 구조를 생성합니다:

애플리케이션 프로젝트(--type=application)의 경우 생성기는 원격 상태 관리를 포함한 완전한 Terraform 애플리케이션을 생성합니다:

  • 디렉터리src
    • main.tf 메인 Terraform 구성 파일
    • providers.tf S3 백엔드가 있는 프로바이더 구성
    • variables.tf 입력 변수 정의
    • outputs.tf 출력 값 정의
    • 디렉터리env 환경별 변수 파일
      • dev.tfvars 개발 환경 변수
  • 디렉터리bootstrap 원격 상태를 위한 부트스트랩 구성
    • main.tf 상태 저장을 위한 S3 버킷 및 정책
    • providers.tf AWS 프로바이더 구성
    • variables.tf 부트스트랩 변수 정의
  • project.json 프로젝트 구성 및 빌드 대상

라이브러리 프로젝트(--type=library)의 경우 생성기는 재사용 가능한 Terraform 모듈을 위한 간단한 구조를 생성합니다:

  • 디렉터리src
    • main.tf 메인 Terraform 모듈 파일
  • project.json 프로젝트 구성 및 빌드 대상

src/main.tf 내부에 Terraform 인프라 작성을 시작할 수 있습니다. 예시:

src/main.tf
locals {
account_id = data.aws_caller_identity.current.account_id
aws_region = data.aws_region.current.id
}
resource "null_resource" "print_info" {
# triggers = {
# always_run = timestamp()
# }
provisioner "local-exec" {
command = "echo 'AWS Region: ${local.aws_region}, AWS Account: ${local.account_id}, Environment: ${var.environment}'"
}
}
# 인프라를 여기에 선언
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-unique-bucket-name"
}

별도의 프로젝트(lib)에서 모듈을 실행하려면 다음과 같이 할 수 있습니다:

module "lib_module" {
source = "../../path/to/my-lib/src"
}

이렇게 하면 Nx 그래프가 자동으로 업데이트되어 소비 애플리케이션과 라이브러리 간의 종속성이 추가됩니다.

환경별 변수는 src/env/*.tfvars 파일에서 구성합니다.

새 환경을 추가하려면 환경별 변수가 포함된 새 src/env/<environment>.tfvars 파일을 생성하고 project.json에 새 env 구성에 대한 apply, destroy, init, plan 항목을 추가합니다. 예를 들어 prod 환경을 추가한다고 가정해 보겠습니다:

# 프로덕션 환경 변수
environment = "prod"
region = "us-west-2"

원격 상태 부트스트랩 (애플리케이션 프로젝트 전용)

섹션 제목: “원격 상태 부트스트랩 (애플리케이션 프로젝트 전용)”

애플리케이션 프로젝트의 경우 인프라를 배포하기 전에 원격 상태 백엔드를 부트스트랩해야 합니다. 이는 Terraform 상태 파일을 저장할 S3 버킷을 생성합니다:

Terminal window
pnpm nx run tf-infra:bootstrap

사용 가능한 대상은 프로젝트 유형에 따라 다릅니다:

공통 대상 (애플리케이션 및 라이브러리)

섹션 제목: “공통 대상 (애플리케이션 및 라이브러리)”

validate 대상을 사용하여 Terraform 구성을 검증할 수 있습니다:

Terminal window
pnpm nx run tf-infra:validate

fmt 대상을 사용하여 Terraform 코드를 포맷팅합니다:

Terminal window
pnpm nx run tf-infra:fmt

test 대상을 사용하여 Checkov로 인프라 보안 검사를 실행합니다:

Terminal window
pnpm nx run tf-infra:test

보안 테스트 결과는 루트 dist 폴더의 dist/packages/<my-terraform-project>/checkov에서 확인할 수 있습니다.

다음 대상은 애플리케이션 유형 프로젝트에서만 사용 가능합니다:

변경 사항 적용 전 plan 대상을 실행하여 Terraform이 수행할 작업을 확인할 수 있습니다:

Terminal window
pnpm nx run tf-infra:plan

이렇게 하면 dist/packages/<my-terraform-project>/terraform/dev.tfplan에 계획 파일이 생성됩니다.

init 대상을 사용하여 Terraform 작업 디렉토리를 초기화합니다:

Terminal window
pnpm nx run tf-infra:init

계획 수립 후 apply 대상을 사용하여 인프라를 AWS에 배포할 수 있습니다:

Terminal window
pnpm nx run tf-infra:apply

Terraform 구성에서 출력 값을 검색합니다:

Terminal window
pnpm nx run tf-infra:output

인프라를 철거해야 할 때 destroy 대상을 사용합니다:

Terminal window
pnpm nx run tf-infra:destroy

부트스트랩 리소스(상태 저장용 S3 버킷)를 정리합니다:

Terminal window
pnpm nx run tf-infra:bootstrap-destroy

Terraform에 대한 자세한 내용은 Terraform 문서AWS 프로바이더 문서를 참조하세요.