Kubernetes 서비스 계정에 IAM 역할 할당

Kubernetes 서비스 계정에 IAM 역할 할당

Kubernetes 서비스 계정이 AWS Identity and Access Management(IAM) 역할을 수임하도록 구성하는 방법을 설명합니다. 해당 서비스 계정을 사용하도록 구성된 모든 Pod는 역할이 액세스 권한을 가진 모든 AWS 서비스에 액세스할 수 있습니다.

출처: 문서

본문

전제 조건

  • 기존 클러스터. 없다면 "Amazon EKS 시작하기"의 안내 중 하나를 따라 생성할 수 있습니다.
  • 클러스터용 기존 IAM OpenID Connect(OIDC) 공급자. 이미 있는지 확인하거나 생성하는 방법은 "클러스터용 IAM OIDC 공급자 생성"을 참고하세요.
  • 사용 기기나 AWS CloudShell에 버전 2.12.3 이상 또는 버전 1.27.160 이상의 AWS Command Line Interface(AWS CLI)가 설치되어 구성되어 있어야 합니다. 현재 버전을 확인하려면 aws --version | cut -d / -f2 | cut -d ' ' -f1을 사용하세요. yum, apt-get, macOS용 Homebrew 같은 패키지 관리자는 AWS CLI 최신 버전보다 몇 버전 뒤처져 있는 경우가 많습니다. 최신 버전 설치 방법은 AWS Command Line Interface 사용 설명서의 "Installing" 및 "aws configure를 사용한 빠른 구성"을 참고하세요. AWS CloudShell에 설치된 AWS CLI 버전도 최신 버전보다 몇 버전 뒤처져 있을 수 있습니다. 업데이트 방법은 AWS CloudShell 사용 설명서의 "홈 디렉터리에 AWS CLI 설치"를 참고하세요.
  • 사용 기기나 AWS CloudShell에 kubectl 명령줄 도구가 설치되어 있어야 합니다. 버전은 클러스터의 Kubernetes 버전과 같거나 최대 한 개의 부 버전 앞뒤가 될 수 있습니다. 예를 들어 클러스터 버전이 1.29라면 kubectl 버전 1.28, 1.29, 1.30을 사용할 수 있습니다. kubectl 설치 또는 업그레이드 방법은 "kubectl 및 eksctl 설정"을 참고하세요.
  • 클러스터 구성이 포함된 기존 kubectl config 파일. kubectl config 파일을 만들려면 "kubeconfig 파일을 만들어 kubectl을 EKS 클러스터에 연결"을 참고하세요.

1단계: IAM 정책 생성

IAM 역할에 기존 IAM 정책을 연결하려면 다음 단계로 건너뛰세요.

IAM 정책을 생성합니다. 직접 정책을 만들거나, 이미 필요한 권한 중 일부를 부여하는 AWS 관리형 정책을 복사해 특정 요구 사항에 맞게 사용자 지정할 수 있습니다. 자세한 내용은 IAM 사용 설명서의 "IAM 정책 생성"을 참고하세요.

Pod가 액세스하려는 AWS 서비스의 권한이 포함된 파일을 생성합니다. 모든 AWS 서비스의 모든 작업 목록은 Service Authorization Reference를 참고하세요.

다음 명령을 실행해 Amazon S3 버킷에 대한 읽기 전용 액세스를 허용하는 예제 정책 파일을 생성할 수 있습니다. 선택적으로 이 버킷에 구성 정보나 부트스트랩 스크립트를 저장하고, Pod의 컨테이너가 버킷에서 파일을 읽어 애플리케이션에 로드할 수 있습니다. 이 예제 정책을 생성하려면 다음 내용을 기기에 복사하고, my-pod-secrets-bucket을 버킷 이름으로 바꾼 다음 명령을 실행하세요.

{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
        }
    ]
}

IAM 정책을 생성합니다.

aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json

2단계: IAM 역할 생성 및 연결

IAM 역할을 생성해 Kubernetes 서비스 계정과 연결합니다. eksctl 또는 AWS CLI를 사용할 수 있습니다.

역할 생성 및 연결 (eksctl)

이 eksctl 명령은 지정된 네임스페이스에 Kubernetes 서비스 계정을 생성하고, 지정된 이름의 IAM 역할을 생성하고(없는 경우), 기존 IAM 정책 ARN을 역할에 연결하고, IAM 역할 ARN으로 서비스 계정에 주석을 답니다. 이 명령의 샘플 자리 표시자 값을 반드시 특정 값으로 바꾸세요. eksctl 설치 또는 업데이트 방법은 eksctl 문서의 "Installation"을 참고하세요.

eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \
    --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve

중요: 역할이나 서비스 계정이 이미 존재하면 이전 명령이 실패할 수 있습니다. 그런 상황에서는 eksctl이 제공하는 다른 옵션이 있습니다. 자세한 내용은 eksctl create iamserviceaccount --help를 실행하세요.

역할 생성 및 연결 (AWS CLI)

IAM 역할을 수임할 기존 Kubernetes 서비스 계정이 있다면 이 단계를 건너뛸 수 있습니다.

Kubernetes 서비스 계정을 생성합니다. 다음 내용을 기기에 복사합니다. my-service-account를 원하는 이름으로, 필요에 따라 default를 다른 네임스페이스로 바꾸세요. default를 변경하는 경우 해당 네임스페이스가 이미 존재해야 합니다.

cat >my-service-account.yaml Authenticate to another account with IRSA for more information.

역할의 신뢰 관계를 정의하는 IAM 신뢰 정책을 만듭니다. $oidc_provider를 OIDC 공급자 URL로, $namespace를 서비스 계정의 네임스페이스로, $service_account를 서비스 계정 이름으로 바꾸세요.

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::123456789012:oidc-provider/$oidc_provider"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "$oidc_provider:aud": "sts.amazonaws.com",
          "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
        }
      }
    }
  ]
}

역할을 생성합니다. my-role을 IAM 역할 이름으로, my-role-description을 역할 설명으로 바꾸세요.

aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"

역할에 IAM 정책을 연결합니다. my-role을 IAM 역할 이름으로, my-policy를 직접 생성한 기존 정책 이름으로 바꾸세요.

aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy

서비스 계정이 수임하기를 원하는 IAM 역할의 Amazon Resource Name(ARN)으로 서비스 계정에 주석을 답니다. my-role을 기존 IAM 역할 이름으로 바꾸세요. 이전 단계에서 클러스터가 있는 AWS 계정과 다른 계정의 역할이 이 역할을 수임하도록 허용했다면, 다른 계정의 AWS 계정과 역할을 지정해야 합니다. 자세한 내용은 "IRSA로 다른 계정에 인증"을 참고하세요.

kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role

(선택 사항) 서비스 계정의 AWS Security Token Service 엔드포인트를 구성합니다. AWS는 전역 엔드포인트 대신 리전별 AWS STS 엔드포인트를 사용할 것을 권장합니다. 이렇게 하면 지연 시간이 줄고, 기본 제공 중복성을 제공하며, 세션 토큰 유효 기간이 늘어납니다.

3단계: 구성 확인

IAM 역할의 신뢰 정책이 올바르게 구성되었는지 확인합니다.

aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

예제 출력은 다음과 같습니다.

{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account",
                    "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

이전 단계에서 역할에 연결한 정책이 역할에 연결되어 있는지 확인합니다.

aws iam list-attached-role-policies --role-name my-role --query "AttachedPolicies[].PolicyArn" --output text

예제 출력은 다음과 같습니다.

arn:aws:iam::111122223333:policy/my-policy

사용할 정책의 Amazon Resource Name(ARN)을 저장하는 변수를 설정합니다. my-policy를 권한을 확인할 정책 이름으로 바꾸세요.

export policy_arn=arn:aws:iam::111122223333:policy/my-policy

정책의 기본 버전을 봅니다.

aws iam get-policy --policy-arn $policy_arn

예제 출력은 다음과 같습니다.

{
    "Policy": {
        "PolicyName": "my-policy",
        "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
        "Arn": "arn:aws:iam::111122223333:policy/my-policy",
        "Path": "/",
        "DefaultVersionId": "v1",
        [...]
    }
}

Pod에 필요한 모든 권한이 정책에 포함되어 있는지 정책 내용을 확인합니다. 필요하면 다음 명령의 1을 이전 출력에서 반환된 버전으로 바꾸세요.

aws iam get-policy-version --policy-arn $policy_arn --version-id v1

예제 출력은 다음과 같습니다.

{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-pod-secrets-bucket"
        }
    ]
}

이전 단계에서 예제 정책을 생성했다면 출력이 동일합니다. 다른 정책을 만들었다면 example 내용이 다릅니다.

Kubernetes 서비스 계정에 역할이 주석으로 달렸는지 확인합니다.

kubectl describe serviceaccount my-service-account -n default

예제 출력은 다음과 같습니다.

Name:                my-service-account
Namespace:           default
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
Image pull secrets:
Mountable secrets:   my-service-account-token-qqjfl
Tokens:              my-service-account-token-qqjfl
[...]

다음 단계

  • Pod가 Kubernetes 서비스 계정을 사용하도록 구성

더 알아보기 (Learn more)