-
Notifications
You must be signed in to change notification settings - Fork 0
KR_AWS
somaz edited this page Oct 31, 2024
·
21 revisions
AWS Assume Role은 다른 계정의 AWS 리소스에 액세스하거나 동일한 계정 내에서 다른 권한으로 액세스하기 위해 임시 보안 자격 증명(액세스 키, 보안 액세스 키 및 세션 토큰)을 얻는 방법이다.
-
sts:AssumeRole작업을 사용하면 다른 AWS 계정이나 자신의 계정 내에 존재하는 역할을 맡을 수 있다. 역할을 맡으면 해당 역할과 관련된 권한을 일시적으로 획득하게 된다. - 교차 계정 액세스: 다른 AWS 계정의 역할을 맡아 해당 계정의 리소스에 액세스할 수 있다.
- 동일 계정 내: 현재 명령을 실행하는 사용자 또는 서비스와 다른 권한을 가진 역할을 맡는다.
- 다음은 Assume Role 을 사용하여 계정 B의 EKS 리소스에 대한 계정 A 액세스 권한을 부여하는 방법이다.
- 계정 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에서 계정 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에서 역할 가정 정책이 있는 사용자 또는 서비스는 이제 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 클러스터를 관리할 수 있다.
- AWS에서 ingress group은 여러 개의 ingress 리소스를 하나의 로드 밸런서(ALB)로 통합하여 관리할 수 있게 해주는 기능이이.
- 이를 통해 여러 Kubernetes 네임스페이스나 서로 다른 팀의 애플리케이션들이 같은 ALB를 공유하면서도 각기 다른 Ingress 규칙을 설정할 수 있다.
- ingress group을 사용하면 네트워크 리소스를 절약하고 관리 효율성을 높일 수 있다.
- 기본적으로 ingress는 ingress group에 속하지 않으며, ingress는 "implicit IngressGroup" 이며 즉, 독립적인 엔터티로 존재한다.
-
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
-
alb.ingress.kubernetes.io/group.order어노테이션을 사용해 순서를 지정할 수 있다. - 낮은 숫자의 order 값을 가진ㅑingress 규칙이 우선 적용되며, 동일한 path나 host에 대해 특정 우선순위를 지정할 수 있다.
- example:
alb.ingress.kubernetes.io/group.order: 10
아래 예시에서 두 개의 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-a와service-b가 각각 ingress 그룹my-shared-group에 속하게 되며,service-a가order10으로 우선 적용된다.