terraform-aws-ec2-instance v5→v6 — root_block_device 형식 변경

클라우드·인프라3분조회 –

EC2 인스턴스는 직접 aws_instance 를 쓰지 않고 커뮤니티 모듈 (terraform-aws-modules/ec2-instance)로 찍어내고 있었습니다. 인스턴스 정의가 여러 개라 공통 설정을 모듈에 몰아두는 쪽이 편했기 때문입니다.

모듈은 버전을 고정해서 쓰고 있었고 AWS Provider 도 마찬가지로 상한을 걸어 둬서, 새 리소스 타입이나 새 인자가 필요할 때만 상한을 올립니다.

이번에는 Provider 를 최신으로 올려야 할 일이 생겨 상한을 풀고 terraform init 을 다시 돌렸습니다. 모듈 버전은 건드리지 않았습니다.

그러고 배포하려니 지원하지 않는 인자라는 에러가 났습니다.

Error: Unsupported argument
on ../main.tf line 696, in resource "aws_instance" "this":

cpu_core_count = null
cpu_threads_per_core = null
spot_block_duration_minutes = null

셋 다 제 코드에 쓴 적 없는 인자고, 오류가 난 줄도 제 파일이 아니라 모듈 안의 main.tf 입니다.

Provider와 모듈의 버전 불일치

버전 조합은 이랬습니다.

OpenTofu                      v1.10.3
AWS Provider                  v6.21.0
terraform-aws-ec2-instance    v5.6.0

모듈 v5.6.0 은 cpu_core_count, cpu_threads_per_core, spot_block_duration_minutes 를 리소스에 항상 넣고, 값이 null 이어도 인자 자체는 들어갑니다.

문제는 AWS Provider v6 이 이 인자들을 더 이상 받지 않는다는 겁니다. 모듈이 넣으려는 인자를 Provider 가 모르니 “Unsupported argument” 가 납니다.

버전을 올릴 때 Provider 만 최신으로 가고 모듈은 예전 걸 그대로 두면 이렇게 어긋납니다. 모듈 v6.1.4 는 이 인자들을 Nitro 기반 인스턴스일 때만 조건부로 넣기 때문에 Provider v6 과 맞습니다.

업그레이드 후 root_block_device 형식 변경

모듈을 v6.1.4 로 올리자 이번엔 다른 게 깨졌습니다. root_block_device 가 리스트에서 객체로 바뀌어 있었습니다.

# v5.6.0 — 리스트
root_block_device = [
  {
    encrypted   = true
    volume_type = "gp3"
    volume_size = 50
  },
]

# v6.1.4 — 객체
root_block_device = {
  encrypted   = true
  volume_type = "gp3"
  volume_size = 50
}

이건 바뀐 쪽이 오히려 맞습니다. EC2 인스턴스의 root block device 는 항상 하나뿐인데도 리스트는 여러 개를 담을 수 있는 것처럼 보이기 때문입니다. 객체로 바뀌면서 “하나뿐” 이라는 실제 제약이 타입에 그대로 드러났습니다.

메이저 버전을 올릴 때 이런 형식 변경은 changelog 의 breaking change 에 적혀 있습니다. 에러를 보고 역추적하는 것보다 올리기 전에 breaking change 부터 읽는 게 빠릅니다.

인스턴스 정의 파일이 여러 개면 전부 같은 방식으로 바꿔야 하는데, 손댈 건 감싸는 괄호뿐입니다.

root_block_device = [   →   root_block_device = {
  { ... },              →     ...
]                       →   }

안에 적는 값은 그대로고, 안 고치면 타입이 안 맞는다며 떨어집니다.

모듈과 Provider는 같이 올림

Provider 만 올리고 모듈을 그대로 두면 모듈이 넣는 인자와 Provider 가 받는 인자가 어긋나고, 반대로 모듈만 올리면 이번처럼 입력 형식이 바뀐 데서 걸립니다. 버전은 따로 붙어 있지만 결국 같은 리소스를 만드는 코드라, 올릴 때는 같이 올려야 합니다.

Unsupported argument 가 내가 쓴 적도 없는 인자를 가리키면 그건 모듈이 넣은 것이니, 내 코드가 아니라 모듈과 Provider 의 버전 조합부터 봅니다.

참고

  1. 불러오는 중