Amazon EKS에서 IRSA 오류를 해결하려면 어떻게 해야 하나요?

5분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)에서 서비스 계정을 위한 AWS Identity and Access Management(IAM)(IRSA) 역할을 사용하면 오류가 발생합니다.

해결 방법

IAM ARN의 형식 확인

서비스 계정 주석에 IAM ARN 형식을 잘못 지정한 경우 다음과 같은 오류가 발생합니다.

"An error occurred (ValidationError) when calling the AssumeRoleWithWebIdentity
operation: Request ARN is invalid"

다음은 잘못된 형식의 ARN 예제입니다.

eks.amazonaws.com/role-arn: arn:aws:iam::::1234567890:role/example

ARN에 추가 콜론(:)이 있기 때문에 ARN의 형식이 잘못되면 오류 메시지가 발생합니다. 올바른 ARN 형식을 확인하려면 IAM ARN을 참조하세요.

AWS 계정에 대한 IAM OIDC 공급자가 있는지 확인

OpenID Connect(OIDC) 공급자를 생성하지 않은 경우 다음과 같은 오류가 발생합니다.

"An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: No OpenIDConnect provider found in your account for https://oidc.eks.region.amazonaws.com/id/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

이 문제를 해결하려면 IAM OIDC 공급자 URL을 가져오세요.

aws eks describe-cluster --name cluster name --query "cluster.identity.oidc.issuer" --output text

참고: 클러스터 이름을 해당 클러스터 이름으로 바꿉니다.

출력은 다음 예제와 비슷합니다.

https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

IAM OIDC 공급자를 나열하려면 다음 명령을 실행합니다.

aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E

참고: EXAMPLED539D4633E53DE1B716D3041E 을 IAM OIDC 공급자 URL로 바꾸세요.

OIDC 공급자가 없는 경우, 다음 eksctl 명령을 실행하여 OIDC 공급자를 생성합니다.

eksctl utils associate-iam-oidc-provider --cluster cluster name --approve

참고: 클러스터 이름을 해당 클러스터 이름으로 바꿉니다.

또한 AWS Management Console을 사용하여 클러스터에 대한 IAM OIDC 공급자를 생성할 수도 있습니다.

IAM OIDC 공급자의 대상 확인

IAM OIDC 공급자를 생성할 때 sts.amazonaws.com을 대상으로 사용해야 합니다. 대상이 올바르지 않으면 다음 오류가 발생합니다.

"An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience"

IAM OIDC 공급자의 대상을 확인하려면 다음 명령을 실행합니다.

aws iam get-open-id-connect-provider --open-id-connect-provider-arn ARN-of-OIDC-provider

참고: ARN-of-OIDC-provider를 OIDC 공급자의 ARN으로 바꿉니다.

**ClientIDList ** 파라미터 아래에 출력에 sts.amazonaws.com이 표시되어야 합니다. Amazon EKS 콘솔을 사용하여 대상을 확인하려면 다음 단계를 완료합니다.

  1. Amazon EKS 콘솔을 엽니다.
  2. 클러스터 이름을 선택한 다음 개요 탭을 선택합니다.
  3. 세부 정보 섹션에서 OIDC 공급자 URL의 값을 기록합니다.
  4. IAM 콘솔을 엽니다.
  5. 탐색 창의 액세스 관리에서 자격 증명 공급자를 선택합니다.
  6. 클러스터의 URL과 일치하는 공급자를 선택합니다.

대상을 변경하려면 다음 단계를 완료합니다.

  1. IAM 콘솔을 엽니다.
  2. 탐색 창의 액세스 관리에서 자격 증명 공급자를 선택합니다.
  3. 클러스터의 URL과 일치하는 공급자를 선택합니다.
  4. 작업을 선택한 다음 대상 추가를 선택합니다.
  5. sts.amazonaws.com을 추가합니다.

루트 인증서 지문을 사용하여 IAM OIDC 리소스를 생성했는지 확인합니다.

루트 인증서 지문을 사용하여 OIDC 공급자를 생성하지 않은 경우 다음 오류가 발생합니다.

"An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint"

참고: 루트가 아닌 인증서 지문은 매년 갱신됩니다. 루트 인증서 지문은 10년마다 갱신됩니다. IAM OIDC를 만들 때 루트 인증서 지문을 사용하는 것이 모범 사례입니다.

예를 들어, 다음 서비스 중 하나를 사용하여 IAM OIDC를 생성했다고 가정해 보겠습니다.

  • AWS Command Line Interface(AWS CLI)
  • AWS Tools for PowerShell
  • IAM API

이 경우 수동으로 지문을 획득해야 합니다. IAM 콘솔에서 IAM OIDC를 생성한 경우 수동으로 지문을 가져오는 것이 모범 사례입니다. 이 지문을 사용하여 콘솔이 올바른 IAM OIDC를 획득했는지 확인하세요.

루트 인증서 지문과 만료 날짜를 찾으려면 다음 명령을 실행합니다.

echo | openssl s_client -servername oidc.eks.your-region-code.amazonaws.com -showcerts -connect oidc.eks.your-region-code.amazonaws.com:443 2>/dev/null | awk '/-----BEGIN CERTIFICATE-----/{cert=""} {cert=cert $0 "\n"} /-----END CERTIFICATE-----/{last_cert=cert} END{printf "%s", last_cert}' | openssl x509 -fingerprint -noout -dates | sed 's/://g' | awk -F= '{print tolower($2)}'

참고: your-region-code를 클러스터가 위치한 AWS 리전으로 바꿉니다.

출력 예시:

9e99a48a9960b14926bb7f3b02e22da2b0ab7280 sep 2 000000 2009 gmt jun 28 173916 2034 gmt

앞의 출력에서 9e99a48a9960b14926bb7f3b02e22da2b0ab7280은 지문, sep 2 000000 2009 GMT는 인증서 시작 날짜, jun 28 173916 2034은 인증서 만료 날짜입니다.

IAM 역할의 신뢰 정책 구성 확인

IAM 역할의 신뢰 정책을 잘못 구성한 경우 다음 오류가 발생합니다.

"An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity"

이 문제를 해결하려면 올바른 IAM OIDC 공급자를 사용해야 합니다. IAM OIDC 공급자가 올바른 경우 IAM 역할을 검토하여 신뢰 정책의 조건이 올바르게 구성되었는지 확인합니다.

Pod Identity 웹후크 구성이 존재하고 유효한지 확인하세요.

Pod Identity 웹훅은 필요한 환경 변수와 예상 볼륨을 주입합니다. 실수로 웹후크 구성을 삭제하거나 변경한 경우 IRSA가 작동을 멈춥니다.

웹후크 구성이 존재하고 유효한지 확인하려면 다음 명령을 실행하세요.

kubectl get mutatingwebhookconfiguration pod-identity-webhook  -o yaml

pod-identity-webhook 구성이 존재하지 않는 경우 다음 명령을 실행하여 구성하세요.

CLUSTER_CA=$(aws eks describe-cluster --name CLUSTER_NAME --region REGION_CODE --query 'cluster.certificateAuthority.data' --output text);
cat << EOF | kubectl apply -f -
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: pod-identity-webhook
webhooks:
- name: iam-for-pods.amazonaws.com
  clientConfig:
    url: "https://127.0.0.1:23443/mutate"
    caBundle: $CLUSTER_CA
  failurePolicy: Ignore
  rules:
  - operations: [ "CREATE" ]
    apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
    scope: "*"
  reinvocationPolicy: IfNeeded
  sideEffects: None
  admissionReviewVersions: ["v1beta1"]
EOF

참고: CLUSTER_NAME을 클러스터 이름으로 바꾸고 REGION_CODE를 클러스터 리전으로 바꿉니다.

Pod Identity 웹후크가 IRSA를 사용하는 포드에 환경 변수를 주입하고 있는지 확인합니다.

Pod Identity 웹북이 IRSA를 사용하는 포드에 환경 변수를 주입하는지 확인하려면 다음 명령 중 하나를 실행하세요.

kubectl get pod <pod-name> -n <ns> -o yaml | grep aws-iam-token

-또는-

kubectl get pod <pod-name> -n <ns> -o yaml | grep AWS_WEB_IDENTITY_TOKEN_FILE

지원되는 AWS SDK를 사용하고 있는지 확인

AWS SDK를 검토합니다. OIDC 웹 자격 증명 토큰 파일을 통해 IAM 역할을 맡을 수 있는 AWS SDK 버전을 사용해야 합니다.

관련 정보

Amazon EKS 포드에서 서비스 계정에 IAM 역할을 사용할 수 없는 이유는 무엇인가요?

Amazon EKS에서 OIDC 공급자 및 IRSA 문제를 해결하려면 어떻게 해야 하나요?

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