Skip to content
somaz edited this page Oct 31, 2024 · 21 revisions

1. AWS Assume Role

AWS Assume Role은 다른 계정의 AWS 리소스에 액세스하거나 동일한 계정 내에서 다른 권한으로 액세스하기 위해 임시 보안 자격 증명(액세스 키, 보안 액세스 키 및 세션 토큰)을 얻는 방법이다.

  • sts:AssumeRole 작업을 사용하면 다른 AWS 계정이나 자신의 계정 내에 존재하는 역할을 맡을 수 있다. 역할을 맡으면 해당 역할과 관련된 권한을 일시적으로 획득하게 된다.
  • 교차 계정 액세스: 다른 AWS 계정의 역할을 맡아 해당 계정의 리소스에 액세스할 수 있다.
  • 동일 계정 내: 현재 명령을 실행하는 사용자 또는 서비스와 다른 권한을 가진 역할을 맡는다.

Assume Role 사용 예시

  • 다음은 Assume Role 을 사용하여 계정 B의 EKS 리소스에 대한 계정 A 액세스 권한을 부여하는 방법이다.

계정 B에서 IAM 역할 생성

  • 계정 B에서 계정 A가 이 역할을 맡도록 허용하는 신뢰 정책을 사용하여 IAM 역할을 생성한다. 이 역할은 계정 B에서 EKS 리소스를 관리할 수 있는 권한을 부여한다.

계정 B에 AssumeRole 역할 생성 예시:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"  // Account A ID
      },
      "Action": "sts:AssumeRole"
    }
  ]}
  • 계정 B의 역할에 EKS 권한을 연결한다. EKS 리소스를 관리하기 위해 AmazonEKSClusterPolicy 또는 사용자 지정 권한과 같은 필수 EKS 정책을 역할에 연결한다.

계정 A에서 IAM 정책 생성

  • 계정 A에서 계정 A의 사용자 또는 서비스가 계정 B의 역할을 맡도록 허용하는 IAM 정책을 생성한다.

계정 A 정책 예시:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::111122223333:role/EKSAdminRole"  // Role ARN in Account B
    }
  ]}
  • 계정 A의 필요한 사용자, 그룹 또는 역할에 연결한다.

계정 A에서 역할 위임

  • 계정 A에서 역할 가정 정책이 있는 사용자 또는 서비스는 이제 AWS CLI, SDK 또는 AWS 콘솔을 사용하여 계정 B에서 역할을 가정할 수 있다.

AWS CLI 예시:

aws sts assume-role \
  --role-arn arn:aws:iam::111122223333:role/EKSAdminRole \
  --role-session-name eks-session
  • 이 명령은 계정 B에서 EKS 클러스터에 액세스하고 관리하는 데 사용할 수 있는 임시 자격 증명(액세스 키, 비밀 키 및 세션 토큰)을 제공한다.

액세스를 위해 임시 자격 증명 사용

  • 역할을 맡은 후 임시 자격 증명을 사용하여 계정A의 권한으로 계정 B의 EKS 리소스와 상호 작용할 수 있다.

계정 B에서 EKS 클러스터를 관리하도록 kubeconfig를 업데이트 예시:

aws eks --region us-west-2 update-kubeconfig --name eks-cluster \
  --role-arn arn:aws:iam::111122223333:role/EKSAdminRole
  • 계정 A의 kubectl을 사용하여 계정 B에서 EKS 클러스터를 관리할 수 있다.

2. AWS Ingress Group

  • AWS에서 ingress group은 여러 개의 ingress 리소스를 하나의 로드 밸런서(ALB)로 통합하여 관리할 수 있게 해주는 기능이이.
  • 이를 통해 여러 Kubernetes 네임스페이스나 서로 다른 팀의 애플리케이션들이 같은 ALB를 공유하면서도 각기 다른 Ingress 규칙을 설정할 수 있다.
  • ingress group을 사용하면 네트워크 리소스를 절약하고 관리 효율성을 높일 수 있다.
  • 기본적으로 ingress는 ingress group에 속하지 않으며, ingress는 "implicit IngressGroup" 이며 즉, 독립적인 엔터티로 존재한다.

Ingress Group 이름 설정

  • alb.ingress.kubernetes.io/group.name 어노테이션을 사용하여 그룹 이름을 정의한다.
  • 동일한 그룹 이름을 가진 ingress 리소스는 하나의 ALB를 공유하게 된다.
  • ingress group에 할당된 ALB는 ingress.k8s.aws/stack 이이는 AWS 태그를 검색하여 찾는다.(리스너 규칙의 태그로 되어있음) 이 태그의 값으로 IngressGroup의 이름을 가지게 된다.
  • ingress group을 사용하지 않은 리소스들은 태그 값은 namespace/ingressname 형식으로 설정한다.
  • ingress 리소스에 할당된 groupName을 변경하면, Ingress는 기존 그룹에서 새로운 IngressGroup으로 이동하게 되며, 새로운 IngressGroup의 ALB에서 관리된다.
  • 만약 새로운 IngressGroup에 ALB가 없다면, 새로운 ALB가 자동으로 생성된다.
  • ingress group의 ALB는 ingress group의 이름을 값으로 하는 AWS 태그 ingress.k8s.aws/ 스택 태그를 검색하여 찾을 수 있다.
  • example: alb.ingress.kubernetes.io/group.name: my-team.awesome-group

Ingress Group 순위 설정

  • alb.ingress.kubernetes.io/group.order 어노테이션을 사용해 순서를 지정할 수 있다.
  • 낮은 숫자의 order 값을 가진ㅑingress 규칙이 우선 적용되며, 동일한 path나 host에 대해 특정 우선순위를 지정할 수 있다.
  • example: alb.ingress.kubernetes.io/group.order: 10

Ingress Group 예시

아래 예시에서 두 개의 ingress 리소스가 my-shared-group 이라는 그룹을 공유하게 되어 하나의 ALB에서 요청을 처리한다.

# Ingress for Service A
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: service-a-ingress
  annotations:
    alb.ingress.kubernetes.io/group.name: "my-shared-group"
    alb.ingress.kubernetes.io/group.order: "10"
spec:
  rules:
    - host: "service-a.example.com"
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-a
                port:
                  number: 80

# Ingress for Service B
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: service-b-ingress
  annotations:
    alb.ingress.kubernetes.io/group.name: "my-shared-group"
    alb.ingress.kubernetes.io/group.order: "20"
spec:
  rules:
    - host: "service-b.example.com"
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-b
                port:
                  number: 80
  • service-aservice-b 가 각각 ingress 그룹 my-shared-group 에 속하게 되며, service-aorder 10으로 우선 적용된다.

Clone this wiki locally