๐ธ 1. Pod์๊ฒ AWS ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ
EKS ํด๋ฌ์คํฐ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด S3, SQS, MSK์ ๊ฐ์ AWS ์๋น์ค์ ์ ๊ทผํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด๋ Pod์๊ฒ AWS ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค.
1.1 ๊ธฐ์กด ๋ฐฉ์์ ํ๊ณ
- EC2 Instance Profile ๋ฐฉ์:
๋ ธ๋์ IAM Role์ ๋ถ์ฌํ๋ ๋ฐฉ์. ์ด ๋ฐฉ์์ ํด๋น ๋ ธ๋์์ ์คํ๋๋ ๋ชจ๋ Pod๊ฐ ๋์ผํ ๊ถํ์ ๊ฐ๊ฒ ๋์ด ์ต์ ๊ถํ ์์น์ ์๋ฐฐ๋๋ค. - Access Key ๋ฐฉ์:
IAM User์ Access Key๋ฅผ Pod์ ์ง์ ์ฃผ์ ํ๋ ๋ฐฉ์. ํค ํ์ทจ ์ํ๊ณผ ํค ๊ด๋ฆฌ์ ๋ณต์ก์ฑ ๋๋ฌธ์ ํ๋ก๋์ ํ๊ฒฝ์์๋ ์ง์ํด์ผ ํ๋ค.
์ด๋ฌํ ํ๊ณ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด AWS๋ 2019๋ ์ IRSA(IAM Roles for Service Accounts)๋ฅผ ๋์ ํ๊ณ , 2023๋ re:Invent์์ Pod Identity๋ฅผ ๋ฐํํ๋ค.
๐ธ 2. IRSA (IAM Roles for Service Accounts)
2.1 IRSA ๊ฐ์
IRSA๋ Kubernetes์ Service Account์ IAM Role์ ์ฐ๊ฒฐํ์ฌ Pod ๋จ์๋ก AWS ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐฉ์์ด๋ค.
AWS ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, IRSA๋ OIDC(OpenID Connect)๋ฅผ ํ์ฉํ์ฌ Pod๊ฐ AWS STS์ AssumeRoleWithWebIdentity API๋ฅผ ํตํด ์์ ์๊ฒฉ์ฆ๋ช ์ ํ๋ํ๋ค.
2.2 IRSA ๋์ ์๋ฆฌ
IRSA์ ์ ์ฒด ํ๋ฆ์ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.

Pod ์์ฑ ์์
- ServiceAccount๋ฅผ ์ง์ ํ์ฌ Pod ์์ฑ ์์ฒญ์ Kubernetes API Server์ ๋ณด๋ธ๋ค.
- API Server๊ฐ Mutating Admission Webhook์ ํธ์ถํ๋ค.
- Pod Identity Webhook์ด ServiceAccount์ eks.amazonaws.com/role-arn ์ด๋ ธํ ์ด์ ์ด ์๋์ง ํ์ธํ๋ค.
- ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด Pod Spec์ ์์ ํ์ฌ ํ๊ฒฝ๋ณ์(AWS_ROLE_ARN, AWS_WEB_IDENTITY_TOKEN_FILE)์ ํ ํฐ Volume์ ์ฃผ์ ํ๋ค.
- Pod ์์ฑ์ด ์๋ฃ๋๋ค.
AWS API ํธ์ถ ์์
- Pod ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ AWS SDK๊ฐ ์ฃผ์ ๋ ํ๊ฒฝ๋ณ์๋ฅผ ๊ฐ์งํ๋ค.
- ๋ง์ดํธ๋ Projected Service Account Token ํ์ผ์ ์ฝ๋๋ค.
- AWS STS์ AssumeRoleWithWebIdentity(Token, RoleARN)๋ฅผ ํธ์ถํ๋ค.
- STS๊ฐ JWT์ iss(issuer) claim์ ํ์ธํ์ฌ ํด๋น EKS OIDC Provider๋ฅผ ์๋ณํ๋ค.
- STS๊ฐ OIDC Provider์ JWKS(JSON Web Key Set) ์๋ํฌ์ธํธ์์ Public Key๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์๋ํฌ์ธํธ: https://oidc.eks.{region}.amazonaws.com/id/{cluster-id}/keys
- ๊ฐ์ ธ์จ Public Key๋ก JWT ์๋ช ์ ๊ฒ์ฆํ๋ค. (Kubernetes API Server๊ฐ Private Key๋ก ์๋ช ํ์ผ๋ฏ๋ก ๋์๋๋ Public Key๋ก ๊ฒ์ฆ)
- JWT์ claims๋ฅผ ํ์ธํ๋ค.
- iss: ๋ฐ๊ธ์๊ฐ ํด๋น EKS ํด๋ฌ์คํฐ์ OIDC Provider์ธ์ง
- sub: system:serviceaccount:{namespace}:{sa-name} ํ์์ ์ฃผ์ฒด
- aud: sts.amazonaws.com์ธ์ง
- STS๊ฐ IAM Role์ Trust Policy๋ฅผ ๊ฒ์ฆํ๋ค.
- Trust Policy์ Federated Principal์ด ํด๋น OIDC Provider์ธ์ง
- Condition์ sub, aud ์กฐ๊ฑด์ด JWT claims์ ์ผ์นํ๋์ง
- ๋ชจ๋ ๊ฒ์ฆ์ด ํต๊ณผํ๋ฉด ์์ ์๊ฒฉ์ฆ๋ช (AccessKey, SecretKey, Token)์ ๋ฐํํ๋ค.
2.3 ํต์ฌ ๊ตฌ์ฑ์์ ๋ถ์
2.3.1 OIDC Provider
EKS ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๋ฉด AWS๋ ์๋์ผ๋ก ํด๋น ํด๋ฌ์คํฐ์ ๋ํ OIDC Provider๋ฅผ ์์ฑํ๋ค. AWS ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, Kubernetes 1.12๋ถํฐ ProjectedServiceAccountToken ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด OIDC JWT ํ ํฐ์ ๋ฐ๊ธํ ์ ์๊ฒ ๋์๋ค.
OIDC Provider URL์ ๋ค์ ๋ช ๋ น์ด๋ก ํ์ธํ ์ ์๋ค.
aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text
์ถ๋ ฅ ์์: https://oidc.eks.ap-northeast-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
2.3.2 Pod Identity Webhook
AWS์ amazon-eks-pod-identity-webhook GitHub ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ดํด๋ณด๋ฉด, ์ด Webhook์ Mutating Admission Webhook์ผ๋ก ๋์ํ๋ฉฐ Pod ์์ฑ ์ ๋ค์ ํญ๋ชฉ๋ค์ ์๋์ผ๋ก ์ฃผ์ ํ๋ค.
- ํ๊ฒฝ๋ณ์:
- AWS_ROLE_ARN: ์ฌ์ฉํ IAM Role์ ARN
- AWS_WEB_IDENTITY_TOKEN_FILE: ํ ํฐ ํ์ผ ๊ฒฝ๋ก
- AWS_STS_REGIONAL_ENDPOINTS: regional (์ง์ญ ์๋ํฌ์ธํธ ์ฌ์ฉ)
- ๋ณผ๋ฅจ:
- aws-iam-token: Projected Service Account Token์ด ๋ง์ดํธ๋๋ ๋ณผ๋ฅจ
env:
- name: AWS_ROLE_ARN
value: arn:aws:iam::123456789012:role/my-role
- name: AWS_WEB_IDENTITY_TOKEN_FILE
value: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
volumeMounts:
- mountPath: /var/run/secrets/eks.amazonaws.com/serviceaccount
name: aws-iam-token
readOnly: true
volumes:
- name: aws-iam-token
projected:
sources:
- serviceAccountToken:
audience: sts.amazonaws.com
expirationSeconds: 86400
path: token
2.3.3 IAM Role Trust Policy
IRSA๋ฅผ ์ฌ์ฉํ๋ IAM Role์ Trust Policy๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ง๋ค.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.ap-northeast-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.ap-northeast-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:default:my-sa",
"oidc.eks.ap-northeast-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"
}
}
}
]
}
Condition์ sub ํ๋๋ system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT_NAME ํ์์ผ๋ก ํน์ ๋ค์์คํ์ด์ค์ ํน์ Service Account๋ง ์ด Role์ Assumeํ ์ ์๋๋ก ์ ํํ๋ค.
2.4 IRSA์ ๋ณด์ ์ทจ์ฝ์
IRSA์๋ ๋ช ๊ฐ์ง ๋ณด์ ๊ณ ๋ ค์ฌํญ์ด ์๋ค.
- Trust Policy์์ system:serviceaccount:*:*์ ๊ฐ์ด ์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ ํฐ๋ง ๊ฒ์ฆ๋ฐ์ผ๋ฉด ๋ชจ๋ Service Account๊ฐ ํด๋น Role์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
- OIDC ์๋ํฌ์ธํธ๊ฐ ํผ๋ธ๋ฆญ์ด๊ธฐ ๋๋ฌธ์ Service Account์ ํ ํฐ ๊ฐ๊ณผ Role ARN๋ง ์๋ฉด ์ธ๋ถ์์๋ STS ์์์๊ฒฉ์ฆ๋ช ๋ฐ๊ธ์ ์์ฒญํ ์ ์๋ค.
# ํ ํฐ๊ณผ Role ARN์ ์๋ฉด ์ธ๋ถ์์๋ ์๊ฒฉ์ฆ๋ช
ํ๋ ๊ฐ๋ฅ
aws sts assume-role-with-web-identity \
--role-arn $ROLE_ARN \
--role-session-name mysession \
--web-identity-token $IAM_TOKEN
์ด๋ฌํ ํ๊ณ์ ์ ๋ณด์ํ๊ธฐ ์ํด AWS๋ Pod Identity๋ฅผ ์ถ์ํ๋ค.
๐ธ 3. EKS Pod Identity
3.1 Pod Identity ๊ฐ์
AWS ๊ณต์ ๋ธ๋ก๊ทธ์ ๋ฐ๋ฅด๋ฉด, Pod Identity๋ 2023๋ re:Invent์์ ๋ฐํ๋ ๊ธฐ๋ฅ์ผ๋ก IRSA๋ณด๋ค ๊ฐ์ํ๋ ๋ฐฉ์์ผ๋ก Pod์ AWS ๊ถํ์ ๋ถ์ฌํ๋ค.
IRSA์์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ OIDC Provider๋ฅผ ์ง์ ๊ด๋ฆฌํ ํ์๊ฐ ์๊ณ , Trust Policy์ ํด๋ฌ์คํฐ๋ณ OIDC URL์ ๋ช ์ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค.
3.2 Pod Identity ์ํคํ ์ฒ

- Pod๊ฐ eks-pod-identity-token๊ณผ ํจ๊ป Pod Identity Agent(169.254.170.23:80)์ ์๊ฒฉ์ฆ๋ช ์ ์์ฒญํ๋ค.
- Pod Identity Agent๊ฐ ๋ ธ๋์ IAM ๊ถํ์ ์ฌ์ฉํ์ฌ EKS Auth API์ AssumeRoleForPodIdentity๋ฅผ ํธ์ถํ๋ค.
- EKS Auth API๊ฐ ํ ํฐ์์ ServiceAccount ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ , Pod Identity Association์์ ํด๋น ServiceAccount์ IAM Role ๋งคํ์ ํ์ธํ๋ค.
- EKS Auth API๊ฐ AWS STS๋ฅผ ํตํด ์์ ์๊ฒฉ์ฆ๋ช ์ ๋ฐ๊ธ๋ฐ์ Pod Identity Agent์๊ฒ ๋ฐํํ๋ค.
- Pod Identity Agent๊ฐ Pod์๊ฒ ์์ ์๊ฒฉ์ฆ๋ช (AccessKeyId, SecretAccessKey, Token)์ ๋ฐํํ๋ค.
3.3 Pod Identity ๋์ ์๋ฆฌ
Pod Identity์ ๋์ ๊ณผ์ ์ ์์ธํ ์ดํด๋ณด์.
3.3.1 Pod Identity Agent
Pod Identity๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ eks-pod-identity-agent ์ ๋์จ์ ์ค์นํด์ผ ํ๋ค.
aws eks create-addon \
--cluster-name $CLUSTER_NAME \
--addon-name eks-pod-identity-agent \
--addon-version v1.0.0-eksbuild.1
์ด Agent๋ DaemonSet์ผ๋ก ๋ฐฐํฌ๋์ด ๊ฐ ๋ ธ๋์์ ์คํ๋๋ค.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: eks-pod-identity-agent
namespace: kube-system
spec:
template:
spec:
hostNetwork: true
containers:
- name: eks-pod-identity-agent
image: 602401143452.dkr.ecr.us-east-1.amazonaws.com/eks/eks-pod-identity-agent
ports:
- containerPort: 80
hostPort: 80
- containerPort: 2703
hostPort: 2703
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์ hostNetwork: true ์ค์ ์ด๋ค. Agent๋ ํธ์คํธ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, Link-Local ์ฃผ์์ธ 169.254.170.23์ ํฌํธ 80๊ณผ 2703์ ์ ์ ํ๋ค.
3.3.2 Link-Local ์ฃผ์ 169.254.170.23
๊ทธ๋ ๋ค๋ฉด ์ 169.254.170.23์ด๋ผ๋ ํน์ ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ ๊ฑธ๊น?
169.254.0.0/16 ๋์ญ์ Link-Local ์ฃผ์๋ก, ๋ก์ปฌ ๋คํธ์ํฌ ์ธ๊ทธ๋จผํธ ๋ด์์๋ง ํต์ ์ด ๊ฐ๋ฅํ๋ค. AWS์์๋ ์ด๋ฏธ EC2 Instance Metadata Service(IMDS)๊ฐ 169.254.169.254๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. Pod Identity Agent๋ ์ด์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก 169.254.170.23์ ์ฌ์ฉํ์ฌ ๋์ผ ๋ ธ๋์ Pod๋ค์๊ฒ๋ง ์๊ฒฉ์ฆ๋ช ์ ์ ๊ณตํ๋ค.
Agent์ init container๋ pod-id-link0์ด๋ผ๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๊ณ ๋ผ์ฐํ ๊ท์น์ ์ค์ ํ๋ค.
# ๋
ธ๋์์ ํ์ธ
$ ss -anltp | grep eks-pod
LISTEN 0 4096 127.0.0.1:2703 0.0.0.0:* users:(("eks-pod-identit"...))
LISTEN 0 4096 169.254.170.23:80 0.0.0.0:* users:(("eks-pod-identit"...))
3.3.3 ์๊ฒฉ์ฆ๋ช ํ๋ ๊ณผ์
Pod Identity๊ฐ ํ์ฑํ๋ Pod๊ฐ ์์ฑ๋๋ฉด Webhook์ด ๋ค์ ํ๊ฒฝ๋ณ์์ ๋ณผ๋ฅจ์ ์ฃผ์ ํ๋ค.
env:
- name: AWS_CONTAINER_CREDENTIALS_FULL_URI
value: "http://169.254.170.23/v1/credentials"
- name: AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE
value: "/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token"
volumes:
- name: eks-pod-identity-token
projected:
sources:
- serviceAccountToken:
audience: pods.eks.amazonaws.com
expirationSeconds: 86400
path: eks-pod-identity-token
IRSA์ ๋น๊ตํ์ ๋ ์ค์ํ ์ฐจ์ด์ ์ด ์๋ค. IRSA๋ AWS_WEB_IDENTITY_TOKEN_FILE์ ์ฌ์ฉํ์ฌ SDK๊ฐ ์ง์ STS๋ฅผ ํธ์ถํ์ง๋ง, Pod Identity๋ AWS_CONTAINER_CREDENTIALS_FULL_URI๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ Agent์๊ฒ ์๊ฒฉ์ฆ๋ช ์ ์์ฒญํ๋ค.
์ค์ ์๊ฒฉ์ฆ๋ช ํ๋ ๊ณผ์ ์ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.

- Pod ๋ด ์ ํ๋ฆฌ์ผ์ด์ (AWS SDK)์ด AWS API ํธ์ถ ์ AWS_CONTAINER_CREDENTIALS_FULL_URI ํ๊ฒฝ๋ณ์๋ฅผ ๊ฐ์งํ๋ค.
- AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE ๊ฒฝ๋ก์์ eks-pod-identity-token ํ์ผ์ ์ฝ๋๋ค.
- ์ฝ์ด์จ ํ ํฐ์ Authorization ํค๋์ ๋ด์ Pod Identity Agent(169.254.170.23:80)์ GET /v1/credentials ์์ฒญ์ ๋ณด๋ธ๋ค.
- Pod Identity Agent๊ฐ ์ ๋ฌ๋ฐ์ ํ ํฐ์์ Namespace, ServiceAccount ์ ๋ณด๋ฅผ ์ถ์ถํ๋ค.
- Agent๊ฐ EKS Auth API์ AssumeRoleForPodIdentity๋ฅผ ํธ์ถํ๋ค.
- EKS Auth API๊ฐ ํด๋น ํด๋ฌ์คํฐ์ Pod Identity Association์ ์กฐํํ์ฌ ServiceAccount์ IAM Role ๋งคํ์ ํ์ธํ๋ค.
- ๋งคํ๋ IAM Role์ Trust Policy๋ฅผ ๊ฒ์ฆํ๋ค.
- ๊ฒ์ฆ์ด ์๋ฃ๋๋ฉด EKS Auth API๊ฐ ์์ ์๊ฒฉ์ฆ๋ช ์ Agent์๊ฒ ๋ฐํํ๋ค.
- Agent๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์๊ฒ JSON ํํ๋ก ์์ ์๊ฒฉ์ฆ๋ช (AccessKeyId, SecretAccessKey, Token, Expiration)์ ์๋ตํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ์๊ฒฉ์ฆ๋ช ์ผ๋ก AWS ์๋น์ค์ ์ ๊ทผํ๋ค.
Pod์์ ์ง์ Agent์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ต์ ๋ฐ์ ์ ์๋ค.
$ TOKEN=$(cat /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token)
$ curl 169.254.170.23/v1/credentials -H "Authorization: $TOKEN"
{
"AccessKeyId": "ASIA...",
"SecretAccessKey": "...",
"Token": "...",
"AccountId": "123456789012",
"Expiration": "2024-01-15T18:46:49Z"
}
3.3.4 IAM Role Trust Policy
Pod Identity๋ฅผ ์ฌ์ฉํ๋ IAM Role์ Trust Policy๋ IRSA๋ณด๋ค ํจ์ฌ ๋จ์ํ๋ค.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession"
]
}
]
}
ํด๋ฌ์คํฐ๋ณ OIDC URL์ด ์๊ธฐ ๋๋ฌธ์ ๋์ผํ Role์ ์ฌ๋ฌ EKS ํด๋ฌ์คํฐ์์ ์ฌ์ฌ์ฉํ ์ ์๋ค. ๋ํ sts:TagSession ์ก์ ์ ํตํด ABAC(Attribute-Based Access Control)์ ๊ตฌํํ ์ ์๋ค.
3.3.5 Pod Identity Association
Role๊ณผ Service Account์ ๋งคํ์ AWS API๋ฅผ ํตํด ๊ด๋ฆฌ๋๋ค.
aws eks create-pod-identity-association \
--cluster-name $CLUSTER_NAME \
--namespace default \
--service-account-name my-sa \
--role-arn arn:aws:iam::123456789012:role/my-pod-role
์ด๋ค Pod๊ฐ ์ด๋ค Role์ ์ ๊ทผํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ๋ ๊ฐ๋จํ๋ค.
# ํด๋ฌ์คํฐ์ ๋ชจ๋ Pod Identity Association ์กฐํ
aws eks list-pod-identity-associations --cluster-name $CLUSTER_NAME
# ํน์ Association ์์ธ ์ ๋ณด
aws eks describe-pod-identity-association \
--cluster-name $CLUSTER_NAME \
--association-id a-0123456789
๐ธ 4. IRSA vs Pod Identity ๋น๊ต
4.1 ์ํคํ ์ฒ ๋น๊ต

4.2 ์ฃผ์ ์ฐจ์ด์
๊ตฌ๋ถ IRSA Pod Identity
| ์ถ์ ์์ | 2019๋ | 2023๋ (re:Invent) |
| OIDC Provider | ํด๋ฌ์คํฐ๋ณ ํ์ | ๋ถํ์ |
| Trust Policy | ํด๋ฌ์คํฐ OIDC URL ๋ช ์ ํ์ | pods.eks.amazonaws.com๋ง ๋ช ์ |
| Role ์ฌ์ฌ์ฉ | ํด๋ฌ์คํฐ๋ณ Trust Policy ์์ ํ์ | ์ฌ๋ฌ ํด๋ฌ์คํฐ์์ ๊ทธ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ |
| ์๊ฒฉ์ฆ๋ช ํ๋ | Pod๊ฐ ์ง์ STS ํธ์ถ | Agent๊ฐ ๋์ ํธ์ถ |
| ๊ถํ ๋งคํ ํ์ธ | IAM Role Trust Policy ๋ถ์ ํ์ | ListPodIdentityAssociations API |
| AWS SDK ์๊ตฌ์ฌํญ | Web Identity Token ์ง์ ๋ฒ์ | Container Credentials ์ง์ ๋ฒ์ |
| ABAC ์ง์ | ๋ฏธ์ง์ | sts:TagSession์ผ๋ก ์ง์ |
๐ช ์ ๋ฆฌ
EKS์์ Pod์๊ฒ AWS ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐฉ์์ผ๋ก IRSA์ Pod Identity ๋ ๊ฐ์ง๊ฐ ์๋ค.
IRSA๋ OIDC Provider๋ฅผ ํตํด Kubernetes Service Account Token์ AWS STS๊ฐ ๊ฒ์ฆํ๊ณ ์์ ์๊ฒฉ์ฆ๋ช ์ ๋ฐ๊ธํ๋ ๋ฐฉ์์ด๋ค.Pod Identity๋ ๊ฐ ๋ ธ๋์์ ์คํ๋๋ Agent๊ฐ 169.254.170.23 ์ฃผ์๋ก ์๊ฒฉ์ฆ๋ช ์์ฒญ์ ๋ฐ์ EKS Auth API์ AssumeRoleForPodIdentity๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก, OIDC Provider ์์ด๋ ๋์ํ๋ฉฐ Trust Policy๊ฐ ๋จ์ํ๋ค.
Pod Identity๊ฐ ๋ ์ต์ ๊ธฐ๋ฅ์ด๊ณ ๊ด๋ฆฌ๊ฐ ํธ๋ฆฌํ์ง๋ง, ์์ง ์ผ๋ถ AWS ์ปดํฌ๋ํธ๊ฐ ์ง์ํ์ง ์์ผ๋ฏ๋ก ์ํฉ์ ๋ง๊ฒ ์ ํํด์ผ ํ๋ค.
๐ ์ถ์ฒ
- AWS ๊ณต์ ๋ธ๋ก๊ทธ - Amazon EKS Pod Identity: https://aws.amazon.com/ko/blogs/korea/amazon-eks-pod-identity-simplifies-iam-permissions-for-applications-on-amazon-eks-clusters/
- AWS ๊ณต์ ๋ฌธ์ - IAM roles for service accounts: https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html
- AWS ๊ณต์ ๋ฌธ์ - EKS Pod Identity: https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html
- AWS ๊ณต์ ๋ฌธ์ - How EKS Pod Identity works: https://docs.aws.amazon.com/eks/latest/userguide/pod-id-how-it-works.html
- Datadog Security Labs - Deep dive into EKS Pod Identity: https://securitylabs.datadoghq.com/articles/eks-pod-identity-deep-dive/
- AWS GitHub - amazon-eks-pod-identity-webhook: https://github.com/aws/amazon-eks-pod-identity-webhook
- AWS Containers Blog - Amazon EKS Pod Identity: https://aws.amazon.com/blogs/containers/amazon-eks-pod-identity-a-new-way-for-applications-on-eks-to-obtain-iam-credentials/
- ์ฐธ๊ณ ๋ธ๋ก๊ทธ (velog): https://velog.io/@6ain/AKES2-6์ฃผ์ฐจ-EKS-Security-EKS-IRSA-Pod-Identity