개발/IaC

[Terraform] configmaps "aws-auth" already exists

Jaeyeon Baek 2023. 11. 2. 19:58

테라폼으로 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
$

 

이제 쾌적하게 한 방에 끝낼 수 있게 됐습니다. 저와 같은 어려움을 겪으셨던 분이 있으셨다면 도움이 되셨기를 바랍니다 :)