테라폼을 실행할 때마다 테라폼은 생성한 인프라에대한 정보를 테라폼 상태파일에 기록합니다.
기본적으로 /foo/bar 폴더에서 테라폼을 실행하면 테라폼은 /foo/bar/terraform.tfstate 파일을 생성합니다.
이 파일에는 구성 파일의 테라폼 리소스가 실제 리소스의 표현으로 매핑되는 내용을 기록하는 사용자 정의 JSON 형식이 포함되어있습니다.
resource "aws_instance" "wgpark_ec2" {
ami = "SOMETING-AMI"
instance_type = "t2.micro"
}
$ terraform apply # 명령어를 실행하면 나타나는 terraform.tfstate 파일
{
"version": 4,
"terraform_version": "1.0.8",
"serial": 5,
"lineage": "75ce598d-b6fd-feb4-3846-12e156b90023",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "aws_instance",
"name": "ubuntu",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"ami": "ami-04876f29fd3a5e8ba",
"arn": "arn:aws:ec2:ap-northeast-2:701558900840:instance/i-0af95c7cbf7f7be0d",
"associate_public_ip_address": true,
"availability_zone": "ap-northeast-2a",
.
.
.
}
]
}
]
}
테라폼은 이 JSON 형식을 통해 AWS 계저의 EC2 인스턴스와 일치하는것을 알고 있습니다.
테라폼을 실행할 대마다 AWS 에서 이 EC2 인스턴스의 최신 상태를 가져와서 테라폼의 구성과 비교하여 어느 변경 사항을 적용해야 하는지 결정 할 수 있습니다.
즉, plan 명령의 출력은 상태 파일의 ID를 통해 발견된 컴퓨터의 코드와 실제 세계에 배포된 인프라 간의 차이입니다.
상태 파일은 프라이빗 API입니다.
상태파일은 배포할 때마다 변경되는 프라이빗 API로, 오직 테라폼 내부에서 사용하기 위한것입니다.
테라폼 상태 파일을 직접 편집하거나 직업 읽는 코드를 작성해서는 안됩니다.
상태파일을 조작해야 하는ㄱ ㅕㅇ우 terraform import 또는 terraform state 명령을 사용해야합니다.
상태파일을 저장하는 공유 스토리지
테라폼을 사용하여 인프라르 업데이트하려면 각 팀원이 동일한 테라폼 상태 파일에 액세스 해야합니다. 상태 파일을 공유 위치에 저장해야합니다.
상태 파일 잠금
상태 데이터가 공유되자마자 '잠금'이라는 새로운 문제가 발생합니다. 잠금 기능 없이 두 팀원이 동시에 테라폼을 실행하는 경우 테라폼 프로세스가 상태 파일을 동시에 업데이트하여 충돌을 일으킬 수 있습니다. 이러한 경쟁 상태에 처하면 데이터가 손실되거나 상태 파일이 손상될 수 있습니다.
상태 파일 격기
인프라를 변경할 때는 다른 환경을 격리하는 것이 가장 좋습니다.
깃이나 섭버전등 버전 관리시스템이 테라폼 상태 파일을 저장하는 것은 부적절합니다.
버전 관리 시스템을 사용하는 대신 테라폼에 내장된 원격 백엔드 기능을 사용하는것이 좋은 방법입니다.
테라폼 백엔드는 테라폼이 상태를 로드하고 저장하는 방법을 결정합니다. 기본 백엔드는 로컬 백엔드로써 로컬 디스크에 상태 파일을 저장합니다. 원격 백엔드를 사용하면 상태 파일을 원격 공유 저장소에 저장할 수 있습니다.
아마존 S3,애저 스토리지, 구글 클라우드 스토리지,해시코르의 테라폼 클라우드,테라폼 프로,테라폼 엔터프라이즈 등 다양한 원격 백엔드가 지원됩니다.
Terraform Up & Running 테라폼 Writing Infrastructure as code 업앤 러닝 - 예브게닝 브릭만