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

클라우드·인프라2분조회

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

Provider 를 최신으로 올리고 나서 배포하는데 지원하지 않는 인자라는 에러가 났습니다.

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

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 = {
  { ... },              →     ...
]                       →   }

참고

  1. 불러오는 중