Versioning
원격 상태 파일 저장소
Backend Block
"테라폼 상태 파일을 어디에 저장하고 관리할지 설정"
기본적으로 백엔드 블록은 local 을 사용하도록 설정 되어 있고, 협업을 위해 해당 챕터에서는 S3를 사용한다. 테라폼 공식문서는 아래 이미지 처럼 백엔드 블록에서 어떤 저장소를 사용할 수 있는지 명시 되어있다.

"Local backend block을 사용하는 도중 작업 하는 환경이 바뀐다면?"
집에서 개인 맥북으로 작업 하다가 맥북을 두고 외부 일정을 나가서 테라폼을 작성 한다면 모두 새로 생성하는 것 처럼 인식한다.
또, 내가 아닌 다른 사람이 작업 하면 상태 파일을 Git 으로 관리하거나 파일을 전달해야 하는걸까?
"원격 저장소 구성의 장점"
원격 저장소에 있는 상태 파일은 계속 동기화 되어 있기 때문에 작업자 A가 어디 까지 작업을 했는지에 대해 다른 작업자가 쉽게 알 수 있다.
"같은 파일을 동시에 작업한다면?"
원격 저장소 내에 A 작업자가 SG를 작업 하고 있고 다른 작업자가 해당 SG 파일에 포트를 추가 한다거나 등 동시 작업을 수행 할 경우 충돌이 발생한다.
이걸 방지하기 위해 1 명만 작업할 수 있도록 Lock이 필요하다.
Remote Backend Example

"최초의 원격 저장소를 위한 테라폼 구성은 어디에 저장할까?"
아래의 방식을 선호에 따라 사용하면 되며 각 조직에서 추구하는 시스템을 따르면 된다. 해당 챕터에서는 AWS에서 잘 만들어준 GUI 환경에서 생성하기 위해 콘솔 방식을 선택했다.
로컬 테라폼 작성
콘솔(S3, DynamoDB Table) 작업 후 공유
AWS Console 환경에서 원격 저장소 구성을 위한 리소스 생성하기
Remote Data
"외부에서 관리하는 인프라 데이터를 현재의 테라폼 구성에서 재사용 하는 기능"
"기존에 만든 VPC에 EC2를 생성하려면?"

subnet id, security group id 의 값을 넣기 위해 아래 이미지 처럼 AWS Console에서 직접 값을 복사할 수도 있다.
하지만, 기존에 만들었던 VPC 정보에 모두 포함되어있다. 이 것을 사용하면 되지 않을까?

output "vpc_id" {
value = module.vpc.vpc_id
}
output "subnets" {
value = module.vpc.subnets
}
output "security_groups" {
value = module.vpc.security_groups
}
output을 적용 했다면 terraform plan으로 출력 부분이 변경 되었는지 확인하고 적용한다.
그 후 해당 출력 값을 사용할 수 있는 리소스를 정의 해서 참조하면 되는데, 해당 챕터는 Bastion EC2를 생성한다.
"외부 모듈에서 원격 저장소 데이터 사용하기"
EC2 Bastion을 생성하기 위해 작성한 테라폼 구성은 위 datasources 값을 기준으로 작성한다.
resource "aws_instance" "bastion" {
ami = "ami-0a998385ed9f45655"
instance_type = "t3.micro"
subnet_id = data.terraform_remote_state.vpc.outputs.subnets["oimarket-apne2-public-subnet-a"].id
vpc_security_group_ids = [
data.terraform_remote_state.vpc.outputs.security_groups["oimarket-apne2-permit-ssh-security-group"].id
]
tags = {
Name = "oimarket-apne2-bastion"
}
}
Provider Version Spec
"버전 관리를 통해 안정성과 협업 중요시하게 여기기"
"Terraform version"

"Provider version"

위 처럼 providers.tf 에 특정 버전을 명시하지 않는다면 terraform init 단계에서 가장 최신 버전을 다운로드 받아서 사용하게 된다.
"버전 충돌이 발생한 경우 어떻게 해결 해야할까?"
provider "aws" {
region = "ap-northeast-2"
}
terraform {
required_version = "= 1.9.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "= 5.82.0"
}
}
}
해당 버전은 hashcorp/aws 버전이 "5.82.0"만 허용이 된 상황이다. 하지만, 현재 테라폼 구성에 hashcorp/aws 버전이 5.82.2이면 당연히 충돌이 발생할텐데, 이 때 어떻게 해결해야 할까?
Last updated