์ฟ ๋ฒ๋คํฐ์ค๋ ๋ค๋ฅธ ํ๋ซํผ์ฒ๋ผ ์ธ์ฆ(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..
์ด๋ฒ ๊ธ์์๋ Spring Security + Google Oauth2 + JWT๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ตฌํ ์์ฒด๊ฐ ๋ชฉ์ ์ด๋ฏ๋ก ์์ธํ ์ค๋ช ์ ์๋ตํฉ๋๋ค. ์งํํ๊ธฐ ์์ Google Oauth2 Client_ID, Client_Secret๋ ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์ผ์๊ธธ ๋ฐ๋๋๋ค :) ์๋์ ๊ฐ์ ์์๋ก ์งํ๋ฉ๋๋ค. JWT ์์ฑํ๊ธฐ (์งํ) JWT์ ๊ถํ ์ถ๊ฐํด์ฃผ๊ธฐ ์์ฑํ JWT์ ๋ํด ์ธ์ฆ/์ธ๊ฐ ํ๊ธฐ JWT ์ฌ๋ฐ๊ธ ํด์ฃผ๊ธฐ ์ด๋ฒ ๊ธ์์๋ JWT ์์ฑํ๋ ๋ถ๋ถ์ ๋ํด ์งํํฉ๋๋ค. ๊ตฌํ build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.6.8" id("..
์ฌ์ฌ์ฉ์ ์ํ ๊ณผ๋ํ ์ ์ฐ์ฑ ๋ค์ํ ํ์ ์ ๋์ผํ ๋ก์ง์ ์ ์ฉํ๊ธฐ ์ํด ์ฝ๋ ์ฌ์ฌ์ฉ์ ๊ณผ๋ํ๊ฒ ํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ถ Any๋ก ๋ฐ๋ ๊ฒ์ด ๋ํ์ ์ธ ์์์ ๋๋ค. open class Car class K3 : Car() class Avante : Car() //โ์ฐจ์ ๋ํ ์ค๋ช ์โ ํจ์ fun getInstruction(car: Array) { println("car = ${car.size}") } ๋ง์ด ๊ทน๋จ์ ์ธ ์์ ์ด๊ธฐ๋ ํฉ๋๋ค.. open class Fruit class Apple : Fruit() fun main() { val k3 = K3("k3", "๊ธฐ์") val avante = Avante("์๋ฐ๋ผ", "ํ๋") val fruits: Array = arrayOf(Apple())..
์ง๋ ํฌ์คํ ์์๋ OCP์ DIP๊ฐ ์๋ฐฐ ๋๋ ๊ฒฝ์ฐ์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ์ด๋ฒ์๋ ์คํ๋ง์ด ์๋ ์์ ์๋ฐ๋ก ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค. ์ ๊น ์ง๋ ๊ธ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. public class DriverImpl implements Driver{ Car car = new K3(); Engine engine = new Electronic(); @Override public void findOwnCarDetail() { car.findCarName(); car.findCarBrand(); engine.WayToMove(); } } DriverImpl ์ญํ ์ ๊ตฌํ์ฒด๊ฐ ์ง์ new ํค์๋๋ก ์ ์ธ ๋์ด ์์ต๋๋ค. ์ด๋ด ๊ฒฝ์ฐ ์ผํ๋ณด๋ฉด OCP์ DIP๋ฅผ ์ ์งํจ ๊ฒ ๊ฐ์ง๋ง ์ฌ์ค ์๋๋ผ๊ณ ์ง๋ ํฌ์คํ ์์ ..