ci FOSSA Status
<sub >Terratag은 다음 주최사로부터 제공합니다 ❤️ by
<img src="https://raw.githubusercontent.com/env0/terratag/HEAD/logo.svg" width="150">
팀이 AWS, Azure 및 Google 환경에서 자체적으로 환경을 관리할 수 있도록 합니다. <br/>
정책에 의해 관리되며 완벽한 가시성과 비용 관리를 제공합니다.
무엇인가요?(What?)
Terratag은 전체 OpenTofu/Terraform 파일 세트에 걸쳐 태그(tags) 또는 레이블(labels)을 적용할 수 있게 해주는 CLI 도구입니다. Terratag은 AWS, GCP 및 Azure의 모든 리소스에 태그나 레이블을 적용합니다.
Terratag 사용 예시
왜 필요한가요?(Why?)
애플리케이션 전반에 걸쳐 태그를 유지 관리하는 것은 특히 수동으로 할 경우 어렵습니다. Terratag은 기존의 IaC(Infrastructure as Code)에 쉽게 태그를 추가하고, OpenTofu/Terraform을 작성하기 시작했을 때 생각했으면 좋았을 만한 여러 리소스 간의 태그 적용 혜택을 누릴 수 있게 하여 엄청난 시간을 절약하고 향후 업데이트를 용이하게 합니다. 태깅이 왜 중요한지에 대한 자세한 내용은 여기에서 확인하세요.
어떻게 사용하나요?(How?)
전제 조건(Prerequisites)
- OpenTofu 1.x 또는 Terraform 0.12부터 1.x까지.
사용 방법(Usage)
-
homebrew를 통해 설치합니다:
brew install env0/terratag/terratag
또는 최신 릴리스 바이너리를 다운로드합니다.
-
OpenTofu/Terraform 모듈을 초기화하여 프로바이더 스키마를 가져오고 자식 모듈을 끌어옵니다:
-
Terratag 실행
terratag -dir=foo/bar -tags="environment_id": "prod"
또는
terratag -dir=foo/bar -tags="environment_id=prod,some-tag=value"
예시 출력(Example Output)
Terratag 실행 전
Terratag 실행 후
terratag -tags={"env0_environment_id":"dev","env0_project_id":"clientA"}를 실행하면 다음과 같은 결과가 출력됩니다:
|- aws.terratag.tf
|- gcp.terratag.tf
|- aws.tf.bak
...
# aws.terratag.tf
provider "aws" {
version = "~> 2.0"
...
}
# gcp.terratag.tf
resource "google_storage_bucket" "static-site" {
name = "image-store.com"
...
선택적 CLI 플래그 (Optional CLI flags)
-dir=<path>: 기본값은 .입니다. opentofu/terraform 폴더의 .tf 및 .tofu 파일을 태그할 위치를 지정합니다.
-skipTerratagFiles=false: 같은 디렉터리에 대해 terratag를 두 번째 실행할 때 *.terratag.tf와 *.terratag.tofu 파일 처리를 건너뛰지 않습니다.
-rename=false: <basename>.tf (또는 .tofu) 파일을 <basename>.terratag.tf (또는 .terratag.tofu)로 대체하는 대신, 원래 파일 이름을 유지합니다.
-filter=<regular expression>: 기본값은 .*입니다. 정규 표현식으로 일치하는 리소스 유형에만 태그를 적용합니다.
-skip=<regular expression>: 기본값은 빈 문자열(제외 없음)입니다. 정규 표현식으로 일치하는 리소스 유형은 태그에서 제외됩니다. 이 플래그는 -filter 이후에 적용됩니다.
-type=<terraform, terragrunt, or terragrunt-run-all>: 기본값은 terraform (및 opentofu)입니다. terragrunt를 사용하는 경우 .terragrunt-cache 폴더 아래의 파일을 태그합니다. 참고: Terragrunt가 .terragrunt-cache 폴더를 생성하지 않는 경우, 기본값을 사용하거나 생략하십시오.
-verbose: 상세 로깅을 활성화합니다.
-default-to-terraform: 기본적으로 OpenTofu(설치된 경우)를 사용하며, 이 설정을 하면 Opentofu가 설치되어 있어도 Terraform을 사용하게 됩니다.
--keep-existing-tags: 설정하면 태그 병합 시 기존 태그가 보존됩니다 (기본값은 새 태그가 기존 태그를 덮어씁니다).
환경 변수를 통해 옵션을 설정하는 것도 지원됩니다. CLI 플래그가 환경 변수보다 우선순위를 가집니다.
TERRATAG_TAGS
TERRATAG_DIR
TERRATAG_SKIPTERRATAGFILES
...
리소스 유형 필터링 (Filtering resource types)
S3 및 DynamoDB 리소스만 포함하려면:
terratag -tags='{"env":"prod"}' -filter='aws_s3_bucket|aws_dynamodb_table'
IAM 리소스를 제외한 모든 것을 태그 지정하려면:
terratag -tags='{"env":"prod"}' -skip='^aws_iam_'
둘을 결합하여 사용 — aws_* 리소스 전체를 태그 지정하되 IAM은 건너뛰기:
terratag -tags='{"env":"prod"}' -filter='^aws_' -skip='^aws_iam_'
더 많은 샘플 보기 여기
참고 사항 (Notes)
- 이미 추가하려는 태그와 정확히 동일한 태그를 가진 리소스는 덮어쓰여집니다 (overridden).
- 지원되는 Provider:
aws
google
azurerm
azurestack
azapi
Terragrunt 사용법 (Usage with Terragrunt)
terratag을 Terragrunt와 함께 사용하려면:
- 표준 유닛에는
-type=terragrunt를 사용하십시오.
- 암시적 스택(implicit stacks)에는
-type=terragrunt-run-all을 사용하십시오.
참고: 명시적 스택(Explicit stacks)은 명시적으로 지원되지 않습니다. 만약 명시적 스택으로 작업하는 경우, -type=terragrunt와 -dir=<unit_path>를 사용하여 각 유닛에서 개별적으로 terratag을 실행할 수 있습니다. 생성된 스택이 암시적 스택과 유사한 경우, 생성된 스택 디렉토리(.terragrunt-stack가 기본값)에서 -type=terragrunt-run-all을 사용할 수 있습니다. 유닛을 스택에 초기화하려면 terragrunt stack run init을 실행하거나, 사전에 각 유닛에서 terragrunt init을 실행하는 것을 기억하십시오.
새로운 Terragrunt 버전에서 문제가 발생하면 이슈를 열어주십시오.
개발 (Develop)
이슈 및 Pull Request는 환영합니다!
전제 조건 (Prerequisites)
빌드 (Build)
git clone https://github.com/env0/terratag
cd terratag
go mod tidy
...
테스트 (Test)
구조 (Structure)
테스트 케이스는 test/tests 아래에 위치합니다.
여기에 배치되는 각 테스트 케이스는 다음 디렉토리 구조를 가져야 합니다:
my_test
|+ input
... // /input 아래의 모든 깊이
...
input은 테스트할 terraform 파일을 배치해야 하는 디렉터리입니다. 모든 명령어는 main.tf가 위치한 계층 구조 내 어디에서든 실행됩니다. 이는 복잡하게 중첩된 서브모듈(submodule) 해상도(resolution) 사례가 발생할 수 있으며, 상위 계층의 디렉터리가 어떻게 해결되는지 테스트하고 싶을 때를 대비하기 위함입니다.
expected는 모든 .terratag.tf 파일이 출력 디렉터리(output directory)와 매칭될 디렉터리입니다.
각 terraform 버전은 실행할 테스트 스위트 목록을 포함하는 자체 설정 파일을 가지고 있습니다. 이 설정 파일은 test/fixtures/terraform_xx/config.yaml에 있으며, 여기서 xx는 terraform 버전을 나타냅니다.
무엇이 테스트되는가?
각 테스트는 다음 단계를 거쳐 실행됩니다:
terraform init
terratag
terraform validate
마지막으로, out 디렉터리의 결과를 expected 디렉터리와 비교합니다.
테스트 실행하기
테스트는 특정 Terraform 버전에서만 실행할 수 있습니다.
go test -run TestTerraformXX
버전 간 전환을 위해 tfenv를 사용합니다. CI 테스트에 사용되는 정확한 버전은 test/tfenvconf에서 확인할 수 있습니다.
릴리스(Release)
- 로컬에서 semver 형식으로 태그를 생성하고 푸시합니다 -
git tag v0.1.32 && git push origin --tags
- Github Releases로 이동하여 Release Drafter Bot이 만든 초안을 편집합니다. 여기에 릴리스의 변경 로그가 포함되어 있어야 합니다 (없으면 'Auto-generate release notes'를 누르세요). 이전 단계에서 생성한 태그를 가리키도록 설정하고 릴리스를 게시합니다.
- 바이너리는
.github/workflows/release.yml에 정의된 Github 액션에 의해 자동으로 생성됩니다.
- NPM은 새로운 버전을 자동으로 인식합니다.