테라폼 인프라스트럭처
Terraform는 인프라를 안전하게 예측 가능하게 생성, 변경 및 개선할 수 있는 오픈소스 Infrastructure as Code(IaC) 도구입니다.
Terraform 인프라 생성기는 Terraform 인프라 프로젝트를 생성합니다. 생성된 애플리케이션에는 Checkov 보안 검사를 통한 보안 모범 사례가 포함됩니다.
사용 방법
섹션 제목: “사용 방법”Terraform 프로젝트 생성
섹션 제목: “Terraform 프로젝트 생성”새 Terraform 프로젝트를 두 가지 방법으로 생성할 수 있습니다:
- 설치 Nx Console VSCode Plugin 아직 설치하지 않았다면
- VSCode에서 Nx 콘솔 열기
- 클릭
Generate (UI)
"Common Nx Commands" 섹션에서 - 검색
@aws/nx-plugin - terraform#project
- 필수 매개변수 입력
- name: tf-infra
- 클릭
Generate
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra
yarn nx g @aws/nx-plugin:terraform#project --name=tf-infra
npx nx g @aws/nx-plugin:terraform#project --name=tf-infra
bunx nx g @aws/nx-plugin:terraform#project --name=tf-infra
어떤 파일이 변경될지 확인하기 위해 드라이 런을 수행할 수도 있습니다
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
yarn nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
npx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
bunx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
매개변수 | 타입 | 기본값 | 설명 |
---|---|---|---|
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 프로젝트 구성 및 빌드 대상
Terraform 인프라 구현
섹션 제목: “Terraform 인프라 구현”src/main.tf
내부에 Terraform 인프라 작성을 시작할 수 있습니다. 예시:
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"
{ "targets": { "apply": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform apply ../../../dist/packages/infra/terraform/dev.tfplan" }, "prod": { "command": "terraform apply ../../../dist/packages/infra/terraform/prod.tfplan" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" }, "dependsOn": ["plan"] }, "destroy": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform destroy -var-file=env/dev.tfvars" }, "prod": { "command": "terraform destroy -var-file=env/prod.tfvars" } }, "options": { "forwardAllArgs": true, "cwd":"{projectRoot}/src" }, "dependsOn": ["init"] }, "init": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform init -reconfigure -backend-config=\"region=$(aws configure get region)\" -backend-config=\"bucket=$(aws sts get-caller-identity --query Account --output text)-tf-state-$(aws configure get region)\" -backend-config=\"key=dev/terraform.tfstate\"" }, "prod": { "command": "terraform init -reconfigure -backend-config=\"region=$(aws configure get region)\" -backend-config=\"bucket=$(aws sts get-caller-identity --query Account --output text)-tf-state-$(aws configure get region)\" -backend-config=\"key=prod/terraform.tfstate\"" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" } }, "plan": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform plan -var-file=env/dev.tfvars -out=../../../dist/packages/infra/terraform/dev.tfplan" }, "prod": { "command": "terraform plan -var-file=env/dev.tfvars -out=../../../dist/packages/infra/terraform/prod.tfplan" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" }, "dependsOn": ["init"] } }}
원격 상태 부트스트랩 (애플리케이션 프로젝트 전용)
섹션 제목: “원격 상태 부트스트랩 (애플리케이션 프로젝트 전용)”애플리케이션 프로젝트의 경우 인프라를 배포하기 전에 원격 상태 백엔드를 부트스트랩해야 합니다. 이는 Terraform 상태 파일을 저장할 S3 버킷을 생성합니다:
pnpm nx run tf-infra:bootstrap
yarn nx run tf-infra:bootstrap
npx nx run tf-infra:bootstrap
bunx nx run tf-infra:bootstrap
사용 가능한 대상
섹션 제목: “사용 가능한 대상”사용 가능한 대상은 프로젝트 유형에 따라 다릅니다:
공통 대상 (애플리케이션 및 라이브러리)
섹션 제목: “공통 대상 (애플리케이션 및 라이브러리)”인프라 검증
섹션 제목: “인프라 검증”validate
대상을 사용하여 Terraform 구성을 검증할 수 있습니다:
pnpm nx run tf-infra:validate
yarn nx run tf-infra:validate
npx nx run tf-infra:validate
bunx nx run tf-infra:validate
코드 포맷팅
섹션 제목: “코드 포맷팅”fmt
대상을 사용하여 Terraform 코드를 포맷팅합니다:
pnpm nx run tf-infra:fmt
yarn nx run tf-infra:fmt
npx nx run tf-infra:fmt
bunx nx run tf-infra:fmt
보안 테스트
섹션 제목: “보안 테스트”test
대상을 사용하여 Checkov로 인프라 보안 검사를 실행합니다:
pnpm nx run tf-infra:test
yarn nx run tf-infra:test
npx nx run tf-infra:test
bunx nx run tf-infra:test
보안 테스트 결과는 루트 dist
폴더의 dist/packages/<my-terraform-project>/checkov
에서 확인할 수 있습니다.
애플리케이션 전용 대상
섹션 제목: “애플리케이션 전용 대상”다음 대상은 애플리케이션 유형 프로젝트에서만 사용 가능합니다:
인프라 계획 수립
섹션 제목: “인프라 계획 수립”변경 사항 적용 전 plan
대상을 실행하여 Terraform이 수행할 작업을 확인할 수 있습니다:
pnpm nx run tf-infra:plan
yarn nx run tf-infra:plan
npx nx run tf-infra:plan
bunx nx run tf-infra:plan
이렇게 하면 dist/packages/<my-terraform-project>/terraform/dev.tfplan
에 계획 파일이 생성됩니다.
Terraform 초기화
섹션 제목: “Terraform 초기화”init
대상을 사용하여 Terraform 작업 디렉토리를 초기화합니다:
pnpm nx run tf-infra:init
yarn nx run tf-infra:init
npx nx run tf-infra:init
bunx nx run tf-infra:init
AWS에 배포
섹션 제목: “AWS에 배포”계획 수립 후 apply
대상을 사용하여 인프라를 AWS에 배포할 수 있습니다:
pnpm nx run tf-infra:apply
yarn nx run tf-infra:apply
npx nx run tf-infra:apply
bunx nx run tf-infra:apply
출력 값 확인
섹션 제목: “출력 값 확인”Terraform 구성에서 출력 값을 검색합니다:
pnpm nx run tf-infra:output
yarn nx run tf-infra:output
npx nx run tf-infra:output
bunx nx run tf-infra:output
인프라 삭제
섹션 제목: “인프라 삭제”인프라를 철거해야 할 때 destroy
대상을 사용합니다:
pnpm nx run tf-infra:destroy
yarn nx run tf-infra:destroy
npx nx run tf-infra:destroy
bunx nx run tf-infra:destroy
부트스트랩 리소스 삭제
섹션 제목: “부트스트랩 리소스 삭제”부트스트랩 리소스(상태 저장용 S3 버킷)를 정리합니다:
pnpm nx run tf-infra:bootstrap-destroy
yarn nx run tf-infra:bootstrap-destroy
npx nx run tf-infra:bootstrap-destroy
bunx nx run tf-infra:bootstrap-destroy
추가 정보
섹션 제목: “추가 정보”Terraform에 대한 자세한 내용은 Terraform 문서 및 AWS 프로바이더 문서를 참조하세요.