서비스 계정의 AWS Security Token Service 엔드포인트 구성

서비스 계정의 AWS Security Token Service 엔드포인트 구성

Kubernetes 서비스 계정이 사용하는 AWS Security Token Service(STS) 엔드포인트 유형을 구성하는 방법을 설명합니다.

출처: 문서

본문

서비스 계정용 IAM 역할과 함께 Kubernetes 서비스 계정을 사용한다면, 서비스 계정이 사용하는 AWS Security Token Service 엔드포인트 유형을 구성할 수 있습니다.

AWS는 전역 엔드포인트 대신 리전별 AWS STS 엔드포인트를 사용할 것을 권장합니다. 이렇게 하면 지연 시간이 줄고, 기본 제공 중복성을 제공하며, 세션 토큰 유효 기간이 늘어납니다. AWS Security Token Service는 Pod가 실행되는 AWS 리전에서 활성화되어 있어야 합니다. 또한 애플리케이션은 해당 AWS 리전에서 서비스가 실패하는 경우 다른 AWS 리전을 위한 기본 제공 중복성을 가져야 합니다. 자세한 내용은 IAM 사용 설명서의 "AWS 리전에서 AWS STS 관리"를 참고하세요.

전제 조건

  • 기존 클러스터. 없다면 "Amazon EKS 시작하기"의 안내 중 하나를 따라 생성할 수 있습니다.
  • 클러스터용 기존 IAM OIDC 공급자. 자세한 내용은 "클러스터용 IAM OIDC 공급자 생성"을 참고하세요.
  • Amazon EKS IAM for service accounts 기능과 함께 사용하도록 구성된 기존 Kubernetes 서비스 계정.

참고: 인터넷 이그레스가 없는 VPC에서 IRSA 자격 증명 요청을 프라이빗으로 만들려면 AWS STS 인터페이스 엔드포인트(com.amazonaws.region-code.sts)를 생성하고 이 주제에 설명된 대로 리전별 엔드포인트를 설정하세요. 전역 엔드포인트(sts.amazonaws.com)는 VPC 엔드포인트를 우회합니다. 클러스터 OIDC 검색/JWKS 엔드포인트에도 프라이빗으로 도달하려면(공급자 설정 및 토큰 검증자용) 별도의 VPC 엔드포인트(com.amazonaws.region-code.oidc-eks)를 생성하세요. 자세한 내용은 "AWS PrivateLink를 사용한 클러스터 OIDC 엔드포인트 액세스"를 참고하세요.

다음 예제는 모두 Amazon VPC CNI 플러그인이 사용하는 aws-node Kubernetes 서비스 계정을 사용합니다. example values를 자신의 서비스 계정, Pod, 네임스페이스 및 기타 리소스로 바꿀 수 있습니다.

  1. 엔드포인트를 변경하려는 서비스 계정을 사용하는 Pod를 선택합니다. 해당 Pod가 실행되는 AWS 리전을 확인합니다. aws-node-6mfgv를 Pod 이름으로, kube-system을 Pod의 네임스페이스로 바꾸세요.
kubectl describe pod aws-node-6mfgv -n kube-system |grep Node:

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

ip-192-168-79-166.us-west-2/192.168.79.166

위 출력에서 Pod는 us-west-2 AWS 리전의 노드에서 실행되고 있습니다.

  1. Pod의 서비스 계정이 사용하는 엔드포인트 유형을 확인합니다.
kubectl describe pod aws-node-6mfgv -n kube-system |grep AWS_STS_REGIONAL_ENDPOINTS

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

AWS_STS_REGIONAL_ENDPOINTS: regional

현재 엔드포인트가 global이라면 출력에 global이 반환됩니다. 출력이 없으면 기본 엔드포인트 유형이 사용 중이며 재정의되지 않은 것입니다.

  1. 다음 명령 중 하나로 서비스 계정이 사용하는 엔드포인트 유형을 기본 유형에서 다른 유형으로 변경할 수 있습니다. aws-node를 서비스 계정 이름으로, kube-system을 서비스 계정의 네임스페이스로 바꾸세요.

기본 또는 현재 엔드포인트 유형이 global이고 regional로 변경하려면:

kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/sts-regional-endpoints=true

Pod 컨테이너에서 실행되는 애플리케이션에서 서비스 계정용 IAM 역할로 사전 서명된(사전 서명된) S3 URL을 생성한다면, regional 엔드포인트의 URL 형식은 다음 예제와 유사합니다.

https://bucket.s3.us-west-2.amazonaws.com/path?...&X-Amz-Credential=your-access-key-id/date/us-west-2/s3/aws4_request&...

기본 또는 현재 엔드포인트 유형이 regional이고 global로 변경하려면:

kubectl annotate serviceaccount -n kube-system aws-node eks.amazonaws.com/sts-regional-endpoints=false

애플리케이션이 AWS STS 전역 엔드포인트에 명시적으로 요청하고 Amazon EKS 클러스터에서 regional 엔드포인트를 사용하는 기본 동작을 재정의하지 않는다면 요청이 오류와 함께 실패합니다. 자세한 내용은 "Pod 컨테이너가 다음 오류를 수신합니다: GetCallerIdentity 작업 호출 시 오류 발생(SignatureDoesNotMatch): 자격 증명은 유효한 리전으로 범위가 지정되어야 합니다."를 참고하세요.

Pod 컨테이너에서 실행되는 애플리케이션에서 서비스 계정용 IAM 역할로 사전 서명된 S3 URL을 생성한다면, global 엔드포인트의 URL 형식은 다음 예제와 유사합니다.

https://bucket.s3.amazonaws.com/path?...&X-Amz-Credential=your-access-key-id/date/us-west-2/s3/aws4_request&...

사전 서명된 URL이 특정 형식이기를 기대하는 자동화나, 사전 서명된 URL을 사용하는 애플리케이션이나 다운스트림 종속 항목에 타겟 AWS 리전에 대한 기대치가 있다면, 적절한 AWS STS 엔드포인트를 사용하도록 필요한 변경을 하세요.

  1. 자격 증명 환경 변수를 적용하려면 서비스 계정과 연결된 기존 Pod를 삭제하고 다시 생성하세요. 변경 웹훅(mutating web hook)은 이미 실행 중인 Pod에는 적용하지 않습니다. Pods, kube-system, -l k8s-app=aws-node를 주석을 설정한 Pod 정보로 바꿀 수 있습니다.
kubectl delete Pods -n kube-system -l k8s-app=aws-node
  1. 모든 Pod가 다시 시작되었는지 확인합니다.
kubectl get Pods -n kube-system -l k8s-app=aws-node
  1. Pod 중 하나의 환경 변수를 확인합니다. AWS_STS_REGIONAL_ENDPOINTS 값이 이전 단계에서 설정한 값인지 확인합니다.
kubectl describe pod aws-node-kzbtr -n kube-system |grep AWS_STS_REGIONAL_ENDPOINTS

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

AWS_STS_REGIONAL_ENDPOINTS=regional

더 알아보기 (Learn more)