콘텐츠로 이동

Terraform 인프라

Filter this guidePick generator option values to hide sections that don't apply.

Terraform은 인프라를 안전하고 예측 가능하게 생성, 변경 및 개선할 수 있는 오픈 소스 코드형 인프라 소프트웨어 도구입니다.

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

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

Terminal window
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra
어떤 파일이 변경될지 확인하기 위해 드라이 런을 수행할 수도 있습니다
Terminal window
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
매개변수타입기본값설명
name 필수string-프로젝트의 이름입니다.
type application | libraryapplicationterraform lib(재사용 가능한 모듈) 또는 app(배포 가능한 애플리케이션) 여부입니다.
directory stringpackages새 프로젝트의 디렉토리입니다.
subDirectory string-프로젝트가 배치되는 하위 디렉토리입니다. 기본값은 프로젝트 이름입니다.
preferInstallDependencies booleantrue생성기 실행 후 의존성 설치를 선호할지 여부입니다. 여러 생성기를 일괄 처리할 때 설치를 연기하려면 false로 설정하세요 (후속 생성기가 Nx 프로젝트 그래프를 계산할 수 있도록 필요한 경우 설치는 여전히 실행됩니다); 마지막에 한 번 설치합니다.

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

type = application

애플리케이션 프로젝트(--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 부트스트랩 변수 정의
  • 디렉터리scripts nx bootstrapinit 타겟에서 실행되는 Node 헬퍼
    • aws-config.ts AWS SDK 자격 증명 체인을 통해 계정 + 리전 확인
    • bootstrap.ts 부트스트랩 tfstate를 가져오기/푸시하고 terraform apply 실행
    • init.ts S3 백엔드 구성으로 terraform init 실행
  • project.json 프로젝트 구성 및 빌드 타겟
type = library

라이브러리 프로젝트(--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}'"
}
}
# Declare your infrastructure here
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.jsonapply, destroy, init, plan에 새 항목을 추가합니다. 예를 들어, prod 환경을 추가한다고 가정해 봅시다:

# Production environment variables
environment = "prod"
region = "us-west-2"
type = application

원격 상태 부트스트랩 (애플리케이션 프로젝트만 해당)

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

인프라를 배포하기 전에 원격 상태 백엔드를 부트스트랩해야 합니다. 이렇게 하면 Terraform 상태 파일을 저장할 S3 버킷이 생성됩니다:

Terminal window
pnpm nx bootstrap tf-infra

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

공통 타겟 (애플리케이션 및 라이브러리 모두)

섹션 제목: “공통 타겟 (애플리케이션 및 라이브러리 모두)”

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

Terminal window
pnpm nx validate tf-infra

fmt 타겟을 사용하여 Terraform 코드를 포맷합니다:

Terminal window
pnpm nx fmt tf-infra

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

Terminal window
pnpm nx test tf-infra

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

type = application

다음 타겟은 애플리케이션 타입 프로젝트에만 사용할 수 있습니다:

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

Terminal window
pnpm nx plan tf-infra

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

init 타겟을 사용하여 Terraform 작업 디렉터리를 초기화합니다:

Terminal window
pnpm nx run tf-infra:init

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

Terminal window
pnpm nx apply tf-infra

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

Terminal window
pnpm nx output tf-infra

인프라를 해체해야 할 때 destroy 타겟을 사용합니다:

Terminal window
pnpm nx destroy tf-infra

부트스트랩 리소스(상태 저장을 위한 S3 버킷)를 정리하려면:

Terminal window
pnpm nx bootstrap-destroy tf-infra

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