[Terraform] configmaps "aws-auth" already exists
테라폼으로 EKS를 생성할 때 만나는 에러입니다. 문제 상황은 aws_eks_cluster 를 통해 클러스터를 생성하고 나서 kubernetes_config_map 으로 aws-auth를 ConfigMap에 등록하려고 할 때 발생합니다. terraform apply 를 통해 두 개의 리소스가 함께 배포되는 상황입니다.
대략 아래와 같은 코드를 실행하는 상황이라고 볼 수 있습니다. 불필요한 부분은 말줄임표로 생략했습니다.
resource "aws_eks_cluster" "this" {
name = var.cluster_name
...
}
resource "kubernetes_config_map" "this" {
metadata {
name = "aws-auth"
namespace = "kube-system"
}
data = {
....
}
}
오류의 원인은 EKS 생성 시에 aws-auth가 함께 만들어지기 때문입니다. 이미 존재하는 리소스를 kubernetes_config_map으로 다시 생성하려고 하니까 문제가 되는 거죠.
configmaps "aws-auth" already exists
관련해서 해결책으로 여러 블로그나 Stack Overflow에서 configMap을 import 해서 사용하라고 가이드합니다. 하지만 terraform을 CI/CD로 연결시켜 둔 상태라면 import를 사용하라는 건 문제 해결에 도움이 안 됩니다.
의외로 이 문제의 해결책은 쉬운 곳에 있는데요. kubernetes_config_map이 아니라 kubernetes_config_map_v1_data를 사용해 주면 됩니다. kubernetes_config_map_v1_data는 이미 존재하는 configMap을 가져와서 사용할 수 있게 해 줍니다. 그리고 데이터가 겹치는 경우 충돌이 발생할 수 있는데 force 옵션을 활성화해 주면 그것도 해결됩니다.
resource "kubernetes_config_map_v1_data" "this" {
metadata {
name = "aws-auth"
namespace = "kube-system"
}
data = {
...
}
force = true
}
force 옵션 설명은 아래와 같습니다.
force - 충돌이 있는 경우 구성된 데이터를 강제로 관리합니다.
kubernetes_config_map_v1_data를 알기 전까지는 terraform apply가 실패하면 중간에 아래처럼 configMap에서 aws-auth를 삭제하고 다시 terraform apply를 실행시켜 줬었는데요.
$ kubectl describe cm/aws-auth -n kube-system # configmap에 aws-auth 내용 확인
Name: aws-auth
Namespace: kube-system
Labels: <none>
Annotations: <none>
Data
====
mapRoles:
----
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::999999999999:role/eks-example-role
username: system:node:{{EC2PrivateDNSName}}
BinaryData
====
Events: <none>
$
$
$
$ kubectl delete cm/aws-auth -n kube-system # configmap에 aws-auth 삭제
configmap "aws-auth" deleted
$
이제 쾌적하게 한 방에 끝낼 수 있게 됐습니다. 저와 같은 어려움을 겪으셨던 분이 있으셨다면 도움이 되셨기를 바랍니다 :)