# 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
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
을 걸어두자.
끝
'공부 > IaC' 카테고리의 다른 글
[Terraform] Keycloak Provider 구성하기 (Keycloak 21) (0) | 2023.10.29 |
---|---|
[terraform-provider-kubernetes/Issue] StorageClass ReclaimPolicy 관련 (0) | 2023.09.05 |
[Terraform/k8s] gp2 Storage Class patch (0) | 2023.06.05 |
[Terraform] Plan만 가능한 권한? (0) | 2023.05.15 |
[Terraform/AWS] EC2를 Directory Service에 Seamlessly하게 join시키기 (0) | 2023.01.16 |
댓글