CodeDeploy์ ํ ์์น
์๋ ํ์ธ์. StyleShare์์ ์ปค๋จธ์ค ๊ฐ๋ฐ์ ๋งก๊ณ ์๋ ๊ฐ์ฑ์ฉ์ ๋๋ค. ๋ ๋ชจ๋ ๊ฐ๋ฐ์๋ค์ด ๊ทธ๋ฌํ๋ฏ, ์ด๋๊ฐ์ ์ฌ๋ผ๊ฐ๋ ๊ธ์ ์๋๋ ๊ฑฐ์ฐฝํ ์ฃผ์ ์ฌ์ผ ํ๋ค๋ ๊ฐ๋ฐ์ ์ด์ฌํ ๊ธ์ ์ฐ๋ค(ํน์ ๊ทธ๋ฐ ์๊ฐ์ ํ๋ค๊ฐ), ๋ฒ์จ ์ ์ฌ ์ดํ 10๊ฐ์์ด ์ง๋ฌ์ต๋๋ค.
์ด๋ฐ ์์ด๋ผ๋ฉด ์๋ฌด๋ ์์ํ ๊ธ์ ์ฐ์ง ๋ชปํ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์์ฃผ ๊ฐ๋จํ ๊ธ๋ก ์์ํด๋ณผ๊น ํฉ๋๋ค.
๋ง์ ๋ถ๋ค์ด CodeDeploy๋ผ๋ ๋ง์ ๋ค์ด๋ณธ ์ ์์ ๊ฒ์ ๋๋ค. ์จ๋ณด์ ๋ถ๋ค๋ ๊ณ์ค ๊ฒ์ด๊ณ , ์ ์จ๋ณด์ ๋ถ๋ ๊ณ์ค ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ์ ๊ณ ๋ คํ๋ ๋ถ๋ ๊ณ์ค ๊ฒ์ ๋๋ค. ์ด ๊ธ์ด ๊ทธ๋ฌํ ๋ฐฐํฌ ๋๊ตฌ๋ฅผ ์ ํํ ๋ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
CodeDeploy๋ 2014๋ ๊ฒฝ์ ๋ฑ์ฅํ์ต๋๋ค. ๋น์์๋ ์ด๋ฏธ ECS๋ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ECS๋ ํน์ ํ ๊ธฐ์ (Docker)์ ๊ฐ์ํ๋ค๋ ๋จ์ ์๋ ๋จ์ ์ด ์์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ CodeDeploy๋ Docker๋ฅผ ์ ์ฉํ ์ ์๋ ํน์ ํ๊ฒฝ์์ ์์ ์ ํด์ผ ํ๋, ์ ๊ทธ๋๋ ์ด๋ฏธ ๊ฐ์ํ ๋ Cloud ํ๋ซํผ ์์์ ๋ ์ด์์ Virtualization Overhead๋ฅผ ์๊ธฐ ์ซ์, ๊ทธ๋ฆฌ๊ณ Task์ Task Definition, Service, Revision ๋ฑ์ ๊ตฌ๋ถํ๋ต์๊ณ ๋ง๋ค์ด์ง ํญ๊ณต๊ธฐ ๋์๋ณด๋๋งํผ์ด๋ ๋ณต์กํ ๋์๋ณด๋๋ฅผ ๋ณด๊ธฐ ์ซ์, ๋ ๊ทธ๋ฐ ์์ค์ revision์ versioning ์ UUID์ง๋ง task definition ์ versioning ์ incremental ํ ํํ์ ๋์ด๋ธํ postfix๋ฅผ ๊ฐ์ ํ๋ ์์ผํจ์ ํ๊ฐ ๋, ์๋ฌดํผ ๊ฐ์ข ์ด์ ๋ก ECS๊ฐ ๋ง์์ ๋ค์ง ์๋ ์์ง๋์ด๋ค์๊ฒ๋ ํ๋์ ๋์์ด์์ต๋๋ค.
ํนํ๋ Deployment์ ์์ด์ ๋น์๋ Environmental Deployment์ Source code Deployment๊ฐ ํผ์ฌ๋์ด ์ด๋ฅผ ๊ตฌ๋ถํ๋ ค๋ ๋ชธ๋ถ๋ฆผ์ด ์กด์ฌํ์ต๋๋ค. CodeDeploy๋ ๊ทธ๋ฌํ ์์ด๋์ด์ ๊ธฐ๋ฐํด, ์์ํ AWS์ ํ๊ฒฝ ์์์ Source code Deploy์ Environmental Deploy๋ฅผ ๋ด๋ถ์ ์ผ๋ก ํ์คํ ๊ตฌ๋ถํ๋ฉด์๋ ์ฌ๋ฆฌ์คํ๊ฒ ๋์์ํฌ ์ ์๋ค๋, ์ฆ ECS์ฒ๋ผ ์ดํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ์ ์์ค์ฝ๋ ๋ฐฐํฌ๋ฅผ implicitํ๊ฒ ๋์ด๊ฐ์ง ์๊ณ ๋ ๊ทธ๋งํผ์ ๊ธฐ๋ฅ์ฑ์ ํ๋ณดํ ์ ์๋ค๋ ํ์ ์ ๊ฐ์ง๊ณ ์์ํ ํ๋ก์ ํธ๋ก ๋ณด์ ๋๋ค(๋ฌผ๋ก ์ ๋ AWS ๊ฐ๋ฐ์๊ฐ ์๋๋ ์ง์ค์ ์ ์ ์์ต๋๋ค).
์์ ์ ์ด์ 90%์ด์ ์ผ์นํ๋ ์ปจ์ ์ Beanstalk ๋ผ๋ ์ ํ์ด ์กด์ฌํ๊ธด ํ์ต๋๋ค๋ง ์ฌ๋๋ค์ ๋ ๊ฐ์ ๊ฟ์ ๊พธ๊ณ ๋ค์์๋ ๋ ์ ํ ์ ์์ผ๋ฆฌ๋ผ๊ณ ์ค์ค๋ก ์๊ฐํ๊ณค ํฉ๋๋ค. ์ ๋ ์ด๋ฌํ ํ๋๋ฅผ ์กด๊ฒฝํฉ๋๋ค. ์ธ๊ฐ์ด ๋ณต์ด๋ฅผ ๋จน๊ฒ ๋ ์ด์ ๋ ๊ฒฐ๊ตญ ๊ฐ์ ์ด์ ์ผ ํ ๋ ๋ง์ ๋๋ค(๋จน์ผ๋ฉด ์ฃฝ๋ ์์์ ํ๋ ๊ฑด ๋ค๋ฅธ ๋ฌธ์ ์ ๋๋ค๋ง).
CodeDeploy์ ์ด๋ฌํ ์๋๋ ์ผ๋ถ ์ฑ๊ณต์ ๊ฑฐ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๊ธฐํ ์ด์ ๋ค๋ก ์ธํด ๊ธฐ์กด์ ๋ฐฐํฌ ๋๊ตฌ ์์ฅ์ ๋ค์์ง๋ ๋ชปํ์ต๋๋ค. ๋ง์ฝ ๊ทธ๋ฌ๋ค๋ฉด Kubernetes์ EKS์ ์ถํ์ ์กฐ๊ธ ํ๊ฐ ๋์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ๋์ ์ธํ๋ผ์คํธ๋ญ์ณ ์์ฅ์๋ Kubernetes๊ฐ Gamechanger๋ก์จ ๋ฑ์ฅํ๊ณ ์ผ๋ฆฌ์ด๋ตํฐ๋ค์ ๊ธฐ๋ค๋ ธ๋ค๋ ๋ฏ EKS๋ก ์ฎ๊ฒจ๊ฐ๋ ์ถ์ธ์ ๋๋ค. ๊ทธ๋งํผ ์ฌ๋๋ค์ ๊ธฐ์กด์ ๋ฐฐํฌ ๋๊ตฌ์ ๋ง์กฑํ์ง ๋ชปํ๊ณ ์๋ค๋ ๋ป์ด๊ธฐ๋ ํฉ๋๋ค.
์ด ๊ธ์ 2019๋ ์ CodeDeploy๋ฅผ ์ ์ฉํ๋ ค๋ ํ์ฌ๋ค์ ์ํด ๋จ๊ธฐ๋ ๋ฉ๋ชจ์ ๋๋ค. ์ด๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ ์ถํ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ๊ธฐ์ ์ ํ์ ๋์์ด ๋๊ธธ ๋ฐ๋๋๋ค.
CodePipeline๊ณผ ์ฌ์ฉ์ ์ฃผ์ํ ์
CodePipeline ์ AWS์ ๊ฐ์ข ์ธํ๋ผ์คํธ๋ญ์ณ๋ค์ Lambda๋ก ์ฒด์ด๋ํ์ฌ invokeํจ์ผ๋ก์จ Continuous Deployement ๋ผ๋ ๋ชฉ์ ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๋๊ตฌ์ ๋๋ค. ๋ณดํต ํ๋์ pipeline ์ AWS Codecommit/Github - Codebuild/Jenkins - Manual Approval - Codedeploy/EKS/ECS ๋ฑ์ ํํ๋ก ๊ตฌ์ฑ๋๊ณค ํฉ๋๋ค.
์ด ๋๊ตฌ๊ฐ ํ๋ ํ์๊ฐ Continuous Integration ๊ณผ ๋ฌด์จ ์ฐจ์ด๊ฐ ์๋์ง๋ ์ด๋ ดํ์ด ๊ฐ์ด ์ค๋ ๋ถ๋ ๊ณ์ค ๊ฒ์ด๊ณ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ ๋ถ๋ ๊ณ์ค ๊ฒ์ ๋๋ค. ์ผ๋จ์ ์์ชฝ์ ์๊ฐ์ด ๋ชจ๋ ๋ง์ต๋๋ค. ์ ์๋ ์ฐจ์นํ๊ณ , ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ ์๊ฒฌ์ด ํ๋นํ๋๋ฉด CodePipeline์ ์์ฑ๋๊ฐ ๊ทธ๋ฆฌ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ปจ์ ๋ง ๋ณด์๋ฉด CodePipeline์ ๊ฐ์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํด Multi branch deployment ๊ฐ์ ๊ฑธ ์ง์ํด์ผ ํ ๊ฒ ๊ฐ์ง๋ง ์ํ๊น๊ฒ๋ ๊ทธ๋ฐ ๊ธฐ๋ฅ์ ์ง์ํ์ง๋ ์์ต๋๋ค. ๋ง์ฝ ์ด๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด Terraform ๋ฑ์ ๋ณ์ฉํ์ฌ ๋ด๋ถ์ ์ผ๋ก ์ธํ๋ผ๋ฅผ ๋ณ๋๋ก ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
์, ์ฃ์กํฉ๋๋ค. ์ ๊ฐ ๋ฐฉ๊ธ ๋๋ฌด ์์ด ๋ณด์ด๊ฒ ์ด์ผ๊ธฐํ์ต๋๋ค. ์ ์ ํ๊ฒ ์ต๋๋ค. ์ผ์ผํ ๋ธ๋์น๋ง๋ค Pipeline์ ์์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค๋ ์ด์ผ๊ธฐ์ ๋๋ค. ๊ฒฐ๊ตญ ํน์ IaC solution ๋ฑ์ ํตํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์ด์ ์ผ๋ฐ์ ์ผ๋ก production๊ณผ staging์ฉ๋๋ก ์ฌ์ฉํ๋ ์ดํ๋ฆฌ์ผ์ด์ ๋ ๊ฐ ์ ๋ ๋์ฐ๋ ๊ฒ ์ผ๋ฐ์ ์ธ ํจํด์ด ๋ฉ๋๋ค.
๋จ์ ์ ๋จผ์ ์ด๊ฑฐํ์ผ๋ CodePipeline๊ฐ ๊ฐ์ง๋ ์ฅ์ ์ ์๋นํ ํฝ๋๋ค. ์์๋ค์ํผ Lambda์ ์ปจ์ ์ ๋งค์ฐ ๋จ์ํฉ๋๋ค. ์ผ์ข ์ function์ด์ฃ . argument๋ฅผ ๋ฐ์์ executeํ๊ณ ํ์ํ ๊ฒฝ์ฐ return์ ํ๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๋ํด์, ํ๋์ pipeline์ ๋์ผํ scope์์์ ์์ฐจ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์ผ์ข ์ sequential programmable flow-chart block์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
์ด๋ฌํ ์ปจ์ ์ AWS์ ๊ฐ์ข ์๋น์ค์ ๊ฒฐ๋ถ์ํค๋ฉด ๊ฝค ์ธ ๋งํ ์๋น์ค๊ฐ ๋ฉ๋๋ค. ์๋ฐฑ๊ฐ์ ์๋น์ค๊ฐ ๋ฒ๋ํ๋ ๋ง์ดํฌ๋ก-์๋น์ค-์ํคํ ์ณ ์๋์ ์ฝ๋/๋น๋/๋ฐฐํฌ๋ฅผ ์ผ๊ด์ ์ผ๋ก ํ๋์ ํ๋ฉด์์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค. ์ฌ์ง์ด ์ด๋ฏธ ์๋ ๊ฒ๋ค์ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฑ ๋น์ฉ์ด ํฌ์ง๋ ์์ต๋๋ค.
๋ฌผ๋ก ์ด๊ฒ์ ์ฌ๋ฌ๋ถ์ด AWS์ฅ์ ๊ฐ ๋๋ฉด ์์ฌ์ ์๋น์ค๊ฐ ์ค๋จ๋๋ ์๋์ ํ์ด๋ฌ๊ธฐ ๋๋ฌธ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ง๋ฅ ๊ธฐ๋ปํ ์ผ์ ์๋๋๋ค.
CodePipeline๊ณผ ํจ๊ป ์ฌ์ฉํ ๋, CodeDeploy๊ฐ ์ ๋ฌ๋ฐ๋ Build Artifacts์ ํ์ฅ์๋ช ์ .zip์ด ์๋๋๋ค
์ง์ง ๋ฐฐํฌ ํ์ผ์ Location
CodePipeline์ ํตํด invoke๋ ํ๋ก์ ํธ๊ฐ Codebuild์์ ๋๊ฒจ์ฃผ๋ Build Artifacts๋ Build step์ด ๋๋๊ณ S3์ ์ ๋ก๋๋ ๋ H4VB3Iu ๊ฐ์ 7๊ธ์์ Alphanumeric ํ ์ด๋ฆ์ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ step์ผ๋ก(CodeDeploy๋ก) s3://bucket-name/application/H4VB3Iu.zip ์ด๋ผ๋ ์ด๋ฆ์ ๋๊ฒจ์ฃผ๋ ์ฒ ํ์ง๋ง ์ฌ์ค ๊ทธ๊ฒ์ Display name์ด ๊ทธ๋ด ๋ฟ์ด๊ณ ์ค์ Location์ s3://bucket-name/application/H4VB3Iu์ ๋๊ฒจ์ค๋๋ค.
๊ทธ๋์ผ CodeDeploy ์ ์ฅ์์๋ H4VB3Iu๋ผ๋ ํ์ผ์ด zip์ผ๋ก ์์ถ๋์ด ์๋ค๋ ์ฌ์ค์ ์ ์ ์์ผ๋ฉด์๋ ์ค์ ํ์ผ ์ด๋ฆ์ H4VB3Iu์ผ ์ ์์ผ๋๊น์. ์ด๋ CodePipeline์ผ๋ก ํธ์ถ๋๋ CodeDeploy๊ฐ ๊ฐ์ง ์๋ฌต์ ์ธ ์ฝ์์ผ๋ก ๋ณด์ ๋๋ค.
๋ค, ๋์์ด ์กฐ๊ธ ์ด์ํฉ๋๋ค.
๋ฌผ๋ก ๋์์ด ์ด์ํ ๊ฒ๊ณผ๋ ๋ณ๊ฐ๋ก ์ผํ ๋ณด๊ธฐ์ ์ฌ์ฉํ๋ ๋ฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์์ด ๋ณด์ ๋๋ค. ์ด์ฐจํผ ๋จธ์ ์ด flow๋ฅผ ์ปจํธ๋กค ํ๋ ์ด์ ์ด๋ฐ metadata๋ ์ธ๊ฐ์๊ฒ ์ฐธ๊ณ ์ฉ์ผ ๋ฟ์ด๋๊น์.
๋ฌด์จ ์ผ์ด ์ผ์ด๋์ง๋ง ์๋๋ค๋ฉด ๋ง์ ๋๋ค. ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด๋ ์๊ฐ์ด ํ์ฐธ ์ง๋ ๋ค์ ๋กค๋ฐฑ ๋ฑ์ ๊ฐ์ข ์ด์ ๋ฅผ ๋ CodePipeline์ ํตํ์ง ์์, CodeDeploy ๋จ์ผ ์คํ์ ํตํ ๋ฐฐํฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฐ ์ผ์ ์์ฃผ ์ผ์ด๋ฉ๋๋ค.
์ฌ๋ฐ๊ฒ๋ CodeDeploy๋ ์ด ๋ s3://bucket-name/application/H4VB3Iu๋ผ๋ ์ด๋ฆ์ด ์๋s3://bucket-name/application/H4VB3Iu.zip๋ผ๋ ์ด๋ฆ์ Build Artifact๋ฅผ ์๋์์ฑํฉ๋๋ค(์ฌ์ง์ด, zip์ด๋ผ๋ ํ์ฅ์๋ฅผ ์ ๊ฑฐํ๋ฉด ์๋์์ฑ์ด ๋์ง๋ ์์ต๋๋ค). ์๋๋ฉด ์ด์ ๋ฐฐํฌ ์ด๋ ฅ์ ๊ทธ๋ ๊ฒ ๋จ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ๋ฏฟ๊ณ ๋ฐฐํฌํ๋ค๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋จ์ง ์๊ณ ๋ฐฐํฌ๊ฐ ์คํจํ๋ ๋ชจ์ต์ ๋ณด์ค ์ ์์ต๋๋ค. ์ฌ์ง์ด ์ด ๊ฒฝ์ฐ ๋๋ ์๋ฌ๋ File not found๊ฐ ์๋ Access denied ์๋ฌ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ถ์ ์ ๋ ์์ธ์ ์ฝ๊ฒ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ์๋ง S3์ bucket์ policy๋ถํฐ ์ ๊ฒํ๊ธฐ ์์ํ๊ฒ ์ง์.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ถ์ ์ง์ง ์์ธ์ ์ฐพ๋๋ผ ๋งค์ฐ ์ถ์ํ๋ Sandbox ํ๊ฒฝ ์ฌ๊ธฐ์ ๊ธฐ๋ฅผ ํ์ฐธ์ ๋ค์ค์ ๋ค ์์ธ์ ๋ฐ๊ฒฌํ๊ณ ๋ ํํํ ํ์ ์ผ๋ก ์ปคํผ๋ฅผ ๋ค๊ณ ํ๋๋ง ํ์ผ์์ด ๋ฐ๋ผ๋ณผ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๊ด์ฐฎ์ต๋๋ค. ์ ๊ฐ ์ฌ๋ฌ๋ถ์ 2์๊ฐ์ ๊ตฌํ์ต๋๋ค. ์ ์๊ฒ ๊ฐ์ฌํ์ ๋ ์ข์์.
Blue/Green ์ต์ ์ฌ์ฉ ์ ์ฃผ์ํ ์
Blue/Green์ด๋ ์ผ๋ถ ์ธ์คํด์ค๋ฅผ Warming up ์์ผ๋๊ณ LB์ ์ฐ๊ฒฐ๋ Blue ๊ทธ๋ฃน๊ณผ Green ๊ทธ๋ฃน์ Gracefully ์๋ก ๊ต์ฒดํ๋ ์ต์ ์ ๋๋ค. ์ด ๋์์ด ์ค์ ๋ก Gracefulํ์ง๋ ๋์งธ ์น๊ณ ์๋ผ๋, ๋ค๋ค ELB ํน์ ALB๋ฅผ ์ด์ฉํด ๋ณด์๋ค๋ฉด ์ด๋ฌํ ์์ ๋ฒ์ ๋ฐฐํฌ๊ฐ ์ต์ํ ๊ฒ์ ๋๋ค. ์ ๋ ์ด๋ฌํ ์์ ์ Python script ๋ก ๋ง๋ค์ด ๋ฐฐํฌ ๋๊ตฌ๋ฅผ ๋ง๋ ์ ์ด ์์ต๋๋ค.
๋ฌธ์ ๋ CodeDeploy์ ์ฑ ์๊ณผ ์ญํ ์ด ์ด Blue/Green Deployment์ ์์ด์ ๊ณผ๋ํ๊ฒ ํ์ฅ๋์๋ค๋ ์ฌ์ค์ ์์ต๋๋ค. ์๋๋ฉด ํ์ฐ์ ์ผ๋ก Blue ๊ทธ๋ฃน๊ณผ Green ๊ทธ๋ฃน์ด ์ถํํจ์ ๋ฐ๋ผ CodeDeploy๊ฐ ๊ทธ๋์ ์ ํต์ ์ผ๋ก ์ํํ๋ Source code deployment ๋ฟ๋ง์ด ์๋ Environmental deployment๊น์ง ๊ทธ ์ฑ ์์ด ๋ฏธ์น๊ธฐ ์์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ณธ๋์ CodeDeploy๋ ์๋ ํน์ ํ ์ธ์คํด์ค์ ๋ฆฌ๋น์ ๋ง ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ด๋ถ์ ์คํ์ค์ธ agent๊ฐ ์๋น์ค์ ์ปค๋ฎค๋์ผ์ด์ ํ๋ฉฐ ๋ฒ์ ์ ๊ต์ฒดํ๋ ๋ฐฉ์์ด์์ต๋๋ค(์ด๋ฅผ in-place deployment๋ผ๊ณ ํฉ๋๋ค). ๊ทธ๋ ์ง๋ง Blue/Green ๋ฐฉ์์ ๋ฐฐํฌ๋ฅผ ์ํด์๋ ์ด์ฉ ์ ์์ด Instance๋ฅผ ๋ฐ์นญํ๊ณ , ์ ๊ฑฐํ๊ณ ํ๋ ๋ฑ์ ํ ๋จ๊ณ ์์ ์์ ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , CodeDeploy๋ ์๋ง๋ ์ด๊ธฐ ์ค๊ณ ๊ณผ์ ์์ ์์ผ๋ก ์ด๋ฌํ ๋ถ๋ถ์ ๋ค๋ฃฐ ๊ฒ์ด๋ผ ์์ํ์ง ๋ชปํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์๋๋ฉด Blue/Green์๋ ์ด๋ฌํ ๊ฐ์ ์ ๋ฐํ์ผ๋ก ํ ๊ฒ์ผ๋ก ๋ณด์ด๋ ์๋ง์ ๋ฌธ์ ๋ค์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋๋ ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด CodeDeploy๋ฅผ Blue/Green Deploy๋ก ์ฌ์ฉํ๋ค๋ฉด ํํ ๊ณ ๋ คํด์ผ ํ ์ ์ ์ ๋ฆฌํด๋ดค์ต๋๋ค.
Blue/Green์ ํตํด ๋ฐ์นญ๋ AutoScalingGroup์๋ Target Group์ด Implicit ํ๊ฒ ๋ถ์ด ์์ต๋๋ค
์ฌ๊ธฐ์ ์๋ง๋ AWS์ private API ๋ฅผ ์ด์ฉํ Trick ์ด ์กด์ฌํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. Blue/Green Deployment ๋ฅผ ํตํด ๋ฐฐํฌ๋ ASG์ Target Group์ ๋น์นธ์ด์ง๋ง, ์ฌ์ค์ ์ค์ ๋ก ์ฌ๊ธฐ์ CodeDeploy์์ ์ง์ ํ Target Group์ด ๋ถ์ด ์์ต๋๋ค. ์ด์ ๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋๊น ๋จ์ ์ผ๋ก ๋งํ์๋ฉด, "์, ์๋๋ณด๋ค. ๋ค๋ฅธ ๊ฐ์ ๋ด ๋ง์๋๋ก ์์ ํ๊ณ ์ ์ฅํด๋ ๋๊ฒ ์ง." ํ๊ณ ์ ์ฅํ๋ ์๊ฐ Target Group์ด ๋ถ๋ฆฌ๋๋ฉฐ ์๋น์ค๋ ์ฅ์ ๋ฅผ ์ผ์ผํค๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ CodeDeploy ๋ฐฐํฌ๋ก ๋ง๋ค์ด์ง ASG๋ฅผ ์์ผ๋ก ์์ ํด์ผ ํ ๊ฒฝ์ฐ, ์ด ์ฌ์ค์ ํญ์ ์ผ๋์ ๋์ ์ผ ํฉ๋๋ค. Target Group์ ์์ง ๋ง์ญ์์ค.
CodeDeploy ARN์ Blue/Green์ ์ํ ๋ณ๋ policy ๋ฅผ ์ ์ฉํด์ค์ผ ํฉ๋๋ค
CodeDeploy์ ๊ธฐ๋ณธ IAM ๊ถํ์๋ Blue/Green ์ ํ์ํ ๊ถํ์ด ์์ต๋๋ค. ๋์ฑ ์ํ๊น์ด ์ ์ ์ด์ ๋ํด ๋ช ์์ ์ผ๋ก ์์ฑํ ๋ฌธ์๋ ์๋ค๋ ์ฌ์ค์ ๋๋ค. ๋ค๋ง ๊ฒ์์ ํตํด ๋๊ตฐ๊ฐ์ ๋ธ๋ก๊ทธ ๊ธ์ ์ฐพ์ ์ ์์ผ๋ฉฐ ์ด๋ ์ฌํด 2์์ ๋ฐํ์ง ๋ฒ๊ทธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ง๊น์ง ์์ ๋๊ณ ์์ง ์์ต๋๋ค.
์ด์ฉ ์ ์์ต๋๋ค. ์ค์ค๋ก ํด๊ฒฐํด์ผ ํฉ๋๋ค.
(์ฐธ์กฐ : https://h2ik.co/2019/02/28/aws-codedeploy-blue-green/)
"The IAM role does not give you permission to perform operations in the following AWS service: AmazonAutoScaling. Contact your AWS administrator if you need help. If you are an AWS administrator, you can grant permissions to your users or groups by creating IAM policies."
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์์ ๊ฐ์ ์๋ฌ๋ฉ์์ง๋ฅผ ๋ณด๋ฉด ์๋ Policy๋ฅผ ์ฌ๋ฌ๋ถ์ด ์ฌ์ฉํ๋ CodeDeploy Role์ ๋ณ๋๋ก ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "iam:PassRole", "ec2:CreateTags", "ec2:RunInstances" ], "Resource": "*" } ] }
AutoScaling Group์ LifeCycle Hook์ด ์ค๋ณต๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค
์ด ๋ฒ๊ทธ๋ Blue/Green ๋ฐฐํฌ์ ์๋๋ In-place๋ก ๋ฐฐํฌํ๋ ASG๋ฅผ ๋ณต์ฌํ์ฌ CodeDeploy๋ฅผ ํตํ ์ต์ด ์๋ ์์ ๋ฐ์ํฉ๋๋ค. Scheduled action์ด๋ Cloudwatch alarm ๋ฑ์ ๊ฑธ๋ฆฐ action์ ์ํด AutoScaling operation์ด ์คํ๋๋ฉด, ๋ ๊ฐ์ LifeCycle Hook์ด(In-place ์์ ์ฐ๋ LifeCycle Hook๊ณผ Blue/Green ์์ ์๋ก ์ค์ ํ LifeCycle Hook) ์๋ก ๊ฐ์ ์ธ์คํด์ค์ ์กด์ฌํ๊ฒ ๋๋ฉด์, ํ๋์ ์ธ์คํด์ค์ ๋ ๊ฐ์ง ๋ฒ์ ์ด ๋์์ ๋ฐฐํฌ๋๋ ๋น๊ทน์ด ์ผ์ด๋ฉ๋๋ค.
๋น์ฐํ ์ Instance์๋ ์ ๋๋ก ๋ ๋ฐฐํฌ๊ฐ ์งํ๋์ง ์์ต๋๋ค. ๊ทธ ์ธ์คํด์ค๋ Create ๋ ์งํ PendingWait ์ํ์์ Health check์ ์คํจํ์ฌ Terminate ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ๋ค์ ASG์ Desired capacity์ ์ํด ๋ค์ Instance๊ฐ ๋ฐ์นญ๋๊ณ ... ์ด๋ฐ ์ํฉ์ด ๋ฌดํํ๊ฒ ๋ฐ๋ณต๋ฉ๋๋ค.
ํด๊ฒฐ์ฑ ์ ๊ฐ๋จํฉ๋๋ค. Blue/Green ๋ฐฐํฌ์ ๊ธฐ์กด์ In-place์ ์๋ LifeCycle Hook์ ์ญ์ ํด์ค์๋ค.
Rollback์ ํ๊ณ ๋๋ฉด AutoScaling Group์ LifeCycle Hook์ด ํผ์๋ฉ๋๋ค
์ด ๋ฒ๊ทธ๋ ์กฐ๊ธ ์น๋ช ์ ์ ๋๋ค. ์ฌ๋ฌ๋ถ์ Deployment๊ฐ ๋ณ ์ผ ์์ด ๋๋ฌ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ๋ฐ์ง๋ ์๊ฒ ์ง๋ง, ์์๋ค์ํผ ํ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ Buggyํ ํ๋ก๋์ ์ ๋กค๋ฐฑํ๋ ์ผ์ด ์ฆ์ต๋๋ค. ์ด ๋ฒ๊ทธ๋ ๋ง์ฝ Blue/Green ๋ฐฐํฌ๊ฐ ๋๋ ๋ฒ์ ์ ๋ํด Rollback ํ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ๋ฐ์ํฉ๋๋ค.
์์์ ์ผ๋ก Rollback์ด ์คํ ๋ ๊ฒฝ์ฐ LifeCycle Hook์ Blue version(๋กค๋ฐฑ๋ ๊ธฐ์กด์ ๋ฒ์ )์ ๋ค์ ๊ฑธ๋ ค ์์ด์ผ ํ๊ณ , Green version(์๋ก ๋ฐฐํฌ๋์๋ค ์ทจ์๋ ๋ฒ์ )์๋ ๊ฑธ๋ ค์์ง ์์์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋กค๋ฐฑ๋ Blue Version ์๋ ์๋น ๊ฑธ๋ ค์์ด์ผ ํ LifeCycle Hook ์ด ์์ต๋๋ค.
์ด LifeCycle Hook์ ๋ถ์ฌ๋ก, ํ์ฌ ๋ฐฐํฌ๋ EC2 ์ธ์คํด์ค๋ฅผ ์ ์ธํ, ์๋ก ๋ฐ์นญ๋๋ ์ธ์คํด์ค๋ค์๋ CodeDeploy์ automatic deployment ๊ฐ ์๋ํ์ง ์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฌด ๋ฒ์ ๋ ๋ฐฐํฌ๋์ง ์์ ๋น์ด์๋ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ทธ๋ฐ ๊นกํต ์ธ์คํด์ค๋ง ๊ณ์ ๋ด๋ค ์ฃฝ์๋ค๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ฐ์ ์ธ ์ฅ์ ๋ด๊ตฌ์ฑ์ ์ฝํ์ํค๊ธฐ ์์ํ๊ณ , ํน์๋ผ๋ ASG์ Termination policy๊ฐ OldInstance ๋ฑ์ผ๋ก ๊ฑธ๋ ค์๋ค๋ฉด ์ฌ๋ฌ๋ถ์ ASG๋ ์์๊ฐ์ ๊นกํต ์ธ์คํด์ค๋ก ๊ฐ๋์ฐฐ ์ง๋ ๋ชจ๋ฆ ๋๋ค.
์ด ๋ฒ๊ทธ์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋, ์ด ์ํ๋ฅผ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ ์ ์ ๋์น์ฑ๊ธฐ๊ฐ ์ฝ์ง ์๋ค๋ ์ ์ ๋๋ค. ์๋ ํ๋ฉด, ์ด ๋ฌธ์ ๋ ํ์์ ์ ์ฌ์ ์ผ๋ก๋ง ์กด์ฌํ๋ค๊ฐ, Scheduled action ์ด๋ Autoscaling Policy ๋ฑ์ ์ํด Instance๊ฐ ๋์ด๋ฌ์ ๊ฒฝ์ฐ์๋ง ๊ฐ์ํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋งบ์ผ๋ฉฐ
์ด์์ผ๋ก CodeDeploy๋ฅผ production์ ์ ์ฉํ ๋ ๋ฐ์ํ ์ ์๋ ์ฃผ์์ ๋ค์ ๋ํด ์์๋ณด์์ต๋๋ค. ์๊ฐ๋ณด๋ค fragileํ ํ๋ก๋ํธ์ ์ค๋งํ์ ๋ถ๋ ๊ณ์ค ๊ฒ์ด๊ณ , ์ด ์ ๋์ deployment system ์ ๋ง๋๋ ๋ฐ์ ๋๋ ๋น์ฉ์ ๋นํด์๋ ์๊ฐ๋ณด๋ค ๋ฎ์ trade-off ๋ผ๊ณ ์๊ฐํ์ ๋ถ๋ ๊ณ์ค ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋์ ๋ ๋ฐ์ ธ๋ ๊ฐ์ฅ ์ข์ ๊ฒ์ ์์์ ์ธ๊ธํ ์ฃผ์์ฌํญ๋ค(์ด๋ผ๊ณ ์ฐ๊ณ ๋ฒ๊ทธ๋ผ๊ณ ์ฝ๋)์ ๋ ์ด์ ๊ณ ๋ คํ์ง ์์๋ ๋๋ ๊ฒ์ ๋๋ค. ์ด์ฉ๋ฉด ์ด ๊ธ์ ํตํด ์ต๊ทผ EKS๊ฐ ์ ์ฃผ๋ชฉ๋ฐ๊ณ ์๋์ง๋ฅผ ์ค๊ฐํ์ จ์ ์๋ ์๊ฒ ์ต๋๋ค.
๋ค์์๋ ๋ ์ข์ ๊ธ๋ก ์ฐพ์๋ต๊ฒ ์ต๋๋ค.













