Amazon EKS에서 AWS 로드 밸런서 컨트롤러를 사용할 때 “webidentityerr” 오류가 발생하는 이유는 무엇입니까?

3분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)에서 AWS 로드 밸런서 컨트롤러를 사용하려고 하면 다음과 같은 오류 메시지가 나타납니다. "failed to find existing LoadBalancer due to WebIdentityErr: failed to retrieve credentials\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403"

간략한 설명

Amazon EKS에서 AWS 로드 밸런서 컨트롤러를 사용할 때 다음과 같은 이유로 이러한 오류가 발생합니다.

  • 잘못된 서비스 계정 구성
  • 서비스 계정에 사용된 AWS Identity and Access Management(IAM) 역할의 신뢰 관계가 잘못되었습니다

AWS 로드 밸런서 컨트롤러를 사용하면 작업자 노드가 작업을 수행합니다. 이러한 작업자 노드에는 IAM 권한을 사용하여 AWS Application Load Balancer 또는 AWS Network Load Balancer 리소스에 대한 액세스 권한이 부여되어야 합니다. 서비스 계정의 IAM 역할을 사용하여 IAM 권한을 설정할 수 있습니다. 또는 IAM 권한을 워커 노드의 IAM 역할에 직접 연결할 수 있습니다. 자세한 내용은 Kubernetes 웹사이트에서로드 밸런서 컨트롤러 설치 단원을 참조하세요.

해결 방법

잘못된 서비스 계정 구성

서비스 계정 구성이 올바르게 구성되었는지 확인하려면 다음 단계를 수행하십시오.

1.    배포에 정의된 서비스 계정 이름을 확인합니다.

kubectl describe deploy <aws-load-balancer-controller> -n kube-system | grep -i "Service Account"

2.    서비스 계정을 설명합니다.

kubectl describe sa <aws-load-balancer-controller> -n kube-system

3.    IAM 역할에 대한 서비스 계정 주석을 확인합니다.

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxx:role/<AmazonEKSLoadBalancerControllerRole>

4.    이 주석이 누락되었거나 올바르지 않은 경우 주석을 업데이트합니다. IAM 역할의 서비스 계정 연결이 올바른지 확인합니다.

kubectl annotate serviceaccount -n <SERVICE_ACCOUNT_NAMESPACE> <SERVICE_ACCOUNT_NAME> \ eks.amazonaws.com/role-arn=arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>

5.    서비스 계정과 연결된 기존 Amazon EKS 포드를 삭제하고 다시 생성합니다. 자격 증명 환경 변수를 적용해야 합니다.

kubectl delete pods <aws-loadbalancer-controller-pod> -n <kube-system>

사용된 IAM 역할과 서비스 계정 간의 잘못된 신뢰 관계

다음 예시에서는 IAM 역할과 서비스 계정 간 신뢰 관계를 설정할 때 발생할 수 있는 몇 가지 일반적인 실수를 보여 줍니다.

예시 1: "sts:AssumeRoleWithWebIdentity" 작업에 대해 IAM 역할 또는 신뢰 관계가 제대로 정의되지 않음

sts:AssumeRoleWithWebIdentity 작업(sts:AssumeRole 작업이 아님)에 대하여 신뢰 관계가 올바르게 정의되어 있는지 확인합니다.

다음은 제대로 정의되지 않은 신뢰 관계의 예시입니다.

{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "xxxxx.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
}

신뢰 관계를 수정하려면 sts:AssumeRoleWithWebIdentity 작업에 대한 신뢰 관계를 정의해야 합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>"
        }
      }
    }
  ]
}

참고: 모든 변수를 사용자 고유한 값으로 바꾸십시오.

한 계정의 여러 클러스터에 동일한 IAM 역할을 사용하려면 다음과 비슷한 신뢰 관계를 정의하십시오.

{
 "Version": "2012-10-17",
 "Statement": [{
   "Effect": "Allow",
   "Principal": {
    "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
            "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-1-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
                                }
   }
  },
  {
   "Effect": "Allow",
   "Principal": {
    "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Prob>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
                                        "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-2-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
    }
   }
  }
 ]
}

예시 2: Amazon EKS 클러스터를 생성할 때 OIDC 공급자 ID가 잘못됨

Amazon EKS 클러스터에 대한 OIDC 공급자를 올바르게 생성 및 검증해야 합니다. OIDC 공급자 ID 및 연결된 AWS 리전이 올바르게 나열되어 있는지 확인합니다. 그렇지 않으면 WebIdentityErr 오류가 발생합니다.

예 3: 서비스 계정 이름 또는 해당 네임스페이스가 올바르게 입력되지 않았습니다.

AWS 로드 밸런서 컨트롤러 배포를 업데이트할 때 올바른 서비스 계정 이름과 네임스페이스를 입력해야 합니다.

예시 4: 트러스트 관계에서 “sts.amazonaws.com” 단계가 누락됨

EKS 포드와 연결된 서비스 역할이 AssumeRoleWithWebIdentity 작업에 대해 STS 작업을 수행할 수 없는 경우, 신뢰 관계를 업데이트합니다. STS 작업을 수행하려면 신뢰 관계에 “sts.amazonaws.com”이 포함되어야 합니다.

예를 들어, 다음과 같습니다.

"Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>",
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
        }
}

여러 키 또는 값이 있는 IAM 조건에 대한 자세한 내용은 여러 키 또는 값으로 조건 생성 단원을 참조하세요.


AWS 공식
AWS 공식업데이트됨 3달 전