๋ณด์์ ์์คํ ๊ตฌ์ฑ์์ ์ด์๊น์ง ๊ฐ์ฅ ์ค์ํ๊ฒ ์๊ฐ๋๋ ๋ถ๋ถ ์ค ํ๋์ด๋ค. ์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ณด์์ ๋น ์ง ์ ์๋ ์ค์ํ ๋ถ๋ถ์ด๋ค. ์ด๋ป๊ฒ ์์ ํ๊ฒ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋์ง, ์ดํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ ํ๊ฒฝ์์ ์์ ํ๊ฒ ์ด์ํ ์ง, ์ทจ์ฝ์ ์ ๊ฒ์ ์ด๋ป๊ฒ ํ๋ฉฐ, ์ด๋ ํ ์๋ฃจ์ ์ ์ฌ์ฉํ๋์ง ์ด๋ฒ 7์ฃผ์ฐจ ๋ง์ง๋ง ์คํฐ๋์์ ํ์ต ํ ์์ ์ด๋ค.
KOPS๋ AWS EC2 Instance(Node)๋ฅผ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑํ๋ค. ํด๋น Instance์ ๋ฐฐํฌ๋ Pod๋ Instance์ ๋ถ์ฌ๋ IAM Role๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ํด์ปค์ ์ํด Podํ๋๊ฐ ๊ณต๊ฒฉ์ ๋ฐ์ ํ์ทจ๋ฅผ ๋นํ๊ฒ ๋๋ฉด Instance์ IAM Role๋ฅผ ๊ทธ๋๋ก ํ์ทจํ๊ฒ ๋๋ ์ํฉ์ด ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ๋ณด์์ ์ผ๋ก ๋งค์ฐ ์ทจ์ฝํ ๋ชจ์ต์ด๋ค.
์ ๊ทธ๋ฆผ์ ๋นจ๊ฐ ๋ฐ์ค๊ฐ Instance์ IAM Role๋ฅผ ๋ฐฐํฌ๋ Pod๊ฐ ๊ทธ๋๋ก ๋ถ์ฌ๋ฐ์ ์ทจ์ฝํ ๋ชจ์ต์ ๋ํ๋ธ๋ค.
IRSA(IAM Roles for Service Accounts)
์ด๋ฌํ ์ทจ์ฝ์ ๋๋ฌธ์ Pod๋ณ IAM Role๋ฅผ ๋ถ์ฌํ์ฌ ํด๋น Pod๊ฐ ํ์ทจ๋ฅผ ๋นํด๋ ๋ค๋ฅธ Pod ๋ฐ Instance์ ๊ถํ์ด ์๋๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ์์ผ๋ก ํ์ฌ๋ EKS, KOPS ์ต์ ๋ฒ์ ์ ์์ ํ๊ฒ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ค.
์ ๊ทธ๋ฆผ์ ํ๋์ ๋ฐ์ค๊ฐ Pod๋ณ IAM Role๋ฅผ ์ ์ฉํ ๋ชจ์ต์ ๋ํ๋ธ๋ค.
#ํ์ฌ ํด๋ฌ์คํฐ ์ธ์คํด์ค ๋ฐ ์ธ์คํด์ค๊ทธ๋ฃน ์ ๋ณด
#ap-northeast-2a, ap-northeast-2c์ ์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ ๋ณดํธ ์ค์ ์ ๋ณด
#์ด ์ค ap-northeast-2a์ ๋ฉํ๋ฐ์ดํฐ ๋ณดํธ ์ค์ ์ ๋ณด ์ ๊ฑฐ
#Pod ๋ ๊ฐ๊ฐ Node ๋ณ๋ก ํ๊ฐ ์ฉ ๋ฐฐํฌ(netshoot-pod)
#์ด ์ค Pod1๋ฒ์ด ๋ฉํ๋ฐ์ดํฐ ๋ณดํธ ์ค์ ์ด ์ ๊ฑฐ๋์ด ์๋ Instance์ ๋ฐฐํฌ๋์ด ์์
#ํ๋1์์ EC2 ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด ํ์ธ(Token ์ ๋ณด ํ์ธ!)
#Pod2์์๋ EC2 ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ํ์ธ ํ ์ ์์ / ์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ ๋ณดํธ ์ค์ ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์!!
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: boto3-pod
spec:
replicas: 2
selector:
matchLabels:
app: boto3
template:
metadata:
labels:
app: boto3
spec:
containers:
- name: boto3
image: jpbarto/boto3
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
kubectl exec -it $PODNAME1 -- sh
-----------------------------
cat <<EOF> ec2.py
import boto3
ec2 = boto3.client('ec2', region_name = 'ap-northeast-2')
response = ec2.describe_instances()
print(response)
EOF
-------------------
python ec2.py
[์ค์ต๋ด์ฉ ์ ๋ฆฌ]
boto3๋ Python์ฉ AWS SDK๋ฅผ ๋งํ๋ค. ์ด boto3๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ AWS ์๊ฒฉ ์ฆ๋ช
์ด ํ์ํ๋ค.
์ ์ค์ต์์ boto3๋ AWS์ ์๊ฒฉ์ฆ๋ช
์, ์ฆ IAM ์ญํ ์ด ๊ตฌ์ฑ๋ EC2 Instance์ ์ธ์คํด์ค ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ boto3๋ฅผ ์ฌ์ฉํ ์ ์์๋ ๊ฒ์ด๋ค. ๋ค์ ๋งํด ์ธ์คํด์ค์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ํ์ทจํ๋ฉด ํด๋น ์ ๋ณด๋ฅผ ํตํด sdk๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ AWS ์ฝ์์์ ํ ์ ์๋ ๋ชจ๋ ํ์๋ฅผ sdk๋ฅผ ํตํด ์ ์ด ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.... ๋ฌด์์..!!!!๐ฅถ๐ฅถ
(์ถ์ฒ: https://tech.cloud.nongshim.co.kr/2021/03/12/boto3%EA%B0%80-aws%EC%9D%98-%EC%9E%90%EA%B2%A9%EC%A6%9D%EB%AA%85credentials%EC%9D%84-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EC%88%9C%EC%84%9C-from-python/)
๋ฏธ๊ตญ NSA(National Security Agency) / CISA(Cybersecurity and Infrastructure Security Agency)์์ ๋ฐํํ ์ฟ ๋ฒ๋คํฐ์ค ๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ทจ์ฝ์ ์ ์ ๊ฒํ๊ณ , ์ด๋ฅผ ๋์๋ณด๋ ํํ๋ก ๋ฆฌํฌํ
์ ํ๋ ์ทจ์ฝ์ ์ ๊ฒ ํด์ด๋ค. ๋ํ ์ฝ๋,CI/CD pipelines๋ฑ์ ์ทจ์ฝ์ ์ ๊ฒ๋ ๊ฐ๋ฅ
(์ถ์ฒ: https://github.com/kubescape/kubescape)
# ์ค์น
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
# Download all artifacts and save them in the default path (~/.kubescape)
kubescape download artifacts
tree ~/.kubescape/
cat ~/.kubescape/attack-tracks.json | jq
# ์ ๊ณตํ๋ ๋ณด์ ํ๋ ์์ํฌ ํ์ธ
kubescape list frameworks --format json | jq '.[]'
"AllControls"
"ArmoBest"
"DevOpsBest"
"MITRE"
"NSA"
"cis-eks-t1.2.0"
"cis-v1.23-t1.0.1"
# ์ ๊ณตํ๋ ํต์ ์ ์ฑ
ํ์ธ
kubescape list controls
# ํด๋ฌ์คํฐ ์ค์บ
kubescape scan --enable-host-scan --verbose
์คํ์์ค ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ฐ ์ฝ๋ ์ทจ์ฝ์ ์ ๊ฒ ํด / ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค ๋ฐฐํฌ ์ ์ทจ์ฝ์ ์ด ์๋ค๋ฉด ๋ฐฐํฌ๋ฅผ ๋ชปํ๊ฒ ์ ์ด(Admission Request -> Validating Webhook)
(์ถ์ฒ: https://github.com/FairwindsOps/polaris)
# ์ค์น
kubectl create ns polaris
#
cat <<EOT > polaris-values.yaml
dashboard:
replicas: 1
service:
type: LoadBalancer
EOT
# ๋ฐฐํฌ
helm repo add fairwinds-stable https://charts.fairwinds.com/stable
helm install polaris fairwinds-stable/polaris --namespace polaris --version 5.7.2 -f polaris-values.yaml
# CLB์ ExternanDNS ๋ก ๋๋ฉ์ธ ์ฐ๊ฒฐ
kubectl annotate service polaris-dashboard "external-dns.alpha.kubernetes.io/hostname=polaris.$KOPS_CLUSTER_NAME" -n polaris
# ์น ์ ์ ์ฃผ์ ํ์ธ ๋ฐ ์ ์
echo -e "Polaris Web URL = http://polaris.$KOPS_CLUSTER_NAME"
#netshoot-pod ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก ์ ์ฉ
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: netshoot-pod
spec:
replicas: 2 // pod ์
selector:
matchLabels:
app: netshoot-pod
template:
metadata:
labels:
app: netshoot-pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot:v0.9 // ์ด๋ฏธ์ง ํ๊ทธ
command: ["tail"]
args: ["-f", "/dev/null"]
imagePullPolicy: Always // ์ด๋ฏธ์ง ํญ์ pull
resources: // ๋ฆฌ์์ค ๊ด๋ จ ์ ํ
limits:
cpu: 150m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
securityContext: //securityContext
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
#runAsNonRoot: true
terminationGracePeriodSeconds: 0
EOF
# webhook ํ์ฑํ ์ ์ฉ
helm upgrade polaris fairwinds-stable/polaris --namespace polaris --version 5.7.2 --reuse-values --set webhook.enable=true
kubectl get pod,svc -n polaris
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: netshoot-pod
spec:
replicas: 1 //replicas๊ฐ1์ด๋ฉด ์ทจ์ฝ์ ์ผ๋ก ํ๋จ
selector:
matchLabels:
app: netshoot-pod
template:
metadata:
labels:
app: netshoot-pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot //์ด๋ฏธ์ง์ ํ๊ทธ ๋ฏธ์ค์
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
์ธ์ฆ(authentication): ์ฌ์ฉ์์ ๋ํ ํ์ธ์ผ๋ก ์ ์์ ์ธ ์ฌ์ฉ์ ์ธ์ง๋ฅผ ํ์ธํ๊ณ ์ ์ด ํ๋ ๊ฒ(์ถ์ฒ: https://kubetm.github.io/k8s/07-intermediate-basic-resource/authentication/)
์ธ๊ฐ(authorization): ์ธ์ฆ์ ๊ฑฐ์น ์ฌ์ฉ์๊ฐ ์ธ๊ฐ๋ ํ์๋ฅผ ํ๋์ง ํ์ธํ๊ณ ์ ์ด ํ๋ ๊ฒ(์ถ์ฒ: https://kubetm.github.io/k8s/07-intermediate-basic-resource/authentication/)
์ฒ์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ ํ์ ๋, ํด๋ฌ์คํฐ๋ฅผ kubeadm์ผ๋ก ๊ตฌ์ฑํ์๋ค.
๊ตฌ์ฑ์ ํ๊ณ ๋๋ฉด, kubectl ๋ช
๋ น์ด๋ฅผ ํตํด ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ์ ์์๋ค. ์ฆ API๋ฅผ ํตํด ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ์ ์์๋ค.
์๋ฌด์๊ฐ์์ด ์ฌ์ฉ์ ํ์ง๋ง, ์ด๋ ์ฌ์ค ๋ฆฌ๋
์ค์ Root ๊ณ์ ๊ณผ ๋์ผํ๊ฒ admin ๊ถํ์ ๊ฐ์ง๊ณ , API๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ ๊ฒ์ด๋ค.
#.kube/config ํ์ผ ํ์ธ
์ฌ์ฉ์๋ burst89.com / context๋ bursti89.com์ผ๋ก ๊ด๋ จ๋ ์ธ์ฆ์๊ฐ configํ์ผ์ ์ ์ฅ๋์ด ํด๋ฌ์คํฐ api๋ฅผ ์ฌ์ฉํ ์ ์์๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ ์ด๋ฌํ ์ธ์ฆ(์ธ์ฆ์ / kubectl / SubAccount) ๋ฐ์ธ๊ฐ(RBAC(Role Based Aceess Control))์ผ๋ก ๊ตฌํ๋์๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ฆฌ๋ ์ค์ฒ๋ผ ์ฌ์ฉ์ ๋ณ๋ก ํน์ ๊ถํ์ ์ ํํ๋ ์ฌ์ฉ์ ๊ณ์ ์ ์์ฑ ํ ์ ์๊ณ , ๊ณ์ ์ ๋ฐ๋ผ ํน์ ๋ค์์คํ์ด์ค์๋ง ์คํ์ ์ ํํ๊ฑฐ๋, ํน์ ์คํ ๊ธฐ๋ฅ๋ง ๋์ ํ ์ ์๊ฒ ์ง์ ํ ์ ์๋ค.
์ด๋ฒ ์ค์ต์์๋ ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด๋ฅผ ํตํด ํน์ ๋ค์์คํ์ด์ค์ ๋ํด์๋ง ๊ถํ์ ๊ฐ์ง๋ ์ฌ์ฉ์๋ฅผ ์์ฑํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค์ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ์ดํด๋ณด์!!
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: dev-kubectl
namespace: dev-team
spec:
serviceAccountName: dev-k8s
containers:
- name: kubectl-pod
image: bitnami/kubectl:1.24.10
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: infra-kubectl
namespace: infra-team
spec:
serviceAccountName: infra-k8s
containers:
- name: kubectl-pod
image: bitnami/kubectl:1.24.10
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
alias k1='kubectl exec -it dev-kubectl -n dev-team -- kubectl'
alias k2='kubectl exec -it infra-kubectl -n infra-team -- kubectl'
๊ถํ ํ์ธ(ํ์ฌ Role์ด ๋ฐ์ธ๋ฉ ๋์ด ์์ง ์์, ์ด๋ ํ ๋ช
๋ น์ด๋ ์คํํ ์ ์๋, ๊ถํ์ด ์๋ ์ํฉ)
Role ์์ฑ ๋ฐ ๋กค ๋ฐ์ธ๋ฉ
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: role-dev-team
namespace: dev-team
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
EOF
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: role-infra-team
namespace: infra-team
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
EOF
# ๋กค๋ฐ์ธ๋ฉ ์์ฑ : '์๋น์ค์ด์นด์ดํธ <-> ๋กค' ๊ฐ ์๋ก ์ฐ๋
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: roleB-dev-team
namespace: dev-team
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: role-dev-team
subjects:
- kind: ServiceAccount
name: dev-k8s
namespace: dev-team
EOF
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: roleB-infra-team
namespace: infra-team
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: role-infra-team
subjects:
- kind: ServiceAccount
name: infra-k8s
namespace: infra-team
EOF
๋กค ๋ฐ์ธ๋ฉ ํ์ธ
ํ์ธ(๊ฐ get pods ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ฐฐํฌ๋ Pod์ ์ ๋ณด ์ถ๋ ฅ)
[๊ณผ์ 1]
ํ๋์์ EC2 ๋ฉํ๋ฐ์ดํฐ์ IAM Role ํ ํฐ ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ(boto3), ์คํฐ๋์์ ์๊ฐํ ๊ฒ ์ด์ธ์ ๋ค๋ฅธ AWS ์๋น์ค(ํน์ Action)๋ฅผ ์ฌ์ฉ ํ ์ฝ๋๋ ์ค์ท์ ์ฌ๋ ค์ฃผ์ธ์
1. AdminAccessRole ์ถ๊ฐ
ํ์ฌ CLB ์ ๋ณด(clb name: a541ce16a8d874a53830b763c89ce9e0)
boto3 CLB ์ญ์ ์คํฌ๋ฆฝํธ ์์ฑ
boto3 lb์ ๋ณด ๋งํฌ:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elb/client/delete_load_balancer.html
import boto3
client = boto3.client('elb',
region_name = 'ap-northeast-2',
)
response = client.delete_load_balancer(
LoadBalancerName='a541ce16a8d874a53830b763c89ce9e0'
)
print(response)
์คํํ๋ฉด
service ํ์ธ ๋ฐ aws console LB ํ์ธ
LB๊ฐ ์ ์์ ์ผ๋ก ์ญ์ ๋ ๋์์ง๋ง, ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ ๋ณด์๋ ๊ฐ์ ์ญ์ ํ ๋ด์ฉ์ด ์ ์ฉ๋์ง๋ ์์ ๊ณ์ํด์ ๋ก๋๋ฒจ๋ฐ์ค๊ฐ ์กด์ฌํ๋๊ฑฐ ์ฒ๋ผ ์ ๋ณด ํ์!!
[๊ณผ์ 2]
์ฑ
398~400ํ์ด์ง - kubescape armo ์น ์ฌ์ฉ ํ ๊ด๋ จ ์ค์ท์ ์ฌ๋ ค์ฃผ์ธ์
1. cloud.armosec.io ํ์ ๊ฐ์
Dashboard ์ค์
์ค์น
๋์ฌ๋ณด๋ ํ์ธ
[๊ณผ์ 3]
polaris ๊ด๋ จ ์ค์ต(์๋ฌด๊ฑฐ๋) ํ ๊ด๋ จ ์ค์ท์ ์ฌ๋ ค์ฃผ์ธ์
1. ๊ธฐ์กด ์ค์ต์ ์ฌ์ฉํ๋ ๋ง๋ฆฌ์ค Deployment ์์ฑ ํ polaris ํ์ธ
2. ์ทจ์ฝ์ ์กฐ์ทจ ํ ํ์ธ
3. ๋ณ๊ฒฝ๋ yamlํ์ผ
[๊ณผ์ 4]
์ ๊ท ์๋น์ค ์ด์นด์ดํธ(SA) ์์ฑ ํ 'ํด๋ฌ์คํฐ ์์ค(๋ชจ๋ ๋ค์์คํ์ด์ค ํฌํจ)์์ ์ฝ๊ธฐ ์ ์ฉ'์ ๊ถํ์ ์ฃผ๊ณ ํ
์คํธ ํ ์ฝ๋๋ ์ค์ท์ ์ฌ๋ ค์ฃผ์ธ์
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secure
rules:
- apiGroups: [""]
resources: [""]
verbs: ["get", "watch", "list"]
#kubectl ๋ช
๋ น์ด๋ก clusterrole ์์ฑ!
k create clusterrole secure --verb=list --verb=get --verb=watch --resource=*
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
creationTimestamp: null
name: crb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: secure
subjects:
- kind: ServiceAccount
name: secure-k8s
namespace: secure-team
#kubectl ๋ช
๋ น์ด๋ก clusterrolebinding ์์ฑ!
k create clusterrolebinding crb --clusterrole=secure --serviceaccount=secure-team:secure-k8s
5. Aliase ์ค์
alias k3='kubectl exec -it secure-kubectl -n secure-team -- kubectl'
์ด๋ฒ 7์ฃผ์ฐจ ๋ง์ง๋ง ์คํฐ๋์์๋ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ณด์์ ๋ํด์ ํ์ตํ์๋ค. ๋ณด์์ ์ค์ํ ๋ถ๋ถ์ด๋ฉด์๋ ์ด๋ ค์์ ๋ณดํต ์ ์ฒด ์นดํ ๊ณ ๋ฆฌ ์ค์์ ๋ง์ง๋ง์ ์๊ฐ๋ฅผ ํ๋ค. ์ฐ๋ฆฌ ์คํฐ๋๋ ๋ง์ง๋ง ์คํฐ๋์ ๋ณด์์ ๋ํด์ ๋ฐฐ์ฐ๊ฒ ๋์๋ค. ํด๋ฌ์คํฐ์ ์ทจ์ฝ์ ์ ๊ฒ, ์ธ์คํด์ค์ Pod๋ณ ๊ถํ ๋ถ๋ฆฌ(IRSA)์ ์ค์์ฑ์ ์ง์ ํ์ธ ํ ์ ์์๋ค. ๋ํ ๊ณ์ (SubAccount/namespace)๋ฅผ ๊ตฌ๋ถํ์ฌ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๋ ํ๊ฒฝ๋ ์ค์ตํด ๋ณด์๋ค. ์ค์ ์ฟ ๋ฒ๋คํฐ์ค ์ด์ ์ ์ด๋ฌํ ๋ถ๋ถ์ ๊ธฐ๋ณธ์ค์์๋ ๊ธฐ๋ณธ์ด ๋ ๊ฑฐ ๊ฐ์์ ๋ง์ง๋ง ํ์ต๋ ๋ง์ ๋์์ด ๋์๋ค๊ณ ์๊ฐ์ด ๋ ๋ค.
์์ง ์ค๋ฌด์์ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค๋ฅผ ์ฌ์ฉํ์ง ์์, ์์ ๋ชจ๋ฅด์ง๋ง ์คํฐ๋์์ ๋ฐฐ์ด ๋ด์ฉ๊ณผ ์ ํ๋์ ์ฑ ์์ ๋ฐฐ์ด ๋ด์ฉ์ด ์ค๋ฌด์์ ๋ง์ ๋์์ด ๋ ๊ฑฐ ๊ฐ๋ค!!!
์งง๋ค๋ฉด ์งง์ ๊ธฐ๊ฐ์ด์์ง๋ง 4์ฃผ๋์ ์คํฐ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋๊ฒ ์ฝ์ง๋ ์์๋ค. ๊ธฐ์ด์ง์์ด ๋ถ์กฑํ๊ณ , AWS ์ง์๋ ๋ถ์กฑํ์ฌ ์คํฐ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋๋ฐ ๋ง์ด ํ๋ ๋ถ๋ถ๋ ์์๋ค. ๊ทธ๋๋ ์ด๋ ๊ฒ ๋ง์ง๋ง ์์ ๊น์ง ๋ฃ๊ณ ๊ณผ์ ๋ฅผ ์ ์ถํ ์ ์์ด์ ์๊ด์ผ๋ก ์๊ฐํ๋ค.
๊ฐ์๋ค๋, 24๋จ๊ณ ์ค์ต์ผ๋ก ์ ๋ณตํ๋ ์ฟ ๋ฒ๋คํฐ์ค ์ ์ ์ด์ ํ ๋๊ป ๋ค์ํ๋ฒ ๊ฐ์ฌ์ ๋ง์์ ์ ํฉ๋๋ค!!!!!