서비스 개발하면서 계속 걸렸던게 바로 AWS IAM의 Credentials 정보들을 어딘가에 계속 저장해서 사용하고 있다는거다. 물론 배포할때 환경변수로 넣을수도 혹은 암호화해서 사용해서 일시적으로 숨길 수는 있으나 여전히 마음에 안든다.
그러다 찾은게 바로 IAM roles for service accounts라는 글이였다
https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html
IAM roles for service accounts - Amazon EKS
IAM roles for service accounts Applications in a pod's containers can use an AWS SDK or the AWS CLI to make API requests to AWS services using AWS Identity and Access Management (IAM) permissions. Applications must sign their AWS API requests with AWS cred
docs.aws.amazon.com
대충 요약하면 Pod의 권한을 ServiceAccount를 통해 IAM Role을 제어하겠다는거다.
이러면 우리가 얻는 이점이 뭐냐. Secret이건 서비스코드 어딘가에 더이상 IAM의 Access key나 Secret Access Key를 저장안해도 된다는 거다 ✩✭✩✭
1. ServiceAccount 작성
apiVersion: v1
kind: ServiceAccount
metadata:
name: <SA>
Name 값 지정시 주의할건 언더바(_)는 지원되지 않는다.
ServiceAccount 파일을 쿠버에 적용을 했으면 Pod에 연결해주면 된다.
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
spec:
serviceAccountName: 위에서 만든 ServiceAccount 이름
2. 신규 Policy & Role
여기서부터는 각자 서비스에 필요한 AWS Policy 와 Role을 기입해서 생성해주면 된다.
2단계 내용은 AWS Iam에서 원하시는 방법으로 작성하셔도 됩니다. 요 글에서는 aws cli를 사용
2-1. Policy
# serviceaccount-policy.json
{
"Statement": [
"Action": "사용할 AWS 자원",
"Effect": "Allow",
"Resource": []
]
}
aws iam create-policy \
--policy-name <Policy Name> \
--policy-document file://serviceaccount-policy.json
2-2. Role
# serviceaccount-trust-relationship.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<ACCOUNT_ID>:oidc-provider/<OIDC_PROVIDER>"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
<OIDC_PROVIDER>:aud": "sts.amazonaws.com",
<OIDC_PROVIDER>:sub": "system:serviceaccount:<NAMESPACE>:<SERVICEACCOUNT>"
}
}
}
]
}
- ACCOUNT_ID : AWS 우측 상단에 계정을 클릭하면 확인할수 있다
- OIDC_PROVIDER : EKS > Cluster 선택 > Overview > Details 항목에 OpenID Connect provider URL이 있을건데 앞에 https:// 부분만 지워주면 된다. -> oidc.eks~로 시작하면 됩니다.
- NAMESPACE : 서비스어카운트가 배포될 namespace
- SERVICEACCOUNT : 생성한 serviceaccount 이름
aws iam create-role \
--role-name <Role Name> \
--assume-role-policy-document file://serviceaccount-trust-relationship.json
aws iam attach-role-policy \
--role-name <Role Name> \
--policy-arn=arn:aws:iam::<ACCOUNT_ID>:policy/<Policy Name>
2-3. ServiceAccount와 Role 연결
Role까지 생성되었다면 ServiceAccount가 해당 권한을 사용할 수 있도록 값을 하나 넣어줘야한다.
kubectl annotate \
serviceaccount <SERVICEACCOUNT> \
-n <NAMESPACE> \
eks.amazonaws.com/role-arn=arn:aws:iam:<ACCOUNT_ID>:role/<Role Name>
이 작업은 결국 ServiceAccount에 annotation값을 하나 추가해주는건데 처음 ServiceAccount를 생성시에 밑에 미리 추가해줘도 되긴한다.
여기까지 했으면 인프라는 작업끝이다
서버 작업은 다음글에서 작업할 예정
'[Kubernetes]' 카테고리의 다른 글
[k8s] ALB 적용하기 - 2. AWS console 사용 (0) | 2022.07.25 |
---|---|
[k8s] ALB 적용하기 - 1. eksctl 사용 (0) | 2022.07.25 |