IRSA 적용
클러스터에서 service account에 대한 IAM role을 사용하려면, IAM OIDC Identity Provider가 생성되어 클러스터와 연결되어 있어야 합니다. OIDC는 이미 프로비저닝되어 EKS 클러스터와 연결되어 있습니다:
{"OpenIDConnectProviderList": [
{"Arn": "arn:aws:iam::1234567890:oidc-provider/oidc.eks.us-east-2.amazonaws.com/id/7185F12D2B62B8DA97B0ECA713F66C86"
}
]
}
Amazon EKS 클러스터와의 연결을 검증합니다.
{ "oidc": {"issuer": "https://oidc.eks.us-west-2.amazonaws.com/id/7185F12D2B62B8DA97B0ECA713F66C86"
}
}
carts 서비스가 DynamoDB 테이블을 읽고 쓰는 데 필요한 권한을 제공하는 IAM role이 이미 생성되어 있습니다. 다음과 같이 정책을 확인할 수 있습니다:
{"Statement": [
{"Action": "dynamodb:*",
"Effect": "Allow",
"Resource": [
"arn:aws:dynamodb:us-west-2:1234567890:table/eks-workshop-carts",
"arn:aws:dynamodb:us-west-2:1234567890:table/eks-workshop-carts/index/*"
],
"Sid": "AllAPIActionsOnCart"
}
],
"Version": "2012-10-17"
}
이 role은 또한 적절한 신뢰 관계(trust relationship)로 구성되어 있어, EKS 클러스터와 연결된 OIDC 공급자가 subject가 carts 컴포넌트의 ServiceAccount인 경우에 한해 이 role을 assume할 수 있습니다. 다음과 같이 확인할 수 있습니다:
{"Version": "2012-10-17",
"Statement": [
{"Sid": "",
"Effect": "Allow",
"Principal": {"Federated": "arn:aws:iam::1234567890:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/22E1209C76AE64F8F612F8E703E5BBD7"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": { "StringEquals": {"oidc.eks.us-west-2.amazonaws.com/id/22E1209C76AE64F8F612F8E703E5BBD7:sub": "system:serviceaccount:carts:carts"
}
}
}
]
}
이제 남은 것은 carts 애플리케이션과 연결된 Service Account 객체를 재구성하여 필요한 annotation을 추가하는 것입니다. 그러면 IRSA가 위의 IAM role을 사용하는 Pod에 올바른 권한을 제공할 수 있습니다.
먼저 carts Deployment와 연결된 SA를 확인해 보겠습니다.
Service Account: cart
이제 Service Account annotation에 사용할 IAM role의 ARN을 제공하는 CARTS_IAM_ROLE 값을 확인해 보겠습니다.
arn:aws:iam::1234567890:role/eks-workshop-carts-dynamo
사용할 IAM role을 확인했으면, Kustomize를 실행하여 Service Account에 변경사항을 적용할 수 있습니다.
이렇게 하면 다음과 같이 service account가 수정됩니다:
- Kustomize Patch
- ServiceAccount/carts
- Diff
apiVersion: v1
kind: ServiceAccount
metadata:
name: carts
namespace: carts
annotations:
eks.amazonaws.com/role-arn: ${CARTS_IAM_ROLE}
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: ${CARTS_IAM_ROLE}
name: carts
namespace: carts
apiVersion: v1
kind: ServiceAccount
metadata:
+ annotations:
+ eks.amazonaws.com/role-arn: ${CARTS_IAM_ROLE}
name: carts
namespace: carts
Service Account가 annotation되었는지 확인합니다.
Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::1234567890:role/eks-workshop-carts-dynamo
ServiceAccount가 업데이트되었으므로 이제 carts Pod를 재시작하여 변경사항을 적용하면 됩니다:
deployment.apps/carts restarted
Waiting for deployment "carts" rollout to finish: 1 old replicas are pending termination...
deployment "carts" successfully rolled out