์๋ก
CI/CD ์๋ํ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ค ๋ณด๋ฉด, EC2(AWS) ๋ฑ ์๋ฒ์ Docker ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฌ๋ค ๋์คํฌ ์ฉ๋์ด ์ฐจ ๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์๋ค.
ํนํ ECR์ด๋ Docker Hub์ ์ด๋ฏธ์ง ํธ์ ํ ์๋ฒ์ ๋จ์์๋ ์ด๋ฏธ์ง, ์ปจํ
์ด๋, ์ ์ฐ๋ ๋ณผ๋ฅจ ๋ฑ์ด ์์ด๊ธฐ ์์ํ๋ฉด, ๋ฐฐํฌ๊ฐ ์คํจํ๊ธฐ๋ ํ๋ค.
์ด๋ฐ ์ํฉ์ Git Action์ ํตํ Clean ์๋ํ๋ก ํด๊ฒฐํ ์ค์ ๋ฐฉ๋ฒ์ ๊ณต์ ํ๊ณ ์ ํ๋ค.
๋ฌธ์ ์ํฉ
- ์๋ฒ์ Docker ์ด๋ฏธ์ง๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐฐํฌํ๋ค ๋ณด๋, ์ด์ ์ด๋ฏธ์ง, ์ปจํ ์ด๋, ๋ณผ๋ฅจ, ์บ์ ๋ฑ์ด ์์ฌ์ ๋์คํฌ ์ฉ๋ ๋ถ์กฑ
- ์๋์ผ๋ก docker system prune ํ๋ ๊ฒ ๊ท์ฐฎ์
ํด๊ฒฐ ๋ฐฉ๋ฒ: GitHub Actions๋ก EC2 ๋์คํฌ ์๋ ์ฒญ์
- GitHub Actions์์ 12์๊ฐ๋ง๋ค EC2์ SSH๋ก ์ ์
- ๋ถํ์ํ Docker ๋ฆฌ์์ค/์บ์/์ด๋ฏธ์ง/์ปจํ ์ด๋/apt ์บ์ ๋ฑ์ ์๋ ์ญ์
์๋๋ ์ค์ ์ฌ์ฉํ Workflow ์์์ ๋๋ค.
name: EC2 Disk Cleanup
on:
schedule:
- cron: '0 */12 * * *' # 12์๊ฐ๋ง๋ค ์คํ (UTC ๊ธฐ์ค)
workflow_dispatch:
jobs:
cleanup:
runs-on: ubuntu-latest
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Cleanup disk on EC2
run: |
echo "${{ secrets.EC2_SSH_KEY }}" | base64 --decode > private_key.pem
chmod 600 private_key.pem
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF'
echo "=== Docker system prune ==="
docker system prune -af
echo "=== Docker volume prune ==="
docker volume prune -f
echo "=== Remove dangling images ==="
docker image prune -af
echo "=== Remove exited containers ==="
docker container prune -f
echo "=== Clean apt cache ==="
sudo apt-get clean
echo "=== Show disk usage ==="
df -h
EOF
- cron: ๋งค 12์๊ฐ๋ง๋ค ์๋ ์คํ (UTC ๊ธฐ์ค)
- EC2 ์ ์: GitHub Secrets์ SSH Key, Host, User ๋ฑ ์ ์ฅ ํ ์ฌ์ฉ
- prune ๋ช ๋ น: ํ์์๋ Docker ์์, ์ปจํ ์ด๋, ๋ณผ๋ฅจ, ์ด๋ฏธ์ง ๋ชจ๋ ์๋ ์ญ์
- ๋ง์ง๋ง์ผ๋ก ๋์คํฌ ์ฌ์ฉ๋ ํ์ธ
๐ก ๋ ์ข์ ๋ฐฉ๋ฒ?
1. EC2 ์ธ์คํด์ค์์ ์ง์ ํฌ๋ก ํญ(crontab)์ผ๋ก ๊ด๋ฆฌ
- SSH๋ฅผ ํตํ ์ธ๋ถ ์๋ํ๋ ์ข์ง๋ง,
์๋ฒ ์์ฒด์ ํฌ๋ก ํญ์ด๋ systemd timer๋ก ์ฃผ๊ธฐ์ ์คํ์ด ๋ ์์ ํ ์ ์์.
ex) 0 */12 * * * /usr/bin/docker system prune -af && /usr/bin/docker volume prune -f && ...
2. Docker Compose๋ CI ํด์์ ๋ฐฐํฌ ํ ๋ฐ๋ก ์ฒญ์ํ๋๋ก Hook ์ฐ๊ฒฐ
- ๋ฐฐํฌ๊ฐ ๋๋ ์งํ ํ์์๋ ์์ ์ ๋ฆฌ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ๋ก ์คํ
3. ๋์คํฌ ๋ชจ๋ํฐ๋ง & ์๋ฆผ
- CloudWatch ๋ฑ AWS์ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์,
๋์คํฌ ์ฌ์ฉ๋์ด ์๊ณ์น(์: 80%) ๋์ผ๋ฉด Slack, ์ด๋ฉ์ผ ๋ฑ์ผ๋ก ์๋ ์๋ฆผ + cleanup ์คํฌ๋ฆฝํธ ํธ๋ฆฌ๊ฑฐ
4. EC2 ์ธ์คํด์ค ํ์ ์ ๊ทธ๋ ์ด๋, EBS ํ์ฅ ๊ณ ๋ ค
- ์ฅ๊ธฐ์ ์ผ๋ก ๋์คํฌ ์ฉ๋์ด ๋ถ์กฑํ๋ค๋ฉด ์ธ์คํด์ค ํ์
์ ์ฌ๋ฆฌ๊ฑฐ๋, EBS ๋ณผ๋ฅจ์ ํ์ฅํ๋ ๊ฒ์ด ๋ ์์ ์
(์ค์ ๋ก ํ์๋ AWS ์ธ์คํด์ค ์ฉ๋์ด 8๊ธฐ๊ฐ๋ก ์กํ ์๋ ๊ฑธ ํ์ธํ๊ณ ํ๋ฆฌ๋ฏธ์ด ์๊ธ์ ๊ฐ ์ง์ํ๋ ์ต๋ ์ฉ๋์ธ 30๊ธฐ๊ฐ๋ก ํ์ฅํ์๋ค)