EKS Pod Identity 대상 IAM 역할(Target IAM Role)로 AWS 리소스 액세스

EKS Pod Identity 대상 IAM 역할(Target IAM Role)로 AWS 리소스 액세스

EKS Pod Identity를 사용해 다른 AWS 계정의 AWS 리소스에 액세스하는 크로스 계정 액세스를 구성하는 방법을 설명합니다.

출처: 문서

본문

Amazon Elastic Kubernetes Service(Amazon EKS)에서 애플리케이션을 실행할 때 다른 AWS 계정에 존재하는 AWS 리소스에 액세스해야 할 수 있습니다. 이 안내서는 EKS Pod Identity를 사용해 크로스 계정 액세스를 설정하는 방법을 보여줍니다. 이를 통해 Kubernetes Pod가 대상 역할(target role)을 사용해 다른 AWS 리소스에 액세스할 수 있습니다.

전제 조건

시작하기 전에 다음 단계를 완료했는지 확인하세요.

  • Amazon EKS Pod Identity Agent 설정
  • EKS Pod Identity 역할 생성

작동 방식

Pod Identity는 역할 연결(role chaining)이라는 프로세스를 통해 EKS 클러스터의 애플리케이션이 계정 간 AWS 리소스에 액세스할 수 있게 합니다.

Pod Identity 연결을 만들 때 두 개의 IAM 역할을 제공할 수 있습니다: EKS 클러스터와 같은 계정의 EKS Pod Identity 역할과, 액세스하려는 AWS 리소스(예: S3 버킷 또는 RDS 데이터베이스)가 있는 계정의 대상 IAM 역할입니다. IAM PassRole 요구 사항 때문에 EKS Pod Identity 역할은 EKS 클러스터 계정에 있어야 하는 반면, 대상 IAM 역할은 모든 AWS 계정에 있을 수 있습니다. PassRole은 AWS 엔티티가 역할 수임을 다른 서비스에 위임할 수 있게 합니다. EKS Pod Identity는 PassRole을 사용해 역할을 Kubernetes 서비스 계정에 연결하며, 역할과 이를 전달하는 ID가 모두 EKS 클러스터와 같은 AWS 계정에 있어야 합니다. 애플리케이션 Pod가 AWS 리소스에 액세스해야 할 때 Pod Identity에 자격 증명을 요청합니다. 그러면 Pod Identity가 두 번의 역할 수임을 순서대로 자동 수행합니다: 먼저 EKS Pod Identity 역할을 수임한 다음, 그 자격 증명을 사용해 대상 IAM 역할을 수임합니다. 이 과정은 대상 역할에 정의된 권한을 가진 임시 자격 증명을 Pod에 제공하여 다른 AWS 계정의 리소스에 안전하게 액세스할 수 있게 합니다.

캐싱 고려 사항

캐싱 메커니즘 때문에 기존 Pod Identity 연결에서 IAM 역할에 대한 업데이트가 EKS 클러스터에서 실행 중인 Pod에 즉시 반영되지 않을 수 있습니다. Pod Identity Agent는 자격 증명을 가져올 당시의 연결 구성에 따라 IAM 자격 증명을 캐시합니다. 연결에 EKS Pod Identity 역할만 포함되고 대상 IAM 역할이 없다면 캐시된 자격 증명은 6시간 동안 지속됩니다. 연결에 EKS Pod Identity 역할 ARN과 대상 IAM 역할이 모두 포함되면 캐시된 자격 증명은 59분 동안 지속됩니다. EKS Pod Identity 역할 ARN 업데이트, 대상 IAM 역할 추가, 연결의 세션 정책 업데이트 같은 기존 연결 수정은 기존 캐시를 재설정하지 않습니다. 따라서 에이전트는 캐시된 자격 증명이 새로고침될 때까지 업데이트를 인식하지 못합니다. 변경 사항을 더 빨리 적용하려면 기존 Pod를 다시 생성할 수 있습니다. 그렇지 않으면 캐시가 만료될 때까지 기다려야 합니다.

1단계: 대상 IAM 역할 생성 및 연결

이 단계에서는 대상 IAM 역할을 생성하고 구성해 안전한 신뢰 체인을 구축합니다. 데모를 위해 새 대상 IAM 역할을 생성하여 두 AWS 계정 사이의 신뢰 체인을 구축합니다: EKS 클러스터가 있는 AWS 계정의 EKS Pod Identity 역할(예: eks-pod-identity-primary-role)이 대상 계정의 대상 IAM 역할(예: eks-pod-identity-aws-resources)을 수임할 권한을 얻어 Amazon S3 버킷 같은 AWS 리소스에 액세스할 수 있게 합니다.

대상 IAM 역할 생성

  1. Amazon IAM 콘솔을 엽니다.
  2. 상단 탐색 표시줄에서 대상 IAM 역할의 AWS 리소스(예: S3 버킷 또는 DynamoDB 테이블)가 있는 계정에 로그인되어 있는지 확인합니다.
  3. 왼쪽 탐색 창에서 Roles를 선택합니다.
  4. Create role 버튼을 선택한 다음 "Trusted entity type" 아래에서 AWS account를 선택합니다.
  5. Another AWS account를 선택하고 AWS 계정 번호(EKS Pod Identity 역할이 있는 계정)를 입력한 다음 Next를 선택합니다.
  6. 역할과 연결하려는 권한 정책(예: AmazonS3FullAccess)을 추가한 다음 Next를 선택합니다.
  7. MyCustomIAMTargetRole 같은 역할 이름을 입력한 다음 Create role을 선택합니다.

대상 IAM 역할 신뢰 정책 업데이트

역할을 생성하면 Roles 목록으로 돌아갑니다. 이전 단계에서 생성한 새 역할(예: MyCustomIAMTargetRole)을 찾아 선택합니다.

  1. Trust relationships 탭을 선택합니다.
  2. Edit trust policy를 선택합니다.
  3. 정책 편집기에서 기본 JSON을 신뢰 정책으로 바꿉니다. IAM 역할 ARN의 역할 이름과 111122223333 자리 표시자 값을 EKS 클러스터를 호스팅하는 AWS 계정 ID로 바꾸세요. 또한 역할 신뢰 정책에서 PrincipalTags를 선택적으로 사용해 특정 클러스터와 네임스페이스의 특정 서비스 계정만 대상 역할을 수임하도록 승인할 수 있습니다. 예:
{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/eks-cluster-arn": "arn:aws:eks:us-east-1:111122223333:cluster/example-cluster",
          "aws:RequestTag/kubernetes-namespace": "ExampleNameSpace",
          "aws:RequestTag/kubernetes-service-account": "ExampleServiceAccountName"
        },
        "ArnEquals": {
          "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role"
        }
      }
    }
  ]
}

위 정책은 AWS 계정 111122223333의 역할 eks-pod-identity-primary-role이 관련 EKS Pod Identity 세션 태그와 함께 이 역할을 수임하도록 허용합니다.

EKS Pod Identity에서 세션 태그를 비활성화했다면, EKS Pod Identity는 대상 역할을 수임할 때 Pod의 클러스터, 네임스페이스, 서비스 계정 정보로 sts:ExternalId도 설정합니다.

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "region/111122223333/cluster-name/namespace/service-account-name"
        },
        "ArnEquals": {
          "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:TagSession"
    }
  ]
}

위 정책은 예상하는 클러스터, 네임스페이스 및 서비스 계정만 대상 역할을 수임할 수 있도록 보장하는 데 도움이 됩니다.

EKS Pod Identity 역할의 권한 정책 업데이트

이 단계에서는 Amazon EKS 클러스터와 연결된 EKS Pod Identity 역할의 권한 정책에 대상 IAM 역할 ARN을 리소스로 추가해 업데이트합니다.

  1. Amazon EKS 콘솔을 엽니다.
  2. 왼쪽 탐색 창에서 Clusters를 선택하고 EKS 클러스터의 이름을 선택합니다.
  3. Access 탭을 선택합니다.
  4. Pod Identity associations에서 EKS Pod Identity 역할을 선택합니다.
  5. Permissions, Add permissions를 선택한 다음 Create inline policy를 선택합니다.
  6. JSON을 선택합니다.
  7. 정책 편집기에서 기본 JSON을 권한 정책으로 바꿉니다. IAM 역할 ARN의 역할 이름과 222233334444 자리 표시자 값을 대상 IAM 역할로 바꾸세요. 예:
{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ],
            "Resource": "arn:aws:iam::222233334444:role/eks-pod-identity-aws-resources"
        }
    ]
}

2단계: 대상 IAM 역할을 Kubernetes 서비스 계정에 연결

이 단계에서는 EKS 클러스터의 Kubernetes 서비스 계정과 대상 IAM 역할 사이의 연결을 만듭니다.

  1. Amazon EKS 콘솔을 엽니다.
  2. 왼쪽 탐색 창에서 Clusters를 선택하고 연결을 추가할 클러스터의 이름을 선택합니다.
  3. Access 탭을 선택합니다.
  4. Pod Identity associations에서 Create를 선택합니다.
  5. IAM role에서 워크로드가 수임할 EKS Pod Identity 역할을 선택합니다.
  6. Target IAM role에서 EKS Pod Identity 역할이 수임할 대상 IAM 역할을 선택합니다.
  7. Kubernetes namespace 필드에 연결을 만들 네임스페이스 이름(예: my-app-namespace)을 입력합니다. 이 값은 서비스 계정이 있는 위치를 정의합니다.
  8. Kubernetes service account 필드에 IAM 자격 증명을 사용할 서비스 계정 이름(예: my-service-account)을 입력합니다. 이렇게 하면 IAM 역할이 서비스 계정에 연결됩니다.
  9. (선택 사항) Disable session tags를 선택해 Pod Identity가 역할을 수임할 때 자동으로 추가하는 기본 세션 태그를 비활성화합니다.
  10. (선택 사항) Configure session policy를 토글해 대상 IAM 역할에 연결된 IAM 정책에 정의된 권한을 넘어 이 Pod Identity 연결에 추가 제한을 적용하는 IAM 정책을 구성합니다.

참고: 1. 세션 정책은 Disable session tags 설정이 선택된 경우에만 적용할 수 있습니다. 2. 세션 정책을 지정하면 정책 제한은 이 Pod Identity 연결과 연결된 IAM 역할이 아니라 대상 IAM 역할의 권한에 적용됩니다.

  1. Create를 선택해 연결을 만듭니다.

더 알아보기 (Learn more)