

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Terraform 상태 및 백엔드 이해
<a name="states-and-backends"></a>

코드형 인프라(IaC)에서 가장 중요한 개념 중 하나는 *상태* 개념입니다. IaC 서비스는 상태를 유지하므로 배포할 때마다 리소스를 다시 생성하지 않고도 IaC 파일에 리소스를 선언할 수 있습니다. IaC 파일은 배포가 끝날 때 모든 리소스의 상태를 문서화하므로 다음 배포에서 선언된 대로 해당 상태를 대상 상태와 비교할 수 있습니다. 따라서 현재 상태에 라는 Amazon Simple Storage Service(Amazon S3) 버킷이 포함되어 `my-s3-bucket` 있고 수신되는 변경 사항에 동일한 버킷도 포함되어 있는 경우, 새 프로세스는 모든 새 버킷을 생성하려고 하지 않고 기존 버킷에 발견된 모든 변경 사항을 적용합니다.

다음 표에는 일반적인 IaC 상태 프로세스의 예가 나와 있습니다.


****  

| 현재 상태 | 대상 상태 | 작업 | 
| --- | --- | --- | 
| 이름이 인 S3 버킷 없음 my-s3-bucket | 이름이 인 S3 버킷 my-s3-bucket | 라는 S3 버킷 생성 my-s3-bucket | 
| my-s3-bucket 버킷 버전 관리가 구성되지 않은 경우 | my-s3-bucket 버킷 버전 관리가 구성되지 않은 경우 | 작업 없음 | 
| my-s3-bucket 버킷 버전 관리가 구성되지 않은 경우 | my-s3-bucket 버킷 버전 관리가 구성된 | 버킷 버전 관리를 my-s3-bucket 사용하도록 구성 | 
| my-s3-bucket 버킷 버전 관리가 구성된 | 이름이 인 S3 버킷 없음 my-s3-bucket | 삭제 시도 my-s3-bucket | 

 AWS CloudFormation 및 Terraform 트랙 상태의 다양한 방법을 이해하려면 두 도구 간의 첫 번째 기본 차이점을 기억해야 합니다. CloudFormation은 내부에서 호스팅 AWS 클라우드되고 Terraform은 기본적으로 원격입니다. 이 사실을 통해 CloudFormation은 내부적으로 상태를 유지할 수 있습니다. CloudFormation 콘솔로 이동하여 지정된 스택의 이벤트 기록을 볼 수 있지만 CloudFormation 서비스 자체가 상태 규칙을 적용합니다.

지정된 리소스에 대해 CloudFormation이 작동하는 세 가지 모드는 `Create`, `Update`및 입니다`Delete`. 현재 모드는 마지막 배포에서 발생한 일을 기반으로 결정되며, 그렇지 않으면 영향을 받을 수 없습니다. 결정된 모드에 영향을 미치기 위해 CloudFormation 리소스를 수동으로 업데이트할 수 있지만 "이 리소스의 경우 `Create` 모드에서 운영"이라는 명령을 CloudFormation에 전달할 수 없습니다.

Terraform은에서 호스팅되지 않으므로 상태를 유지하는 AWS 클라우드프로세스를 더 구성할 수 있어야 합니다. 이러한 이유로 [Terraform 상태는](https://developer.hashicorp.com/terraform/language/state) 자동으로 생성된 상태 파일 내에서 유지됩니다. Terraform 개발자는 CloudFormation보다 훨씬 더 직접적으로 상태를 처리해야 합니다. 기억해야 할 중요한 점은 추적 상태가 두 도구 모두에 동일하게 중요하다는 것입니다.

기본적으로 Terraform 상태 파일은 Terraform 스택을 실행하는 기본 디렉터리의 최상위에 로컬로 저장됩니다. 로컬 개발 환경에서 `terraform apply` 명령을 실행하면 Terraform이 실시간으로 상태를 유지하는 데 사용하는 **terraform.tfstate** 파일을 생성하는 것을 볼 수 있습니다. 더 좋거나 더 나쁘면 CloudFormation보다 Terraform의 상태를 훨씬 더 잘 제어할 수 있습니다. 상태 파일을 직접 업데이트해서는 안 되지만 배포 간에 상태를 업데이트하는 몇 가지 Terraform CLI 명령을 실행할 수 있습니다. 예를 들어[, terraform 가져오기](https://developer.hashicorp.com/terraform/cli/import)를 사용하면 Terraform 외부에서 생성된 리소스를 배포 스택에 추가할 수 있습니다. 반대로 [terraform state rm](https://developer.hashicorp.com/terraform/cli/commands/state/rm)을 실행하여 상태에서 리소스를 제거할 수 있습니다.

Terraform이 상태를 어딘가에 저장해야 한다는 사실은 CloudFormation에 적용되지 않는 또 다른 개념인 *백엔*드를 초래합니다. [Terraform 백엔드](https://developer.hashicorp.com/terraform/language/settings/backends/configuration)는 배포 후 Terraform 스택이 상태 파일을 저장하는 곳입니다. 새 배포가 시작될 때 상태 파일을 찾을 것으로 예상되는 위치이기도 합니다. 위에서 설명한 대로 로컬에서 스택을 실행할 때 최상위 로컬 디렉터리에 Terraform 상태 사본을 보관할 수 있습니다. 이를 *로컬 백엔드*라고 합니다.

지속적 통합 및 지속적 배포(CI/CD) 환경을 위해 개발할 때 로컬 상태 파일은 일반적으로 버전 제어에서 벗어나도록 **.gitignore** 파일에 포함됩니다. 그러면 파이프라인 내에 로컬 상태 파일이 없습니다. 제대로 작동하려면 파이프라인 단계가 어딘가에서 올바른 상태 파일을 찾아야 합니다*. * 이러한 이유로 Terraform 구성 파일에는 종종 백엔드 블록이 포함됩니다. 백엔드 블록은 Terraform 스택에 상태 파일을 찾기 위해 자체 최상위 디렉터리 이외의 위치를 찾아야 함을 나타냅니다.

Terraform 백엔드는 [Amazon S3 버킷](https://developer.hashicorp.com/terraform/language/settings/backends/s3), [API 엔드포인트 ](https://developer.hashicorp.com/terraform/language/settings/backends/http)또는 [원격 Terraform 워크스페이스](https://developer.hashicorp.com/terraform/language/settings/backends/remote) 등 거의 모든 곳에 위치할 수 있습니다. 다음은 Amazon S3 버킷에 저장된 Terraform 백엔드의 예입니다.

```
terraform {
  backend "s3" {
    bucket = "my-s3-bucket"
    key    = "state-file-folder"
    region = "us-east-1"
  }
}
```

Terraform 구성 파일 내에 민감한 정보가 저장되지 않도록 백엔드는 부분 구성도 지원합니다. 이전 예제에서는 버킷에 액세스하는 데 필요한 자격 증명이 구성에 없습니다. 자격 증명은 환경 변수 또는와 같은 다른 수단을 사용하여 얻을 수 있습니다 AWS Secrets Manager. 자세한 내용은 [AWS Secrets Manager 및 HashiCorp Terraform을 사용하여 민감한 데이터 보안을](https://docs.aws.amazon.com/prescriptive-guidance/latest/secure-sensitive-data-secrets-manager-terraform/introduction.html) 참조하세요.

일반적인 백엔드 시나리오는 로컬 환경에서 테스트 목적으로 사용되는 로컬 백엔드입니다. **terraform.tfstate **파일은 원격 리포지토리로 푸시되지 않도록 **.gitignore** 파일에 포함됩니다. 그런 다음 CI/CD 파이프라인 내의 각 환경은 자체 백엔드를 유지합니다. 이 시나리오에서는 여러 개발자가이 원격 상태에 액세스할 수 있으므로 상태 파일의 무결성을 보호해야 합니다. 여러 배포가 동시에 실행되고 상태를 업데이트하는 경우 상태 파일이 손상될 수 있습니다. 따라서 로컬이 아닌 백엔드가 있는 상황에서는 일반적으로 배포 중에 상태 파일이 [잠깁니다](https://developer.hashicorp.com/terraform/language/state/locking).