Troubleshooting Worker 교체 Plan - 100-hours-a-week/KTB4-2nd-Cloud GitHub Wiki

중지된 Worker 때문에 EC2 교체 Plan 발생

2026-09-28

🐞 에러 내용

CloudWatch Dashboard와 Alarm을 추가하고 Terraform Plan을 확인했는데, 이번 작업과 상관없는 Worker EC2 교체가 들어 있었습니다.

associate_public_ip_address = false -> true # forces replacement

Plan: 12 to add, 2 to change, 1 to destroy.

1 to destroy는 Worker를 멈추는 게 아니라 지우고 새로 만든다는 뜻이었습니다. Worker ID가 바뀌면 그 ID를 쓰는 App Role과 GitHub 배포 Role의 정책도 같이 바뀔 예정이었습니다.

이 Plan은 apply하지 않고 원인부터 확인했습니다.

🔍 원인 분석

Worker는 실행 중에 GHCR, SSM에 접속해야 해서 처음부터 Public IP를 받도록 만들었습니다.

associate_public_ip_address = true

그런데 Worker는 유휴 상태에서 스스로 꺼집니다. Plan을 돌린 시점에 Worker가 stopped였고, 자동 할당 Public IP가 해제되어 있어서 Provider가 이 값을 false로 읽었습니다.

코드는 true인데 실제 값이 false로 보이니, 바로 바꿀 수 없는 속성이라 교체를 제안한 것이었습니다.

CloudWatch 작업은 Worker ID를 Dashboard와 Alarm에서 참조했을 뿐 Worker 네트워크를 바꾸지 않았습니다. Terraform이 전체 리소스를 다시 읽으면서, Worker가 꺼져 있을 때만 생기는 차이가 이번 Plan에 같이 나온 것입니다.

Worker를 다시 켜보니 Public IP가 할당됐고, State에도 true로 확인됐습니다.

✅ 해결 방법

Worker는 실행 중에 Public IP가 필요하므로 코드 값을 false로 바꾸지 않았습니다. 처음 만들 때는 true를 쓰고, 꺼져 있을 때 생기는 읽기 차이만 무시하도록 했습니다.

lifecycle {
  ignore_changes = [
    associate_public_ip_address,
  ]
}

수정 뒤 Plan을 다시 돌리자 Worker와 IAM 변경이 사라지고 이번 작업의 리소스만 남았습니다.

Plan: 11 to add, 0 to change, 0 to destroy.

회고

관측 리소스만 추가하는 작업이라 기존 EC2가 바뀔 일은 없다고 생각했는데, Plan은 관리 중인 전체 상태를 다시 비교했습니다.

Worker가 꺼져 있을 때 Plan을 돌리면 이런 차이가 나올 수 있다는 걸 먼저 확인하고, 작업 범위와 무관한 change나 destroy가 하나라도 보이면 원인을 찾은 뒤 apply합니다.