테라폼으로 시작하는 IaC 책을 기준으로 정리하였습니다.
Terraform을 사용한 효과적인 인프라 관리의 핵심에는 Terraform 상태라는 기본 개념이 있습니다.
Terraform state란?
Terraform 상태는 인프라의 청사진에 비유될 수 있습니다. 이는 관리되는 실제 인프라의 스냅샷을 캡슐화하고 활용되는 리소스, 특정 구성 및 상호 연결 방법에 대한 세부 정보를 포함합니다.
상호의존성 관리
Terraform 상태의 주요 역할 중 하나는 다양한 리소스 간의 관계와 종속성을 추적하는 것입니다. 이를 통해 Terraform은 리소스의 프로비저닝, 업데이트 또는 제거를 올바른 순서로 조율하여 일관되고 일관된 상태를 보장할 수 있습니다.
민감한 정보 보호
Terraform 상태에는 비밀번호나 액세스 키와 같은 민감한 데이터가 포함되는 경우가 많습니다. 그러나 이제 모범 사례에서는 잠재적인 위험을 완화하기 위해 암호화 또는 기타 보안 저장 메커니즘을 통해 이 정보를 보호하는 것을 강조합니다.
스토리지 및 백엔드
Terraform 상태 저장은 로컬 파일, Amazon S3 또는 Azure Storage와 같은 다양한 백엔드를 사용하여 로컬 또는 원격으로 발생할 수 있습니다. 향상된 협업, 일관성 및 보안을 위해 원격 백엔드를 활용하는 것이 점점 더 선호되고 있습니다.
동시성 및 잠금 관리
동시성은 인프라 관리에서 중요한 고려 사항입니다. Terraform 상태는 여러 사용자가 동시에 충돌하는 수정을 방지하기 위해 잠금 메커니즘을 사용합니다. 이를 통해 인프라 수정에 대한 안전하고 통제된 접근 방식이 보장됩니다.
운영상의 중요성
Terraform 상태는 인프라 운영 중 의사 결정을 위한 핵심 역할을 합니다. plan, apply및 같은 명령은 destroy필요한 변경 사항을 이해하고 기존 인프라에 미치는 영향을 평가하기 위해 상태에 크게 의존합니다.
실습
State 파일에는 리소스에 대한 모든 것이 담겨있다. 아래의 실습을 통해, 상태 파일 관리의 중요성을 확인해본다.
pw.tf
resource "random_password" "repush_pw" {
length = 16
special = true
override_special = "!#$%"
}
terraform init && terraform plan && terraform apply -auto-approve
테라폼 명령어를 통해 리소스를 확인하면, 시크릿 정보는 알려주지 않는다.
terraform state show random_password.mypw
# random_password.mypw:
resource "random_password" "mypw" {
bcrypt_hash = (sensitive value)
id = "none"
length = 16
lower = true
min_lower = 0
min_numeric = 0
min_special = 0
min_upper = 0
number = true
numeric = true
override_special = "!#$%"
result = (sensitive value)
special = true
upper = true
}
하지만, state 파일을 확인해보면 리소스에 대한 정보가 전부 존재한다.
{
...
"resources": [
{
"mode": "managed",
"type": "random_password",
...
"instances": [
{
"schema_version": 3,
"attributes": {
"bcrypt_hash": "$2a$10$pLMnmRKSY52ageoVumPlpuP5dyo2GZpomOxo6MsQetO/F28dR2ge2",
"id": "none",
...
"result": "CLTOsYB9zWifY9WT",
"special": true,
"upper": true
},
"sensitive_attributes": []
}
]
}
],
"check_results": null
}
테라폼 콘솔에서도 sensitive value는 보이지 않는다.
echo "random_password.repush_pw" | terraform console
{
"bcrypt_hash" = (sensitive value)
"id" = "none"
"keepers" = tomap(null) /* of string */
"length" = 16
...
"override_special" = "!#$%"
"result" = (sensitive value)
"special" = true
"upper" = true
}
모듈은 빌딩 블록과 같아서 인프라를 보다 체계적이고 효율적으로 관리할 수 있는 방법을 제공합니다.
Terraform 모듈의 본질
Terraform 모듈의 핵심은 재사용 및 공유가 가능한 구성 단위입니다. 이는 관련 리소스, 구성 및 기능을 함께 그룹화하여 인프라의 특정 측면을 캡슐화하는 컨테이너 역할을 합니다.
캡슐화 및 구성
모듈을 깔끔하게 구성된 인프라 구성 요소 패키지로 상상해 보십시오. 논리적이고 직관적인 방식으로 리소스와 구성을 캡슐화하여 깔끔하고 구조화된 코드베이스를 촉진할 수 있습니다.
매개변수화를 통한 맞춤화
Terraform 모듈은 유연성을 위해 설계되었습니다. 입력 매개변수를 허용하여 특정 요구 사항에 따라 사용자 정의가 가능합니다. 이 매개변수화 기능을 사용하면 모듈 자체를 다시 작성할 필요 없이 모듈을 다양한 사용 사례에 맞게 조정할 수 있습니다.
유용한 정보 노출: 산출물
모듈은 출력을 정의하여 구성의 다른 부분에 귀중한 정보를 노출하는 방법을 제공할 수도 있습니다. 이는 다른 곳에서 활용해야 하는 중요한 데이터나 결과일 수 있으며 보다 통합되고 간소화된 설정에 기여합니다.
Terraform 모듈의 장점
재사용성 및 버전 관리
모듈의 가장 큰 장점 중 하나는 재사용성입니다. 일단 생성되면 여러 프로젝트에서 활용하여 일관성을 강화하고 중복성을 줄일 수 있습니다. 또한 모듈의 버전을 관리하여 업데이트를 단순화하고 인프라 구성 요소의 제어된 발전을 보장할 수 있습니다.
추상화
복잡한 인프라를 다룰 때 모든 세부 사항을 관리하는 것은 부담스러울 수 있습니다. 모듈은 이러한 복잡성을 추상화하여 더 높은 수준의 이해를 제공하고 복잡한 아키텍처를 더 쉽게 관리할 수 있도록 해줍니다.
커뮤니티 생태계 활용
Terraform은 다양한 플랫폼을 통해 모듈을 적극적으로 공유하는 활발한 커뮤니티를 자랑합니다. 이를 통해 프로젝트에 원활하게 통합할 수 있는 쉽게 사용할 수 있고 잘 테스트된 모듈로 구성된 풍부한 생태계가 생성됩니다.
실습
main.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "t1013-xgro-vpc"
cidr = "10.0.0.0/16"
azs = ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = false
enable_vpn_gateway = false
tags = {
Terraform = "true"
Environment = "dev"
}
}
terraform init && terraform plan && terraform apply -auto-approve