본문 바로가기
공부/IaC

[Terraform/k8s] aws-auth ConfigMap Patch

by haejang 2023. 7. 20.
728x90
728x90

 

 

# aws-auth란?

aws와 k8s는 권한 체계를 다르게 가져간다.

-> aws에 어드민 권한이 있더라도 eks를 최초로 생성한 User(또는 Role)가 아니라면 내부 리소스를 확인할 수 없다.

하지만 aws에서 올리는 k8s인 eks 특성상, aws의 권한을 인가받을 수 있어야 한다.

예를들면, 당장 eks의 노드(ec2. 또는 fargate session)에서도 k8s 리소스들에 대한 권한이 필요하며, aws의 다른 유저들에게 내가 생성한 eks를 공유할수도 있어야 한다.

-> aws authentication을 k8s 권한체계랑 매핑시켜주는게 aws-auth ConfigMap의 역할이다.

aws-auth의 full configuration format은 아래에서 확인할 수 있다.

https://github.com/kubernetes-sigs/aws-iam-authenticator#full-configuration-format

 

GitHub - kubernetes-sigs/aws-iam-authenticator: A tool to use AWS IAM credentials to authenticate to a Kubernetes cluster

A tool to use AWS IAM credentials to authenticate to a Kubernetes cluster - GitHub - kubernetes-sigs/aws-iam-authenticator: A tool to use AWS IAM credentials to authenticate to a Kubernetes cluster

github.com

 

eks 최초 생성 시, 노드의 롤에 대한 master 권한이 자동으로 생성되어 있다. (Fargate 사용 시 Fargate Profile)

 

 

# eks 모듈에 aws-auth configmap 녹이기

aws-auth cm은 자동으로 생성되는 것이기 때문에 kubernetes_config_map 리소스로 생성하면 안된다.

대신 kubernetes_config_map_v1_data 리소스를 통해 이미 존재하는 cm의 데이터를 덮어쓸 수 있다.

주의해야 할 점은, 테라폼으로 aws-auth를 관리하게 될 시 다른 방식 (수동 수정 또는 별도 플랫폼)과 병행할 순 없다. (state가 깨지니까..)

 

난 테라폼으로만 할거니까 일단 녹였다.

그리고 난 fargate나 windows 노드는 사용하지 않기에 ec2 node 기반으로만 작성했다. 다른 롤들도 필요한 경우 아래를 참고하자.

https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/main.tf#L465

 

# eks 생성 시 input

aws_auth:
  mapRoles:
  - rolearn: arn:aws:iam::000000000000:role/Admin
    username: admin
    groups: ["system:masters"]
  mapUsers:
  - userarn: arn:aws:iam::000000000000:user/Alice
    username: alice
    groups: ["system:masters"]
  mapAccounts:
  - "012345678901"
  - "456789012345"

aws_auth 용 variable을 만들어주고, mapRoles, mapUsers, mapAccounts를 필요에 맞게 작성 후 인풋으로 넣어주자.

mapRoles에선 rolearn, mapUsers에선 userarn을 써야하는걸 주의하자. 공통된 입력을 받게 하고 모듈 안쪽에서 작업해줄수도 있겠지만, 난 거의 role만 쓸 예정이기 때문에 귀찮아서 작업 안했다.

 

# eks module 안에서

locals {
  # 나중에 Fargate 사용 시 Fargate용 Profile 추가 필요
  # https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/main.tf#L519-L526
  eks_aws_roles = [
    {
      rolearn  = {node_iam_role_arn} # 본인 모듈 속 Node Role Arn으로 대체 필요
      username = "system:node:{{EC2PrivateDNSName}}"
      groups = [
        "system:bootstrappers",
        "system:nodes",
      ]
    }
  ]

  aws_auth_data = {
    mapRoles    = yamlencode(concat(var.aws_auth.mapRoles, local.eks_aws_roles))
    mapUsers    = yamlencode(var.aws_auth.mapUsers)
    mapAccounts = yamlencode(var.aws_auth.mapAccounts)
  }
}

# 기존 configmap 내의 데이터를 관리할 수 있는 api
resource "kubernetes_config_map_v1_data" "aws_auth" {
  metadata {
    name      = "aws-auth"
    namespace = "kube-system"
  }

  data  = local.aws_auth_data
  force = true

  depends_on = [
    module.sg
  ]
}

 

eks_aws_roles 로컬변수 안의 {node_iam_role_arn} 만 본인 모듈 속 노드 롤 id로 잘 참조해주자

추가로, 쿠버네티스 객체들을 만들기 위해서는 (kubectl 명령 날리는것과 동일) 클러스터 보안그룹에서 내 현재 위치를 443 포트로 허용해주고 있어야 한다.

따라서 해당 보안그룹 세팅도 모듈 속에서 하고 있다면, depends_on을 걸어두자.

 

 

 

 

 

728x90
728x90

댓글