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

최종 업데이트 날짜: 2021년 10월 5일

서비스 계정에 AWS Identity and Access Management(IAM) 역할을 사용하려고 합니다. 하지만 Amazon Elastic Kubernetes Service(Amazon EKS) 포드가 할당된 IAM 역할을 맡지 못합니다. 권한 부여 오류가 표시됩니다. 또는 내 포드가 내 포드에 할당된 IAM 역할 대신 Amazon EKS 노드에 할당된 기본 IAM 역할을 사용하려고 합니다.

간략한 설명

서비스 계정용 IAM 역할 기능을 사용하여 문제를 해결하려면 다음을 시도하세요.

  • Amazon EKS 클러스터에 대한 IAM OpenID Connect(OIDC) 자격 증명 공급자가 있는지 확인합니다.
  • IAM 역할 정책 및 신뢰 정책 구성 검증
  • 서비스 계정이 존재하고 IAM 역할의 ARN에 대해 올바른 형식의 주석이 있는지 확인합니다.
  • 테스트 포드를 사용하여 서비스 계정이 작동하는지 확인

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

해결 방법

Amazon EKS 클러스터에 대한 IAM OIDC 자격 증명 공급자가 있는지 확인합니다.

클러스터에 대한 IAM OIDC 공급자가 아직 없는 경우 IAM OIDC 공급자를 생성합니다. 서비스 계정에 IAM 역할을 사용하려면 클러스터에 대한 OIDC 자격 증명 공급자가 있어야 합니다.

그런 다음 OIDC ID 공급자가 올바르게 구성되었는지 확인합니다.

1.    [IAM 콘솔(IAM console)]을 열고 탐색 창에서 [자격 증명 공급자(Identity providers)]를 선택합니다.

2.    [공급자(Provider)] 열에서 OIDC 공급자 URL을 식별하고 기록해 둡니다.

3.    별도의 탭 또는 창에서 Amazon EKS 콘솔을 연 다음 탐색 창에서 [클러스터(Clusters)]를 선택합니다.

4.    클러스터를 선택한 다음 [구성(Configuration)] 탭을 선택합니다.

5.    [세부 정보(Details)] 섹션에서 [OpenID Connect 공급자 URL(OpenID Connect provider URL)] 속성의 값을 기록해 둡니다.

6.    Amazon EKS 콘솔(5단계)의 OIDC 공급자 URL이 IAM 콘솔(2단계)의 OIDC 공급자 URL과 일치하는지 확인합니다.

Amazon EKS 클러스터의 OIDC 공급자 URL이 IAM 콘솔의 OIDC 공급자 URL과 일치하지 않는 경우 새 IAM OIDC 공급자를 생성해야 합니다.

IAM 역할 정책 및 신뢰 정책 구성 검증

IAM 역할에는 해당 역할에 할당될 것으로 예상되는 전체 권한 범위가 없을 수 있습니다. AWS 관리 콘솔 또는 AWS CLI를 사용하여 IAM 역할을 생성한 경우 IAM 역할의 신뢰 관계 정책에도 구문 오류가 발생할 수 있습니다.

IAM 역할 정책을 검증하고 신뢰 정책에서 구문 오류를 확인하려면 다음을 수행합니다.

1.    IAM 콘솔을 엽니다.

2.    탐색 창에서 [역할(Roles)]을 선택하고 역할을 선택합니다.

3.    역할 페이지에서 [권한(Permissions)] 탭을 선택한 다음 필요한 모든 권한이 역할에 할당되었는지 확인합니다.

4.    [신뢰 관계(Trust Relationships)] 탭을 선택하고 [신뢰 관계 편집(Edit trust relationship)]을 선택합니다.

5.    신뢰 관계에 대한 정책 문서에서 정책의 형식이 다음 JSON 정책의 형식과 일치하는지 확인합니다.

  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::your-account-id:oidc-provider/oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:sub": "system:serviceaccount:your-namespace:your-service-account"
        }
      }
    }
  ]
}

앞의 JSON 정책에서 [페더레이션(Federated)] 속성 줄 및 [StringEquals] 속성 줄의 형식을 검토합니다. [페더레이션(Federated)] 줄에서 AWS 리전 코드(사용자 리전 코드), 계정 ID(사용자 계정 ID) 및 고유한 OIDC 식별자(EXAMPLE_OIDC_IDENTIFIER)의 형식이 올바른지 확인합니다. [StringEquals] 줄에서 리전 코드(사용자 리전 코드), OIDC 고유 식별자(EXAMPLE_OIDC_IDENTIFIER), Kubernetes 네임스페이스(사용자 네임스페이스), Kubernetes 서비스 계정 이름(사용자 네임스페이스)의 형식이 올바르게 지정되었습니다.

6.    정책 문서를 편집하여 서식 오류를 수정하려면 [신뢰 정책 업데이트(Update Trust Policy)]를 선택합니다.

서비스 계정이 존재하고 IAM 역할의 ARN에 대해 올바른 형식의 주석이 있는지 확인합니다.

1.    Kubernetes 서비스 계정이 존재하는지 확인합니다.

$ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

참고: YOUR_ACCOUNT_NAME을 계정 이름으로 바꿉니다. YOUR_NAMESPACE를 네임스페이스로 바꿉니다

앞의 명령이 서비스 계정 이름을 반환하지 않으면, (Kubernetes 웹 사이트에서) 서비스 계정을 생성합니다.

2.    서비스 계정에 예상한 이름이 있고 role-arn 주석의 형식이 올바른지 확인합니다. 예를 들어 다음과 같습니다.

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/my-example-iam-role
  name: my-example-serviceaccount
  namespace: my-test-namespace

테스트 포드를 사용하여 서비스 계정이 작동하는지 확인

테스트 포드를 실행하여 서비스 계정이 올바르게 작동하는지 확인할 수 있습니다. 그런 다음 포드가 환경 변수를 올바르게 탑재할 수 있고 지정된 IAM 역할을 맡을 수 있는지 확인합니다.

참고: 서비스 계정 기능에 대한 IAM 역할이 올바르게 작동하더라도 애플리케이션의 자격 증명과 관련된 문제가 발생할 수 있습니다. 포드에 올바른 환경 변수가 있는 경우에도 이 문제가 발생할 수 있습니다. 이 문제를 방지하기 위해 AWS CLI 컨테이너 이미지를 검증에 사용할 수 있습니다.

1.    awscli-pod.yaml이라는 로컬 YAML 파일을 생성합니다. 예를 들어 다음과 같습니다.

apiVersion: v1
kind: Pod
metadata:
  name: awscli
  labels:
    app: awscli
spec:
  serviceAccountName: YOUR_SERVICE_ACCOUNT
  containers:
  - image: amazon/aws-cli
    command:
      - "sleep"
      - "604800"
    imagePullPolicy: IfNotPresent
    name: awscli
  restartPolicy: Always

참고: YOUR_SERVICE_ACCOUNT를 Kubernetes 서비스 계정 이름으로 바꿉니다.

2.    네임스페이스에 테스트 포드(YAML 파일에서)를 생성합니다.

$ kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE

참고: YOUR_NAMESPACE를 네임스페이스로 바꿉니다.

3.    awscli 포드에 올바른 환경 변수가 있는지 확인합니다.

$ kubectl exec -n YOUR_NAMESPACE awscli env | grep AWS

출력:

AWS_ROLE_ARN=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token

4.    테스트 포드가 올바른 IAM 역할을 사용하고 있는지 확인합니다.

$ kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity

출력:

{
    "UserId": "REDACTEDY471234567890:botocore-session-1632772568",
    "Account": "012345678912",
    "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568"
}

4단계의 명령 출력에서 수신한 IAM 역할 이름(your-iam-role)을 포함한 Arn 값을 기록해 둡니다.

5.    IAM 역할을 확인한 후 awscli 포드를 삭제합니다.

$ kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE

awscli 포드에 올바른 IAM 역할이 표시되면 서비스 계정 기능에 대한 IAM 역할이 올바르게 작동하는 것입니다.

앞의 단계에서는 IAM 토큰이 포드에 올바르게 탑재되었는지 확인합니다. 애플리케이션에서 여전히 토큰 파일을 올바르게 사용할 수 없으면 애플리케이션 또는 SDK 수준에서 문제가 있을 수 있습니다. 이 문제는 애플리케이션이 AWS 자격 증명을 수집한 방식과 관련이 있을 수 있습니다. 자세한 내용은 Boto3 웹 사이트에서 sing the Default Credential Provider ChainCredentials을 참조하세요.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?