Amazon EKS의 AWS SDK 워크로드와 관련된 일반적인 문제를 해결하려면 어떻게 해야 하나요?

4분 분량
0

AWS SDK를 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS)용 컨테이너 애플리케이션을 개발했습니다. AWS 서비스를 호출하려고 하면 오류가 발생합니다.

해결 방법

AWS SDK를 사용하는 컨테이너 애플리케이션을 Amazon EKS 클러스터에 배포할 때 다음 오류 중 하나가 발생할 수 있습니다.

  • NoCredentialsError: 보안 인증을 찾을 수 없음
  • EndpointConnectionError
  • ClientError: 오류 발생(AccessDenied)
  • ClientError: 오류 발생(UnauthorizedOperation)

구체적인 오류 메시지는 애플리케이션에서 사용하는 AWS SDK 프로그래밍 언어에 따라 다릅니다. 오류에 관해서는 다음 문제 해결 단계를 참조하세요.

보안 인증을 찾을 수 없음

Amazon EKS가 포드의 보안 인증을 찾을 수 없는 경우 다음 메시지와 비슷한 오류가 표시됩니다.

"File "/usr/local/lib/python2.7/site-packages/botocore/auth.py", line 315, in add_auth
raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials"

이 오류는 포드의 보안 인증을 구성하지 않았거나, 보안 인증을 올바르게 구성하지 않았거나, AWS SDK 버전이 지원되지 않을 때 발생합니다.

이 오류를 해결하려면 AWS Identity and Access Management(IAM) 역할을 사용하세요. 보통은 애플리케이션에서 또는 Amazon EC2 인스턴스의 역할로 SDK 클라이언트에 대한 AWS 보안 인증을 생성하고 배포합니다. 대신 서비스 계정에 IAM 역할을 사용하도록 포드를 구성합니다. IAM 역할을 Kubernetes 서비스 계정에 연결한 다음, 서비스 계정을 사용하도록 포드를 구성합니다.

중요: 포드의 컨테이너는 OpenID Connect 웹 ID 토큰 파일을 통해 IAM 역할 가정을 지원하는 AWS SDK 버전을 사용해야 합니다.

엔드포인트 URL에 연결할 수 없음

포드가 AWS 서비스 엔드포인트와 통신할 수 없는 경우 다음 메시지와 비슷한 오류가 표시됩니다.

"File "/usr/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 359, in _check_caught_exception
raise caught_exception
botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: "https://ec2.eu-west-1.amazonaws.com/"
botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: "https://sts.eu-west-1.amazonaws.com/""

이 오류를 해결하려면 DNS 문제를 해결하고 다음 사항을 확인합니다.

클러스터에 CoreDNS 포드가 실행 중인지 확인

다음 명령을 실행합니다.

kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o wide

다음 예와 비슷한 출력이 표시됩니다.

NAME                       READY   STATUS    RESTARTS   AGE   IP                NODE                                            NOMINATED NODE   READINESS GATES  
coredns-7f85bf9964-kz8lp   1/1     Running   0          15d   192.168.100.36    ip-192-168-101-156.eu-west-1.compute.internal   <none>           <none>  
coredns-7f85bf9964-wjxvb   1/1     Running   0          15d   192.168.135.215   ip-192-168-143-137.eu-west-1.compute.internal   <none>           <none>

CoreDNS 포드를 올바르게 실행하려면 Amazon EKS 클러스터에 충분한 용량으로 실행 중인 워커 노드가 있어야 합니다.

엔드포인트 테스트 해결 방법

CoreDNS 포드 및 애플리케이션 포드가 포드에서 호출하려는 AWS 서비스 엔드포인트를 확인할 수 있는지 검사합니다. 다음 명령을 실행합니다.

nslookup SERVICE_ENDPOINT  

nslookup ec2.eu-west-1.amazonaws.com  

nslookup ec2.amazonaws.com

참고: SERVICE_ENDPOINT는 오류 메시지에 나온 엔드포인트로 바꾸세요.

AssumeRoleWithWebIdentity 작업을 호출하는 동안 오류(AccessDenied) 발생

포드에서 임시 보안 인증을 요청할 수 없는 경우 다음 메시지와 비슷한 오류가 표시됩니다.

"File "/usr/local/lib/python3.11/site-packages/botocore/client.py", line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity"

이 오류를 해결하려면 다음 단계를 완료합니다.

가정된 IAM 역할 확인

포드가 클러스터에 존재하는 Kubernetes 서비스 계정과 연결된 IAM 역할을 가정하는지 확인합니다. 그렇지 않으면 포드는 Amazon EKS 노드 IAM 역할을 가정합니다. 서비스 계정의 IAM 역할 ARN을 가져오려면 다음 명령을 실행합니다.

kubectl get serviceaccount -A  

kubectl describe serviceaccount serviceaccount_name -n namespace_name | grep -i arn

참고: serviceaccount_namenamespace_name은 사용자 고유 값으로 바꾸세요.

다음 예와 비슷한 출력이 표시됩니다.

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::11112222333:role/AccessEC2role

CloudTrail 이벤트 확인

AssumeRoleWithWebIdentity actionView를 수행하기 위한 액세스가 거부된 IAM ID를 확인합니다. 이렇게 하려면 CloudTrail 콘솔에서 AWS CloudTrail 이벤트를 확인합니다.

  1. CloudTrail 콘솔에 로그인합니다.
  2. 탐색 창에서 이벤트 기록을 선택합니다.
  3. 특성 조회 드롭다운 메뉴에서 선택 항목을 읽기 전용에서 이벤트 이름으로 변경합니다.
  4. 이벤트 이름 입력 검색 표시줄에서 AssumeRoleWithWebIdentity를 입력합니다. 콘텐츠 창에 표시되는 이벤트 목록을 조사합니다. 다음은 거부된 이벤트의 예시입니다.
{  
    "eventVersion": "1.08",  
    "userIdentity": {  
        "type": "WebIdentityUser",  
        "userName": "system:serviceaccount:serverless:aws-sdk"  
    },  
    "eventName": "AssumeRoleWithWebIdentity",  
    "errorCode": "AccessDenied",  
    "errorMessage": "An unknown error occurred",  
    "requestParameters": {  
        "roleArn": "arn:aws:iam::11112222333:role/AccessEC2role",  
        "roleSessionName": "botocore-session-1675698641"  
    }  
}

이 출력에서 roleArn은 포드의 서비스 계정에 대해 구성한 것과 동일한 IAM 역할이어야 합니다.
userName(system:serviceaccount:serverless:aws-sdk)은 서비스 계정 이름 및 해당 네임스페이스와 일치해야 합니다. 이 이름의 형식은 system:serviceaccount:namespace:serviceaccount_name입니다.

포드의 서비스 계정 IAM 역할 구성

IAM 콘솔에서 올바른 IAM 신뢰 정책 문으로 포드의 서비스 계정 IAM 역할을 구성합니다:

     {  
            "Effect": "Allow",  
            "Principal": {  
                "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD"  
            },  
            "Action": "sts:AssumeRoleWithWebIdentity",  
            "Condition": {  
                "StringEquals": {  
                    "oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD:sub": "system:serviceaccount:namespace_name:serviceaccount_name",  
                    "oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD:aud": "sts.amazonaws.com"  
                }  
            }  
    }     

참고: region_code, ACCOUNT_ID, EXAMPLE11111122222333334444ABCD, serviceaccount_namenamespace_name은 사용자 고유 값으로 바꾸세요.

오류 발생(UnauthorizedOperation)

포드의 서비스 계정에 대해 구성한 IAM 역할에 다른 AWS 서비스를 호출할 권한이 없을 수 있습니다. 이 경우 다음 메시지와 비슷한 오류가 표시됩니다.

File "/usr/local/lib/python3.11/site-packages/botocore/client.py", line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: DescribeInstances 작업을 호출하는 동안 오류(UnauthorizedOperation) 발생: 이 작업을 수행할 권한이 없습니다.

이 오류를 해결하려면 다음 단계를 완료합니다.

  1. 포드가 Kubernetes 서비스 계정과 연결된 IAM 역할을 가정하는지 확인합니다. 이를 수행하려면 이전 섹션 가정된 IAM 역할 확인을 참조하세요. 이 단계에서 반환하는 역할 ARN을 기록해두세요.
  2. IAM 콘솔을 엽니다. 탐색 창에서 역할을 선택합니다. 그런 다음 1단계의 역할 ARN을 검색하고 선택합니다.
  3. 권한 탭에서 필요한 IAM 정책 권한을 IAM 역할에 연결합니다.

예시 포드는 GitHub에서 웹 페더레이션 ID 제공업체를 보안 인증 제공업체로 사용하여 AWS Python SDK를 실행하는 샘플 포드를 참조하세요.

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

관련 콘텐츠