내용으로 건너뛰기

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

4분 분량
0

서비스 AWS 계정에 대한 AWS Identity and Access Management(IAM) 역할(IRSA)을 사용하려고 합니다. 하지만 Amazon Elastic Kubernetes Service(Amazon EKS) 포드에서 할당된 IAM 역할을 맡을 수 없습니다. 또는 포드가 Amazon EKS 노드에 할당된 기본 IAM 역할을 대신 사용합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

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

아직 없는 경우 클러스터에 대한 IAM OpenID Connect(OIDC) 공급자를 생성합니다. 클러스터에서 IRSA를 사용하려면 OIDC 공급자가 있어야 합니다.

다음 단계를 완료하여 OIDC 공급자를 올바르게 구성했는지 확인하십시오.

  1. IAM 콘솔을 엽니다.
  2. 탐색 창에서 ID 공급자를 선택합니다.
  3. 공급자에서 OIDC 공급자 URL을 식별하고 기록합니다.
  4. 별도의 탭 또는 창에서 Amazon EKS 콘솔을 엽니다.
  5. 탐색 창에서 클러스터를 선택합니다.
  6. 클러스터를 선택한 다음 구성 탭을 선택합니다.
  7. 세부 정보에서 OpenID Connect 공급자 URL의 값을 확인합니다. IAM 콘솔의 OIDC 공급자 URL과 일치하는지 확인하십시오.
  8. URL이 일치하지 않으면 새 IAM OIDC 공급자를 만들어야 합니다.

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

IAM 역할에 필요한 모든 권한이 없을 때 IAM 문제가 발생합니다. 또는 AWS Management Console 또는 AWS CLI를 사용하여 IAM 역할을 만든 경우 IAM 역할의 신뢰 관계 정책에 구문 오류가 있을 수도 있습니다.

IAM 역할 정책을 검증하고 신뢰 정책에서 구문 오류를 확인하려면 다음 단계를 완료하십시오.

  1. IAM 콘솔을 엽니다.
  2. 탐색 창에서 역할을 선택하고, 역할을 선택합니다.
  3. 권한 탭을 선택하고, 구성에 필요한 모든 권한을 역할에 할당했는지 확인합니다.
  4. 신뢰 관계 탭을 선택하고, 신뢰 관계 편집을 선택합니다.
  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",
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    JSON 정책에서 Federated 속성 줄 및 StringEquals 속성 줄의 형식을 확인합니다. Federated의 경우 AWS 리전 코드, AWS 계정 ID 및 고유 OIDC 식별자의 형식을 올바르게 지정했는지 확인하십시오. StringEquals의 경우 리전 코드, OIDC 고유 식별자, Kubernetes 네임스페이스 및 Kubernetes 서비스 계정 이름의 형식을 올바르게 지정했는지 확인하십시오.
  6. 정책 문서를 편집하여 형식 오류를 수정하는 경우 신뢰 정책 업데이트를 선택합니다.

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

다음 단계를 완료합니다.

  1. Kubernetes 서비스 계정이 있는지 확인하려면 다음 명령을 실행합니다.
    kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
    참고: YOUR_ACCOUNT_NAME을 계정 이름으로, YOUR_NAMESPACE를 네임스페이스로 바꾸십시오.
    앞의 명령이 서비스 계정 이름을 반환하지 않으면 서비스 계정을 만듭니다. 자세한 내용은 Kubernetes 웹사이트에서 둘 이상의 ServiceAccount 사용을 참조하십시오.
  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 역할을 맡을 수 있는지 확인합니다. 다음 단계를 완료합니다.

  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 포드에 AWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE 환경 변수가 있는지 확인하려면 다음 명령을 실행합니다.

    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"
    }

    Arn 값을 기록해 두십시오. IAM 역할이 포드에서 사용하려는 역할인지 확인하십시오.

  5. awscli 포드를 삭제하려면 다음 명령을 실행합니다.

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

    참고: YOUR_NAMESPACE를 네임스페이스로 바꾸십시오.

awscli 포드에 올바른 IAM 역할이 표시되면 서비스 계정에 대한 IAM 역할 기능이 올바르게 작동하는 것입니다. 이전 단계에서는 IAM 토큰을 포드에 올바르게 마운트했는지 확인합니다. 애플리케이션에서 여전히 IAM 토큰 파일을 사용할 수 없다면 애플리케이션 또는 SDK 수준에서 문제가 있을 수 있습니다. 예를 들어, 애플리케이션에서 AWS 자격 증명을 사용하는 방식이나 지원되지 않는 SDK 버전과 관련된 문제가 있을 수 있습니다. 자세한 내용은 기본 자격 증명 공급자 체인 사용AWS SDK에서 IRSA 사용을 참조하십시오.

AWS 공식업데이트됨 6달 전