๐ ๋ฐฐํฌ ๊ตฌ์กฐ
๊ธฐ๋ฅ๊ณผ ๊ด๋ จ๋ ๋ถ๊ฐ์ ์ธ ์ธ๋ถ API ๋ฑ์ ์ ์ธํ๊ณ ๋๋ต์ ์ธ ๊ตฌ์กฐ๋ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๊ฒ ๋๋ค.
๋ฐฐํฌ๋ Github Actions, Codedeploy๋ฅผ ํตํด์ ํ๊ณ ,
์์ฒญ์ด ์์ ๋๋ AWS ALB์์ SSL ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , NginX์์๋ blue, green ์ค ์๋ ์ค์ธ ํฌํธ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก ๋ฌด์ค๋จ ๋ฐฐํฌ๊ฐ ๊ตฌํ๋๋ค.
๋ฐฐํฌ ํ๋ฆ
1. ๊นํ๋ธ ๋ํดํธ ๋ธ๋์น์ ๋ณ๊ฒฝ ๋ด์ฉ ์ปค๋ฐ
2. Github workflow๊ฐ java ํ๋ก์ ํธ๋ฅผ ๋น๋
3. Codedeploy, S3 ์ ๊ทผ์ด ๊ฐ๋ฅํ IAM ํค๋ฅผ ์๊ณ ์๋ Github workflow๊ฐ S3์ ๋น๋ ํ์ผ์ ์
๋ก๋ํ๊ณ , Codedeploy๋ก ๋ฐฐํฌ ์์ฒญ
4. Codedeploy๊ฐ appspec.yml์ ๋ฐ๋ผ ์ง์ ํ hook ์์ ์ scripts/deploy.sh ์คํฌ๋ฆฝํธ๋ฅผ ์คํ
5. deploy.sh๋ ํ์ฌ ์คํ ์ค์ธ blue ์ปจํ
์ด๋๊ฐ ์๋ค๋ฉด green ์ปจํ
์ด๋๋ฅผ ์คํ์ํค๊ณ , ์๋ค๋ฉด blue ์ปจํ
์ด๋๋ฅผ ์คํ -> ๋ฐฐํฌ ์ค์๋ ์๋น์ค๊ฐ ์ค๋จ๋์ง ์๋๋ก ํจ
HTTPS ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ
1. ๋๋ฉ์ธ์ผ๋ก ๋ค์ด์จ ์์ฒญ์ EC2์ ๋ก๋ ๋ฐธ๋ฐ์๋ก ๋ผ์ฐํ
๋จ
2. AWS ALB๋ ์์ฒญ์ด HTTP๋ผ๋ฉด HTTPS๋ก ๋ฆฌ๋ค์ด๋ ํธํ๊ณ , HTTPS๋ผ๋ฉด ๋ฑ๋ก๋ ์ธ์ฆ์๋ก SSL/TLS ์ฒ๋ฆฌ
3. AWS ALB๋ ๋ชจ๋ ์์ฒญ์ ๋์ ๊ทธ๋ฃน์ ๋ฑ๋ก๋ EC2์ 80ํฌํธ๋ก ๋ณด๋
4. NginX์ ๋ฆฌ๋ฒ์ค ํ๋ก์ ๊ธฐ๋ฅ์ ์ด์ฉํด ๋ธ๋ฃจ ์ปจํ
์ด๋๊ฐ ์ฌ์ฉ ์ค์ธ 8081ํฌํธ์ ๊ทธ๋ฆฐ ์ปจํ
์ด๋๊ฐ ์ฌ์ฉ ์ค์ธ 8082ํฌํธ ์ค ์ฐ๊ฒฐ ๊ฐ๋ฅํ ๊ณณ์ผ๋ก ์ฐ๊ฒฐํจ
๐ SSL offloading์ด๋?
API ์๋ฒ๊ตฐ ์์ proxy ์๋ฒ๋ฅผ ๋๊ณ ํด๋น Proxy ์๋ฒ์ SSL ๊ด๋ จ ์์ ์ ์์ํ๋ ๋ฐฉ์์ด๋ค.
AWS ALB์์ SSL ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์น ์๋ฒ์์๋ SSL ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๋ ์ ๊ตฌ์กฐ๋ SSL offloading์ ์ ์ฉํ๊ณ ์๋ค.
์ด๋ฌํ ๋ฐฉ์์ WAS๋ฅผ ๋์ด WS์ SSL ์ฒ๋ฆฌ๋ก ์ธํ ์ค๋ฒํค๋๋ฅผ ์ฃผ์ง ์๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค.
๋ฌด์ค๋จ ๋ฐฐํฌ ๊ธฐ๋ก, ํธ๋ฌ๋ธ์ํ
nginx
blue-green์ ์ฌ์ค ์๋ฒ 2๋ ์ด์์ ์ฌ์ฉํด์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋ฐฐํฌํด์ ํด๋ผ์ด์ธํธ ๋จ์์ ์ค๋จ์ ๋๋ผ์ง ๋ชปํ๊ฒ ํ๋ ๊ฑฐ๋ผ๊ณ ํ๋๋ฐ ํ๋ฆฌํฐ์ด๋ก EC2 ๋ ๊ฐ ์ธ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋์ปค์ nginx, codedeploy๋ฅผ ์ด์ฉํ ๋ฌด์ค๋จ ๋ฐฐํฌ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์๋ฒ์ nginx ๋ฑ ํ์ํ ๊ฒ๋ค์ ์ค์นํ ํ
sudo vim /etc/nginx/sites-enabled/default ์ ํด์ proxy์ค์ ์ ๋ฐ๊ฟจ๋ค.
upstream blog-api-server {
least_conn;
server 127.0.0.1:8081 max_fails=3 fail_timeout=10s;
server 127.0.0.1:8082 max_fails=3 fail_timeout=10s;
}
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
if ($http_x_forwarded_proto != 'https') {
return 301 https://$host$request_uri;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://blog-api-server;
proxy_redirect off;
}
}
์ค์ ๋ณ๊ฒฝ ํ์๋
sudo service nginx reload
docker
aws codedeploy permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
docker ๋ฐ๋ชฌ ์์ผ์ ์ฐ๊ฒฐํ ๊ถํ์ด ์์ ๋
->
sudo usermod -aG docker $USER
sudo systemctl restart docker
sudo apt install docker-compose
๋ํดํธ์ธ docker-compose.yml๊ณผ ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ์ง docker-composeํ์ผ์ ์ง์ ํ๋ ๊ฒฝ์ฐ -f ์ต์ ์ ์ฌ์ฉ
docker-compose -f custom-compose-file.yml start
๋ฐฐํฌ์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ปค๋ฐ์ ํ ๋๋ง๋ค ์ปจํ ์ด๋๊ฐ blue ↔ green์ผ๋ก ๋ฐ๋์ง ์๊ณ ๊ณ์ blue๋ก๋ง ๋ฐฐํฌ๊ฐ ๋๋ ๋ฌธ์ ๊ฐ ์์๋๋ฐ
docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml ps | grep running
์์ docker-compose ps๋ฅผ ํ์ ๋ ์ ๋ฐ์ดํธ๊ฐ ๋์๋์ง running์ด ์๋ Up์ด๋ผ๊ณ ํ์๋์ด์ ์คํ ์ค์ธ ์ปจํ ์ด๋๋ฅผ ์ฐพ์ง ๋ชปํ๋ ๊ฑฐ์๋ค. Up์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ์๋ํ๋ค.
Codedeploy๊ฐ ์คํํ๋ deploy.sh ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
#!/bin/bash
cd /home/ubuntu/app
DOCKER_APP_NAME=spring
# ์คํ์ค์ธ blue๊ฐ ์๋์ง
EXIST_BLUE=$(docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml ps | grep Up)
echo "$EXIST_BLUE" >> debug.log
# green์ด ์คํ์ค์ด๋ฉด blue up
if [ -z "$EXIST_BLUE" ]; then
echo "blue up" >> debug.log
docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml up -d --build
sleep 30
docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml down
docker image prune -af # ์ฌ์ฉํ์ง ์๋ ์ด๋ฏธ์ง ์ญ์
# blue๊ฐ ์คํ์ค์ด๋ฉด green up
else
echo "green up" >> debug.log
docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml up -d --build
sleep 30
docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml down
docker image prune -af
fi
shell
shell script์์ ์๋ฌ ๋ก๊ทธ ๊ธฐ๋กํ๋ ค๋ฉด
‘>’ - ๋ช ๋ น 1ํ ๋์ ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ์ ์ฅ, ์ดํ ๋์ผํ ํ์ผ๋ช ์ฌ์ฉ ์ ํ์ผ ๋ฎ์ด์์
‘>>’ - ๋ช ๋ น 1ํ ๋์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ์ ์ฅ, ์ดํ ๋์ผํ ํ์ผ๋ช ์ฌ์ฉ ์ ๋ง์ง๋ง ์ ์ฅ์ ๋ด์ฉ ์ถ๊ฐ๋จ.
ex) echo “blue up” >> debug.log
if๋ฌธ์์ -z ์ต์ ์?
string์ด empty์ธ์ง ํ์ธํ๊ธฐ ์ํด์ ์ฌ์ฉ๋จ. ๋ง์ฝ string์ด empty๋ผ๋ฉด if block ์์ ์๋ ์ฝ๋๋ฅผ ์คํํ๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด else block์ ์คํํ๋ค.
์ฉ๋์ด ๋ถ์กฑํด์ ๋ฐฐํฌ๊ฐ ์๋๋ฉด
์๋น์ค ๊ธฐ๋ฅ์ด ๊ฝค ๋ง๋ค ๋ณด๋ ๋์คํฌ ์ฉ๋์ด ๋ถ์กฑํด์ ์ฝ๋๋ํ๋ก์ด, ๋์ปค ๋ฑ ์๋ฌด ๋ช ๋ น์ด๋ ์คํ์ด ์๋๋ ๋ฌธ์ ๊ฐ ์๊น. ์ค์น ๋ฉ๋ชจ๋ฆฌ๋ง ์ ์ฉํด๋ 2GB์ด๋ ๊ทธ๋ฅ ์ฒจ๋ถํฐ 8GB๋ ์์ฐ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
์คํ ๋ฆฌ์ง์์ ๋ณผ๋ฅจ์ ๋๋ ค๋ณด์๋๋ฐ ๋ฐ์๋๋๋ฐ 1์๊ฐ ์ ๋ ๊ฑธ๋ฆฐ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ๊ณต๊ฐ์ ๋ง๋ค๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ง๋ฅผ ํด๋ดค๋ค.
ํด๋ ๋ณ ์ฉ๋ ํ์ธ ๋ช ๋ น์ด → ๋ถํ์ํ ๋ก๊ทธ ๋ฑ ์ฉ๋ ํฐ ํ์ผ์ ์ญ์
sudo du -shx /* | sort -h
์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ํ์ธ ๋ช ๋ น์ด → ์ผ๋ง๋ ๋จ์๋์ง ํ์ธํ ๋
df -h
๋ถํ์ํ ๋ฆฌ์์ค ์ ๊ฑฐ ๋ช ๋ น์ด
docker system prune -a -f
์ปค๋ ์ญ์ ๋ช ๋ น์ด
sudo apt autoremove --purge
'Infra' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
portainer ๋น๋น๋ฒํธ ๋ณ๊ฒฝ (0) | 2023.11.24 |
---|---|
Docker ๋ฐฐํฌํ Spring Boot ํ๋ก์ ํธ Selenium ์ฌ์ฉํ๊ธฐ (0) | 2023.11.22 |
AWS CodeDeploy, Github Actions๋ฅผ ์ด์ฉํ CI/CD (0) | 2023.06.04 |
AWS Route53๋ก HTTPS ๋ฐฐํฌํ๊ธฐ (Django) (0) | 2022.12.21 |