์๊ฐ CS CI/CD ๋๋ ์ ์์ํ๋?
์ด์ ์ค์ธ ๋ฒ ์ดํน ์์ฝ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ํ์ฌ AWS Elasticbeanstalk ์ ๋ฐฐํฌ ๋์ด ๊ด๋ฆฌ ํ๊ณ ์๋ค. ๋ฐฐํฌ์ ์๋ํ๋ ์๋์ง๋ง, ๊ทธ๋๋ aws cli๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐํฌ๋ฅผ ์งํํ๊ณ ์์๊ณ ์ฆ์ ์์ ์ด ์๋๊ธฐ์ ๋ฐฐํฌ์ ๋ํ ๋ถํธํจ์ ํฌ๊ฒ ๋๋ผ์ง ์์๋ค. ๋ถํธํจ์ ์์์ง๋ง, CI/CD๋ฅผ ํตํด ๋ฐฐํฌ ์๋ํ๋ฅผ ์งํ ํ๋ฉด ๋ ๋์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง๋ค ์ ์์ ๊ฒ์ด๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋์ CI/CD๋ฅผ ๊ณต๋ถํ๊ณ ์ ์ฉํด ๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
CI/CD ๋ ๋ฌด์์ธ๊ฐ?
์ง์์ ํตํฉ(Continuous Integration)
์ง์์ ํตํฉ์ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐ ์ฃผ๊ธฐ ์ ๋ฐ์์ ๋ ๋น๋ฒํ๊ฒ ์ ๊ท ์์ฑ ์ฝ๋๋ฅผ ํตํฉํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๋ก์ธ์ค. ๋งค์ผ 1ํ ์ด์ ์ฝ๋ ๋ฒ ์ด์ค์ ์ถ๊ฐํฉ๋๋ค. ๋น๋ํ ๋๋ง๋ค ์๋ ํ ์คํธ๊ฐ ์คํ๋์ด ํตํฉ ๋ฌธ์ ์ ์ ์ผ์ฐ ์ฐพ์๋ ๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ์ ์ ์์ ํ๊ธฐ๊ฐ ๋ ์ฉ์ดํฉ๋๋ค ์ถ์ฒ: IBM
์ง์์ ๋ฐฐํฌ(Continuous Deployment)
์ง์์ ํตํฉ์ด ๋๋๋ ์ง์ ์์ ๋ค์ ์์ํ์ฌ ์ ํ๋ ์ธํ๋ผ ํ๊ฒฝ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ๋๋ฆฌ๋ฒ๋ฆฌํฉ๋๋ค. CD๋ ๊ฒ์ฆ ์๋ฃ๋ ์ฝ๋ ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ฌํญ(์ ๋ฐ์ดํธ, ๋ฒ๊ทธ ์์ , ์๋ก์ด ๊ธฐ๋ฅ ๋ฑ)์ ์ฌ์ฉ์์๊ฒ ์ต๋ํ ๋น ๋ฅด๊ณ ์์ ํ๊ฒ ์ ๊ณตํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ๋ฐ, ํ ์คํธ, ํ๋ก๋์ ๋ฑ๊ณผ ๊ฐ์ ๋ค์ํ ํ๊ฒฝ์ ๋ฐฐํฌํ๋ ์์ ์ด ์๋ํ ๋ฉ๋๋ค. ์ถ์ฒ: IBM
์ ํ์ ์ง์์ ํตํฉ์ ํตํด ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ฐ ์๋์ ๋ํ ์์ ์ฑ์ ๋ณด์ฅํด ์ค๋ค. ํ์ง๋ง ์ด ๊ณผ์ ์ ํ ์คํธ ์ฝ๋์ ๋ํ ํ์ ๋ฌธํ๊ฐ ํ์ํ๋ฉฐ, ๋์์ ๊ฐ๋ฐ์ ๊ฐ์ ํ์ ์ด ํ์ํ๋ค.
Github Flow์ ๋ต์ ๋ํ ์ดํด
๋ค์ํ Git๋ธ๋์น ์ ๋ต
- Git Flow
- GitHub Flow
- GitHub Rebase
GitHub Flow ๋ฅผ ์ ํํ ์ด์
- ํ์ฌ ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ์ฌ๋์ด ๋ ํผ์ ์ด๋ฏ๋ก ๋ณต์กํ ๋ธ๋์น ์ ๋ต์ ํ์๋ก ํ์ง ์์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- GitHub Flow๋ main ๋ธ๋์น๋ก ๋ณํฉ๋ ํ ์ฆ์ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅ ํ๋ฏ๋ก, Git Flow ์ ์ฌ๋ฌ ๋ธ๋์น ๋จ๊ณ๋ค์ ๊ฑฐ์น๋ ๊ณผ์ ๋ณด๋ค ๋ฐฐํฌ ๊น์ง ๋น ๋ฅด๊ฒ ๋ฐ์์ด ๊ฐ๋ฅ ํ๋ค๊ณ ํ ์ ์๋ค.
- ๋ง์ฝ ์ฌ๊ธฐ์ ํ์์ด ์ถ๊ฐ ๋๋ค ํ ์ง๋ผ๋ ์๋ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์์ ์์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ฅํ๋ ๊ฒ์ ๋ํ ๋ถ๋ด์ด ์ ๋ค๊ณ ์๊ฐํ๋ค.
GitHub Flow ์ ๋ต
- Main๋ธ๋์น์ Feature ๋ธ๋์น๋ก ๋๋์ด ๊ฐ๋ฐ
- Main ๋ธ๋์น๋ ๋ฐฐํฌ๋ฅผ ํ์ ๋, ํญ์ ๋ฌธ์ ๊ฐ ์์์ ๋ณด์ฅ ํด์ผ ํ๋ ์์ ํ ์ฝ๋ ๋ฒ ์ด์ค๊ฐ ์กด์ฌ
- Feature ๋ธ๋์น๋ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์งํํ๋ ๋ธ๋์น๋ก, Main ๋ธ๋์น์์ ๋ถ๊ธฐ๋์ด ์์ฑ๋๋ค.
- Feature ๋ธ๋์น์์ ๊ฐ๋ฐ์ด ์๋ฃ ๋๋ฉด, Main ๋ธ๋์น๋ก PR์ ์์ฑํ๋ค.
- ์ด๋ค ๊ตฌํ๋ถ๋ฅผ ๋ง๋ค ๊ฒ์ธ์ง ๊ตฌ์ฒด์ ์ธ ๋ธ๋์น ์ด๋ฆ์ด์ด์ผ ํ๋ค.
CloudFront, S3 ๋ฐฐํฌ ์ธํ๋ผ ๊ตฌ์ฑ
ํน์ ๋๋ฉ์ธ์ ์ฃผ์์ฐฝ์์ ๊ฒ์ํ๋ฉด ํต์์ ์ผ๋ก ๊ทธ ๋๋ฉ์ธ์ ์์ ํ๊ณ ์๋ ๋ค์ ์๋ฒ ์ชฝ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค. ๋๋ฉ์ธ์ ๊ตฌ์ ํ ๊ณณ์ด ๊ฐ๋น์ ์ธ๋ฐ, aws์์ ์ ๊ณตํ๋ CloudFront์ S3๋ฅผ ์ด์ฉํ์ฌ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํ๊ณ ์ ํ๋ค. ๊ทธ๋์ ๋ค์์๋ฒ๋ฅผ ๊ฐ๋น์์์ AWS Route53์ ๋ค์์๋ฒ๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด, ์์ฒญ์ด AWS๋ก ๋ค์ด์ค๊ฒ ๋๋ค.
hyunsu.shop ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ์์ ์๋ํ๋ฉด, ๋ค์์๋ฒ์ธ AWS Route53๋ก ์์ฒญ์ ๋ณด๋ด๊ณ , Route53๋ ํด๋น URL์ A๋ ์ฝ๋๊ฐ ์๋์ง ํ์ธํ๋ค. ๋ง์ฝ CloudfFront๋ฅผ ํฅํ A๋ ์ฝ๋๊ฐ ์๋ค๋ฉด CloudFront๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
CloudFront์ ๋ํ ์ค๋ช ์ ๊ฐ๋ตํ ํ์๋ฉด, ์ฌ์ฉ์์๊ฒ ์ปจํ ์ธ ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ ํ ๋๋ ๋ธ๋ผ์ฐ์ ์ CloudFront ์ฌ์ด์ HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค. ์ด ๋, SSL/TLS ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ CloudFront ์ฌ์ด์ ํต์ ์ด ์ํธํ ๋๋ค.
์ฌ๊ธฐ์ CloudFront๊ฐ ๊ฐ์ ธ์์ผ ํ ์ปจํ ์ธ ๋ ์ค๋ฆฌ์ง ์๋ฒ ์ฆ S3์ ์๋ ์ ์ ํ์ผ์ ๊ฐ์ ธ์ค๋๋ฐ ์ด ๋์๋ ํต์ ์ ์ํธํํ๊ธฐ ์ํด SSL/TLS๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
/index.html์ ์๋ ๋ฆฌ์กํธ ํ์ผ์ ์ ๊ทผ ํจ์ผ๋ก์ CSR๋ฐฉ์์ผ๋ก ํ์ด์ง๋ฅผ ๋ ๋๋ง ํ๋ค.
Terraform์ ์ด์ฉํ ์ธํ๋ผ ๊ตฌ์ถ
- aws IAM ๊ณ์ ์์ฑ
- aws-cli profile ์ค์ ํ๊ธฐ 2.1 aws ๊ณ์ ์ด ์ฌ๋ฌ๊ฐ ์์ ๊ฐ์ํ์ฌ ๋ฉํฐ ํ๋กํ ์์ฑ
- terraform ์ค์น
- DNS ๋ฆฌ์์ค ๋ฐฐํฌํ๊ธฐ
cd ./infra/dns
terraform init
terraform apply -var="profile=monthly-cs" -var="domain_name=<๊ฐ๋น์์์ ๊ตฌ๋งคํ ๋๋ฉ์ธ>"
์)
terraform apply -var="profile=monthly-cs" -var="domain_name=unchaptered.shop"
- Enter a value: yes ์ ๋ ฅ ํ ๋์จ dns_ns_record ๊ฐ๋ค์ ๊ฐ๋น์์ ๋ฑ๋ก ํ๋ค.
- CloudFront, S3 ๋ฐฐํฌ
cd ../../ # ํ๋ก์ ํธ ๊ฒฝ๋ก๋ก ๊ฐ๊ธฐ
cd ./infra/website
terraform init
terraform apply -var="profile=monthly-cs" -var="domain_name=<๊ฐ๋น์์์ ๊ตฌ๋งคํ ๋๋ฉ์ธ>"
์)
terraform apply -var="profile=monthly-cs" -var="domain_name=unchaptered.shop"
- ๋ก์ปฌ์์ ๋ฐฐํฌ - ๋น๋ ํ์ผ s3์ ์ ๋ก๋ํ๊ธฐ
aws s3 cp --recursive ./build s3://<๊ฐ๋น์์์ ๊ตฌ๋งคํ ๋๋ฉ์ธ> --profile monthly-cs
์)
aws s3 cp --recursive ./build s3://unchaptered.shop --profile monthly-cs
๋ง๋ฌด๋ฆฌ
- ํ์ฌ ๋์ ํ๋ก์ ํธ์์ ์๋ง์ CI/CD ์ ๋ต์ธ GitHub Flow ๋ฅผ ์ ํํ ์ ์๊ฒ ๋์๋ค.
- Terraform ์ ์ฒ์ ์ ํด๋ณด๋ ์๊ฐ์ด์๋ค. ์ค์ต์ ์งํํ๋ฉด์๋ Terraform์ ๋ช ๋ น์ด์ ์ง์ค ํ๋ค๊ธฐ ๋ณด๋จ ์ ์ฌ์ฉํ ๊น์ ์กฐ๊ธ ๋ ์๊ฐํด๋ณด์๋ค.
- aws ์ธํ๋ผ ๊ตฌ์ถ์ GUI๋ฅผ ํตํด ์งํํด ์์๋๋ฐ Terraform์ ํตํด ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๋ฉด์, IaC(Infrastructure as Code) ๋ก ์ธํ๋ผ ์คํธ๋ญ์ณ์ ๋๊ตฌ์์ ๊ฒฝํ ํ ์ ์์๋ค.
- ์กฐ๊ธ ๋ ์ฐพ์๋ณด๋ ์ด๋ค ์ํฐํด์์๋ ์ด๋ฐ ๋ถ๋ถ์ ๊ฐ์กฐํ๊ธฐ๋ ํ๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ AWS ์ค์ ์ธํ๋ผ์ Backend์ ์ ์ฅ๋ ์ํ๊ฐ 100% ์ผ์นํ๋๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค. ํ ๋ผํผ์ ์ด์ํ๋ฉด์ ์ต๋ํ ์ด ๋๊ฐ์ง๊ฐ 100% ๋์ผํ๋๋ก ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ฐ, ํ ๋ผํผ์์๋ ์ด๋ฅผ ์ํด import, state ๋ฑ ์ฌ๋ฌ ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.