Amazon EKS에서 AWS 로드 밸런서 컨트롤러를 사용할 때 "webidentityerr" 오류가 발생하는 이유는 무엇인가요?

3분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)에서 AWS 로드 밸런서 컨트롤러를 사용하려고 할때, “WebIdentityErr”라는 오류 메시지가 표시됩니다.

간략한 설명

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"

이 오류는 다음과 같은 이유로 발생합니다.

  • 서비스 계정 구성이 잘못됨
  • 서비스 계정에서 사용하는 AWS Identity and Access Management(IAM) 역할의 트러스트 관계가 잘못됨

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

해결 방법

서비스 계정 구성이 잘못됨

서비스 계정을 올바르게 구성했는지 확인하려면 다음 단계를 완료하세요.

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

kubectl describe deploy LOAD_BALANCER_CONTROLLER -n kube-system | grep -i "Service Account"

2.    서비스 계정 설명:

kubectl describe sa LOAD_BALANCER_CONTROLLER -n kube-system

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

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxx:role/AMAZON_EKS_LOAD_BALANCER_CONTROLLER_ROLE

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.    V서비스 계정과 연결된 기존 Amazon EKS 포드를 모두 삭제하고 다시 생성합니다. 보안 인증 환경 변수를 적용해야 합니다.

kubectl delete pods AWS_LOAD_BALANCER_CONTROLLER_POD -n KUBBE_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/EKS_CLUSTER_OIDC-PROVIDER_ID"  
      },  
      "Action": "sts:AssumeRoleWithWebIdentity",  
      "Condition": {  
        "StringEquals": {  
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC_PROVIDER_ID:sub": "system:serviceaccount:kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",  
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"  
        }  
      }  
    }  
  ]  
}

**참고:**모든 변수를 고유한 값으로 바꾸어야 합니다.

하나의 계정의 여러 클러스터에 동일한 IAM 역할을 사용하려면 다음 예시와 같이 트러스트 관계를 정의하세요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::AWS-ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC-PROVIDER_ID"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:sub": "system:serviceaccount: kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",
          "oidc.eks.REGION.amazonaws.com/id/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/EKS_CLUSTER_2_OIDC_PROVIDER_ID"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID:sub": "system:serviceaccount: kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

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

올바르게 Amazon EKS 클러스터에 대한 OIDC(OpenID Connect) 공급자를 생성하고 확인하세요. 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/EKS_CLUSTER_1_OIDC_PROVIDER_ID:sub": "system:serviceaccount:kube-system:LOAD_BALANCER_CONTROLLER_ACCOUNT",
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
        }
}

여러 키 또는 값이 있는 IAM 조건에 대한 자세한 내용을 보려면 여러 키 또는 값으로 조건 생성을 참고하세요.

AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음