AWS

error: You must be logged in to the server (Unauthorized) 오류 해결

JAEJUNG 2021. 10. 7. 23:07

일반적으로 위 로그는 쿠버네티스 환경에서 만날 수 있는 오류이며, 제 경우에는 EKS 클러스터를 생성한 후 kubectl 명령어로 API Endpoint에 요청을 보낼 때 발생했습니다.

(혹시 다른 케이스가 있다면 댓글 부탁드립니다!)

 

대부분 관련 권한이 없거나 ~/.kube/config 파일이 잘못 구성되었거나 등의 몇 가지 제한된 원인으로 발생하는 이슈로 보여집니다.

아래는 증상별 해결방법을 기재해두었습니다.

 

증상 1. Connection refused

kubectl 명령어 입력 시 아래 오류가 발생합니다.

The connection to the server localhost:8080 was refused - did you specify the right host or port?

 

 

위 증상의 해결방법은 AWS EKS 클러스터 접근을 위한 컨피그 파일을 생성해주어야 합니다.

aws eks --region [클러스터 리전] update-kubeconfig --name [클러스터 이름]

 

명령어를 입력하면 Updated context ~ 문구와 함께 ~/.kube 경로에 config 파일이 생성돼있는 것을 확인하실 수 있습니다.

 

EKS 클러스터를 생성하는 경우 클러스터를 생성하는 IAM 보안 주체(role, user 등)에게는 system:masters 권한이 자동으로 부여되기 때문에 컨피그 파일만 생성해주면 API Endpoint에 정상적으로 요청이 가능합니다.

클러스터 생성자 외 다른 사용자, 역할 등이 클러스터에 액세스하려면 추가 조치가 필요하며 아직 조치를 안했다면 아래 증상 2. 를 만나게 됩니다.

 

증상 2. Unauthorized error

kubectl 명령어 입력 시 아래 오류가 발생합니다.

error: You must be logged in to the server (Unauthorized)

 

 

에러 로그에서 볼 수 있듯이 현재 인증되지 않은 상태이기 때문에 클러스터에 접근할 수 없는 상황입니다.

먼저 제가 시도했던 방법을 설명하겠습니다.

 

1. IAM 역할 할당

우선 Cloud9 인스턴스를 생성한 후 EKS 클러스터에 접근 권한이 없으므로 IAM 역할을 할당해주었습니다.

 

테스트를 위해 현재 eks-test란 역할은 Admin 권한을 할당해준 상태입니다.

 

위 방법을 시도해도 동일하게 Unauthorized 오류가 발생합니다.

결국 Admin 권한을 가지고 있더라도 클러스터 생성자가 아니라면 내부 리소스를 확인할 수 없다는 것을 확인할 수 있습니다.

 

2. aws-auth.yaml 파일 수정

쿠버네티스 클러스터 내부에는 aws-auth라는 configmap이 있습니다.

이는 AWS IAM 사용자 혹은 역할을 kubernetes RBAC에 매핑하기 위한 설정을 정의하는 파일입니다.

클러스터를 생성한 IAM 사용자 혹은 역할에 대한 정보는 최초 aws-auth에 입력되어 액세스가 가능한 것이며 추가 사용자는 해당 configmap에서 정보를 추가해주어야 합니다.

 

아래 명령어를 통해 aws-auth configmap을 수정할 수 있습니다.

kubectl edit -n kube-system configmap/aws-auth

 

아래 코드는 aws 공식 docs에서 가져온 값이며 사용자라면 mapUsers를, 역할이라면 mapRoles 부분을 형식에 맞추어 추가해주면 됩니다.

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::111122223333:role/my-role
      username: system:node:{{EC2PrivateDNSName}}
  mapUsers: |
    - groups:
      - system:masters
      userarn: arn:aws:iam::111122223333:user/admin
      username: admin

 

대부분은 configmap까지 수정해주면 해결됩니다.

 

[부록] credentials 파일 수정

로컬(Windows)에선 컨피그 파일만 생성해주면 kubectl 명령어가 바로 동작했는데, Cloud9에선 해결이 안돼서 로컬과 Cloud9의 파일들을 비교해보았습니다.

그 중 credentials 파일을 수정하여 해결했습니다.

 

로컬에선 credentials 파일이 아래와 같이 설정돼있습니다.

$ cat credentials
[default]
aws_access_key_id = [액세스 키]
aws_secret_access_key = [시크릿 액세스 키]

 

Cloud9에서 aws configure 명령어를 실행한 후에 credentials 파일을 확인해보니 aws_session_token 값이 공란으로 입력돼있었습니다.

아래 'aws_session_token = ' 한 줄을 삭제해주니 kubectl 명령어가 정상적으로 동작했습니다.

mzmz01:~/.aws $ cat credentials 
[default]
aws_access_key_id = [액세스 키]
aws_secret_access_key = [시크릿 액세스 키]
aws_session_token =  # 제거

 

감사합니다.

'AWS' 카테고리의 다른 글

AWS H01_Lesson02  (0) 2021.11.12
AWS H01_Lesson01  (0) 2021.11.10
AWS Fargate  (0) 2021.08.24
EC2와 RDS 서비스를 활용한 Wordpress 구축하기  (0) 2021.08.14
RDS_hands-on  (0) 2021.08.14