
์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ Action Controller Runner (์ดํ ARC) ๋ฅผ ์ด์ฉํด์ ํ๋๋ฅผ Self Hosted Runner ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ARC ๊ตฌ์กฐ๋ ์์ ๊ฐ์ต๋๋ค. Self Hosted Runner ๋ก ์ฌ์ฉํ ํ๋๋ฅผ RunnerDeployment ๋๋ RunnerSet ์ผ๋ก ๋ฐฐํฌํ ์ ์์ฃ . RunnerDeployment ๋ ์ฟ ๋ฒ๋คํฐ์ค์์ Deployment ์ ๋์ผํ๊ฒ ๋์ํ๊ณ , RunnerSet ์ StatefulSet ๊ณผ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. ๋ํ ๋ฐฐํฌํ๊ฒ ๋๋ฉด ํ๋ ์์ 2๊ฐ์ง ์ปจํ ์ด๋ ๋์ํ๊ฒ ๋๋๋ฐ, ํ๋๋ Github Action Job ์ ์ฒ๋ฆฌํ๋ Runner ์ปจํ ์ด๋, ๋ ํ๋๋ Docker ๊ด๋ จ ์ผ์ ์ฒ๋ฆฌํ๋ Docker ์ปจํ ์ด๋์ ๋๋ค. ์ต์ ์ ํตํด Runner..

Istio ๋ ํํ K8S ํด๋ฌ์คํฐ ๋ด์์ ์๋น์ค ๋ฉ์ ์ญํ ์ ํด์ค๋๋ค. ์๋น์ค ๋ฉ์ ๋ฟ๋ง ์๋๋ผ Nginx Ingress, ELB Ingress ์ฒ๋ผ Ingress ์ญํ ๋ํ ํด์ค๋๋ค. Istio Ingress Gateway ๊ฐ ์ ์ ๋ช ์นญ์ด๋ ์ฝ๊ฒ Istio Ingress ๋ก ์ง์นญํ๋๋ก ํ์ฃ ๐ค EKS ์ ๊ฐ์ ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋๋ฅผ ์ด์ฉํด์ Load Balancer Service ๋ฅผ ์์ฑํด์ฃผ๋ฉด ์๋์ผ๋ก CLB ๊ฐ ํ ๋น๋ฉ๋๋ค. ๋ฐ๋ผ์ Istio Ingress ๋ํ CLB ๋ก ํ ๋น์ด ๋ฉ๋๋ค. CLB ๋ ์์ผ๋ก AWS ์์ deprecated ๋๊ธฐ ๋๋ฌธ์ Network Load Balancer(์ดํ NLB) ๋ Application Load Balancer(์ดํ ALB) ๋ก ๋์ฒด๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ ์ด๋ฒ ๊ธ์..

Nginx ๊ธฐ๋ฐ์ Pod ๋ด์์ S3 ์ Mount ํ๊ธฐ ์ํด goofys ๋ฅผ ์ฌ์ฉํ๋ ์ ์ด ์์ต๋๋ค. (goofys ๋ง๊ณ EBS ๋ EFS ๋ ์์๋ฆฌ์คํธ์ ์์์ง๋ง, goofys ๊ฐ ๊ฐ์ฅ ์ ํฉํ๋ค๊ณ ํ๋จํ์ฌ goofys ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค) ๊ทธ๋ฆผ์ผ๋ก ํํํ์๋ฉด ์๋์ ๊ฐ์ฃ . Nginx ๊ฐ provisioning ๋ ๋ ConfigMap ์ผ๋ก init.sh ๋ฅผ ์ฃผ์ด goofys ๋ฅผ ๋ง์ดํธ ํ ํ ์คํ๋๋๋ก ํ์ต๋๋ค. ์ด๋ฐ์์ผ๋ก ๋ง์ด์ฃ . #!/usr/bin/env sh set -eu wget https://github.com/kahing/goofys/releases/latest/download/goofys chmod +x goofys /goofys /var/nginx ... nginx -g 'daemo..

์ฟ ๋ฒ๋คํฐ์ค๋ ๋ค๋ฅธ ํ๋ซํผ์ฒ๋ผ ์ธ์ฆ(Authentication)/์ธ๊ฐ(Athorization) ๋ฅผ ์ ๊ณตํด์ค๋๋ค. ๋ฐ๋ผ์ ์ธ์ฆ๋ฐ์ง ๋ชปํ ์ฌ์ฉ์๋ผ๋ฉด 401 (UnAuthorized) ๋ฅผ ์๋ต ๋ฐ๊ณ , ์ธ์ฆ์ ๋์์ง๋ง ๊ถํ์ด ์๋ค๋ฉด 403(Forbidden) ์๋ต์ ๋ฐ๊ฒ ๋์ฃ . ์์ฃผ ํ๋ฒํ ์ธ์ฆ/์ธ๊ฐ ํ๋ก์ธ์ค์ ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ธ์ฆ/์ธ๊ฐ๊ฐ ์๋ฃ๋์๋ค๊ณ ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์ ๋ฐ๋ก ์ ์ฉํ ์ ์๋ ๊ฑด ์๋๋๋ค. ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ์์ฒญ์ ์ ์ฉํ๊ธฐ ์ง์ ํ ๊ตฐ๋ฐ๋ฅผ ๋ ๋ค๋ฆฝ๋๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก Adimission Controller ์ ๋๋ค. ์ด๋ฒ ๊ธ์์๋ Adimission Controller ์ ๋ํ ๊ฐ๋ ์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ณ , Adimission Controller ๋ฅผ ๊ตฌํํด๋ณผ ์๊ฐ์ ๋๋ค. ๐ Admission Controller ๊ฐ..

Iptables ๋ฅผ ์์๋ณด๊ธฐ ์ ์ ๋จผ์ Netfilter ์ ๋ํด ์์๋ณด์ฃ ! Netfilter ์ Iptables AWS EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ Security Group ์ด๋ผ๋ ๊ฒ์ ์ค์ ํฉ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก ์ธ๋ถ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ์กฐ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐฉํ๋ฒฝ ๊ธฐ๋ฅ์ด์ฃ . EC2 ์ธ์คํด์ค ์๋จ์ ์ด๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ์๋ง ๋ฌผ๋ฆฌ์ ์ธ ๊ธฐ๊ณ๊ฐ ์์ด์ ์ด๋ค ํธ๋ํฝ์ ํ์ฉํ๊ณ , ์ด๋ค ํธ๋ํฝ์ ๊ฑฐ๋ถํ๊ฒ ์ฃ . Security Group ์ด ํ๋์จ์ด ๋ฐฉํ๋ฒฝ ์ด๋ผ๋ฉด Netfilter ๋ ์ํํธ์จ์ด ๋ฐฉํ๋ฒฝ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. Netfilter ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค. ์ํํธ์จ์ด ๋ฐฉํ๋ฒฝ ํจํท ํํฐ๋ง ๋ฆฌ๋ ์ค ์ปค๋ ๋ด๋ถ์ ํ๋ ์์ํฌ ํฌํธ ์ฃผ์, ๋ณํ, ํฌํธ ํฌ์๋ฉ ๋ฐ ํจํท ๋ณ๊ฒฝ ๋ผ์ฐํ ์ ํ์ ๋ฐ์ดํฐ ๋ฐ..

ํ ๋ผํผ์ Code ๋ก ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ์ ์๊ฒ ๋์์ฃผ๋ IaC Tool ์ ๋๋ค. ํนํ AWS ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ๋ ์ฐธ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ฃ . module ์ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ง ์๊ฒ VPC, EKS, ELB ๋ฅผ ์์ฑํ๊ณ ์ฝ๋๋ฅผ ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ํ ๋ผํผ์ ์ด์ฉํด EKS ๋ฅผ ๊ตฌ์ถํ๋ ๊ณผ์ ์์ ๊ฒช์ ๋ฌธ์ ์ ๊ณผ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณผ๊น ํฉ๋๋ค. ์ฐ์ Apply!! terraform-aws-eks ์ ๊ฐ๋ณด๋ฉด ์์ฃผ ์น์ ํ๊ฒ ํ ๋ผํผ์ ์ด์ฉํด EKS ๋ฅผ ๊ตฌ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋ ค์ค๋๋ค. ๋ฌด์์ eks ๋ชจ๋์ import ํ๊ณ example ๊ณผ EKS Best Practices Guides ์ฐธ๊ณ ํ์ฌ ํ ๋ผํผ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. provider "kubernetes" { h..

์ Helm ์ ์ฌ์ฉํ๋์? Helm ์ด ๋ฌด์์ธ์ง ์์๋ณด๊ธฐ ์ ์ ์ ํ์ํ์ง ๋จผ์ ์์๋ณด์ฃ ! ๐ง Consistency ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฆฌ์์ค๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด ์๋ ์ด๋ฏธ์ง์ฒ๋ผ yaml ๋ก ์์ฑํด์ฃผ์ด์ผํฉ๋๋ค. yaml ์ด 1,2 ๊ฐ๋ผ๋ฉด ๊ด๋ฆฌ๊ฐ ์ด๋ ต์ง ์๊ฒ ์ง๋ง 10๊ฐ ์ ๋๋ง ๋๋ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ํ๋ค๊ณ ๋ถํธํด์ง๋๋ค. ๋ํ kubectl edit์ ํตํด ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธ ํด์ค ์ ์๋๋ฐ, ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ๊ด๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ค๋ฉด ์ผ๊ด์ฑ(Consistency) ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Revision History ์ด๋ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด Deploy, ConfigMap, Service, Ingress yaml ๋ก ๋ฐฐํฌ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์ฃ . ์ด๋ ConfigMap ๊ณผ Service ๊ฐ ์ ๋ฐ์ดํธ ๋์ด์ yaml ์ด ๋ณ..

EFS (Elastic File System) ์ AWS ์ ํ์ผ ์์คํ ์๋น์ค์ ๋๋ค. EBS, S3 ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ฐ๊ฐ ์ฐ์์ ๋ชฉ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์์ ์ ๋ชฉ์ ์ ๋ง๊ฒ ์ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค. EFS S3 EBS ์ฌ์ฉ ์ผ์ด์ค ํ๋ผ์ด๋น ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ์ํฐํ๋ผ์ด์ฆ๊ธ ๋ฐ์ดํฐ ๋ฐฑ์ ์น ์๋น์ค ๋ฐ ์ปจํ ์ธ EC2 ์ ๋ถํ ๋ณผ๋ฅจ ๊ทธ๋ฆฌ๊ณ AWS DataSync ๋ฅผ ์ด์ฉํ๋ฉด ์ ์ฅ์์ ๋ฐ์ดํฐ๋ค์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ฎ๊ธธ ์ ์์ต๋๋ค. ๊ฐ์ VPC ๋ด ์ ์ฅ์๋ ๋ฌผ๋ก ๋ค๋ฅธ VPC, ๊ต์ฐจ ๊ณ์ ๋ชจ๋ ๊ฐ๋ฅํฉ๋๋ค. โ ๋ค๋ฅธ VPC, ๊ต์ฐจ ๊ณ์ ์ ์๋ก์ VPC ๊ฐ Peering ๋๊ฑฐ๋ TGW ๋ก sharing ๋ ์ํ์ฌ์ผ ํฉ๋๋ค ์์ธํ ๋์ ๋ฐฉ์์ ํ์ธํ๋ ค๋ฉฐ ์ฌ๊ธฐ๋ฅผ ๋๋ฌ์ฃผ์ธ์ ๊ทธ๋ผ ๊ฐ๋จํ๊ฒ ํ๋ฒ DataSy..

์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ฒ์ User Account ์ Service Account ๋ฅผ ์ ํ์ ๋ ๋จ์ํ ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์๊ฒ ์๊ฒฉ ์ฆ๋ช ํ๋ ๋ฆฌ์์ค์ธ๊ฐ๋ณด๋ค ํ๊ณ ๋์ด๊ฐ๋ ์ ์ด ์์ต๋๋ค. ์ดํด๊ฐ ์๋์ ๊ทธ๋ฅ ๋์ด๊ฐ๋.. ๊ทธ๋์ User Account ๋ Service Account ๋ ๋น์ทํ๊ฑฐ !! ๊ฐ์ ๊ฑฐ !! ๋ผ๋ ์๊ฐ์ ๊ฐ์ง๊ณ ์์์ฃ .. ํ์ง๋ง ์ด ๋์ ๋ถ๋ช ๋ค๋ฆ ๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค์๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ด์ ์กด์ฌํ๋ ์์์ ๋ํ ์ ๊ทผ์ ์ํ 2๊ฐ์ง์ account ํ์ ์ด ์กด์ฌํฉ๋๋ค. User Account Service Account ์ฟ ๋ฒ๋คํฐ์ค ๊ณต์ ๋ฌธ์์๋ ์ด์ ๊ฐ์ด ๋์์์ต๋๋ค. ์ฌ์ฉ์ ์ด์นด์ดํธ๋ ์ฌ๋์ ์ํ ๊ฒ์ด๋ค. ์๋น์ค ์ด์นด์ดํธ๋ ํ๋์์ ์คํ๋๋ ํ๋ก์ธ์ค๋ฅผ ์ํ ๊ฒ์ด๋ค. 100% ๋ง๋ ๋ง์ด์ง๋ง..

๐ eksctl ๊นํ ๐ eksctl ๊ณต์ ๋ฌธ์ ๐ eksctl config file example eksctl ์ค์น curl --silent --location "(uname -s)_arm64.tar.gz" | tar xz -C /tmp sudo mv /tmp/eksctl /usr/local/bin eksctl version EKS ๊ตฌ์ฑ eks ๋ ์๋ง์กด์ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ด๋ฉฐ, eksctl ์ eks ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ์ปค๋งจ๋ ํด eksctl ๊ณต์ ๋ฌธ์๋ ๊ต์ฅํ ์น์ ํ ํธ์ด๋ผ๊ณ ์๊ฐ ๐ก eksctl ์ EKS ๋ฅผ ์ํ ์ปค๋งจํธ ํด์ด๋ฏ๋ก aws configure ๊ฐ ๋ ์ํ์ฌ์ผ ํจ aws ๋ก๊ทธ์ธ aws configure 1. Using Config Files (๊ฐ์ฅ ๊ธฐ๋ณธ) apiVersi..

S3๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๋ฒํท ๋ด ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ํ ํ ์ ์์ต๋๋ค. ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ์ ํ์ฑํ ํ๊ฒ ๋๋ฉด ์์์ ์์ ํ๊ฒ ๋ณดํธํ ์ ์์ง๋ง, ์ธ๋ถ์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํด s3 ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ S3๋ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ์ ํ๋ฉด์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ฃผ๋๋ฐ, ๊ทธ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ณ ์ ํฉ๋๋ค. Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)/๋ค์ด๋ก๋(GET) ํ๊ธฐ Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)๋ฅผ ์งํํ๊ณ , ๋ค์ด๋ก๋๋ ์๋ฒ๋ฅผ ํ๋ก์๋ก ๋์ด ์๋ฒ์์ S3์ ์ ๊ทผํ์ฌ ๋ค์ด๋ก๋(GET)ํ๊ธฐ Pre-Signed-URL ์ ์ด์ฉํ์ฌ S3 ๊ฐ์ฒด ์ ๋ก๋(PUT)๋ฅผ ์งํํ๊ณ , ๋ค์ด๋ก๋๋ goofys๋ฅผ ์ฌ์ฉํ์ฌ S3..

์ด ๊ธ์ ๋ด์ฉ์ [์ดํํฐ๋ธ ์ฝํ๋ฆฐ]์ ์ฐธ๊ณ ํฉ๋๋ค. ๋๋ก๋ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์ ๋ฌํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์๋ ์ฝ๋์ฒ๋ผ ๋ง์ด์ฃ . data class Player( val id: Int, val name: String, val points: Int ) val player = Player(0, "Gecko", 9999) data ํ์ ์๋ ์๋์ ํจ์๋ค์ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค. toString equals ์ hashCode copy componentN(component1, component2 ๋ฑ) toString ํด๋์ค์ ์ด๋ฆ๊ณผ ๊ธฐ๋ณธ ์์ฑ์ ํํ๋ก ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ ์ถ๋ ฅ ํด์ค๋๋ค. ์ฃผ๋ก ๋ก๊ทธ ์ถ๋ ฅ์ด๋ ๋๋ฒ๊น ํ ๋ ์ฌ์ฉํฉ๋๋ค. println(player) // Player(id=0, name=Gecko, p..

์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. JWT ์์ฑํ๊ธฐ JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ (์งํ) ๊ตฌํ AuthController @RestController @RequestMapping("/auth") class AuthController( private val authService: AuthService ) { /** * token ์์ฑํด์ ๋ณด๋ด์ฃผ๊ธฐ */ @GetMapping("/login") fun login(@AuthenticationPrincipal oAuth2User: OAuth2User): ResponseEntity { return ResponseEntity.ok(authService.login(oAu..

์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. JWT ์์ฑํ๊ธฐ JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ (์งํ) JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ ๊ตฌํ JwtFilter class JwtFilter( private val jwtProvider: JwtProvider ) : OncePerRequestFilter() { override fun doFilterInternal( request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain ) { val jwt = jwtProvider.resolveToken(request) if (StringUtils.hasText(jwt) && ..

์ด์ด์ ๊ณ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. JWT ์์ฑํ๊ธฐ JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ (์งํ) ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ ๊ตฌํ @Component class JwtProvider( private val memberRepository: MemberRepository ) { companion object { private const val AUTHORITIES_KEY = "auth" private const val BEARER_TYPE = "bearer" private const val ACCESS_TOKEN_EXPIRE_TIME = (1000 * 60 * 30) private const val REFRESH_TOKEN_EXPIRE_TIME..