🚧 GitHub Actions CI/CD 구축 중 겪은 주요 문제 정리
MSA 구조의 auth-service를 GitHub Actions + Docker + EC2 + Docker Hub + SSH 방식으로 자동 배포하면서 여러 시행착오를 겪었다.
그 중 특히 기억에 남는 오류와 그 해결 과정을 정리해본다.
[1] GitHub에 코드 푸시
↓
[2] GitHub Actions 실행됨
↓
[3] Docker 이미지 빌드 (.jar → 이미지)
↓
[4] Docker Hub에 업로드
↓
[5] EC2에 SSH 접속
↓
[6] EC2에서 docker-compose pull & up 명령어 실행
↓
[7] 컨테이너가 실행되고 서비스 배포 완료
(1) src/main/resources/application.yml 파일을 Base64 인코딩하여 출력
cat src/main/resources/application.yml | base64
(2) application.yml 파일을 Base64 인코딩 후 Github Secrets 'APPLICATION_YML'에 추가

(3) .gitignore에 application.yml 추가
(4) main 브랜치 git actions
name: CI/CD Docker Deploy to EC2
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1. GitHub 리포지토리 체크아웃
- name: Checkout code
uses: actions/checkout@v4
# 2. Docker Hub 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
# 3. 도커 이미지 빌드 & 푸시 - auth-service
- name: Build & Push auth-service
# working-directory: ./msa-auth-service
run: |
# resources 디렉토리가 없을 경우 생성
mkdir -p src/main/resources
# GitHub Secrets에 등록한 application.yml 내용을 복사
echo "${{ secrets.AUTH_APPLICATION_YML }}" | base64 -d > src/main/resources/application.yml
docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/auth-service .
docker push ${{ secrets.DOCKER_HUB_USERNAME }}/auth-service
# 4. EC2에 SSH 접속 & 배포
- name: Deploy to EC2 via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/auth-service
docker-compose pull auth-prod
docker-compose up -d auth-prod
docker image prune -f
# 5-1. 성공 시 알림
- name: Send Discord Success Notification
if: success()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_BACK }}
with:
args: |
✅ [${{ github.actor }}]님이 `${{ github.repository }}` 레포지토리에서 **배포를 완료**했어요!
🔗 커밋: ${{ github.sha }}
# 5-2. 실패 시 알림
- name: Send Discord Failure Notification
if: failure()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_BACK }}
with:
args: |
❌ [${{ github.actor }}]님이 `${{ github.repository }}` 레포지토리에서 **배포에 실패**했어요!
🔍 에러 로그를 확인해주세요.
(5) dev 브랜치 git actions
name: CI/CD Docker Deploy to EC2 - DEV
on:
push:
branches: [ dev ]
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1. GitHub 리포지토리 체크아웃
- name: Checkout code
uses: actions/checkout@v4
# 2. Docker Hub 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
# 3. 도커 이미지 빌드 & 푸시 - auth-service
- name: Build & Push dev auth-service
# working-directory: ./msa-auth-service
run: |
# resources 디렉토리가 없을 경우 생성
mkdir -p src/main/resources
# GitHub Secrets에 등록한 application.yml 내용을 복사
echo "${{ secrets.AUTH_APPLICATION_YML }}" | base64 -d > src/main/resources/application.yml
docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/auth-service:dev .
docker push ${{ secrets.DOCKER_HUB_USERNAME }}/auth-service:dev
# 4. EC2에 SSH 접속 & 배포
- name: Deploy to EC2 via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/auth-service
docker-compose pull auth-service-dev
docker-compose up -d auth-service-dev
docker image prune -f
# 5-1. 성공 시 알림
- name: Send Discord Success Notification
if: success()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_BACK }}
with:
args: |
✅ [${{ github.actor }}]님이 `dev` 브랜치에서 **배포를 완료**했어요!
🔗 커밋: ${{ github.sha }}
# 5-2. 실패 시 알림
- name: Send Discord Failure Notification
if: failure()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_BACK }}
with:
args: |
❌ [${{ github.actor }}]님이 `dev` 브랜치에서 **배포를 실패**했어요!
🔍 에러 로그를 확인해주세요.
(6) auth-service Dockerfile
FROM gradle:8.4-jdk17 AS builder
COPY . /app
WORKDIR /app
RUN gradle clean build -x test
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/build/libs/*-SNAPSHOT.jar ./app.jar
EXPOSE 8100
ENTRYPOINT ["java", "-jar", "app.jar"]
(7) git actions 실행 후 확인
git add .
git commit -m "feat : 커밋 메시지"
git push -u origin main or git push -u origin dev

배포 과정 중 오류들
🔥 1. Docker 로그인 오류: Username and password required
📌 에러 로그
Error: Username and password required
❓ 원인
- docker/login-action@v3에서 Docker Hub 로그인을 시도했는데,
DOCKER_HUB_USERNAME 또는 DOCKER_HUB_PASSWORD가 GitHub Secrets에 누락되었거나 오타가 있었음.
✅ 해결 방법
- GitHub 레포지토리 > Settings → Secrets에 아래 두 개를 정확하게 등록:
- DOCKER_HUB_USERNAME: Docker Hub ID
- DOCKER_HUB_PASSWORD: 비밀번호 또는 Access Token (추천)
🔥 2. GitHub Actions에서 bad substitution 오류
📌 에러 로그
bad substitution
❓ 원인
- echo "${{ secrets.APPLICATION_YML }}" > src/main/resources/application.yml 같은 식으로
GitHub Actions 템플릿 문법 (${{ }})을 Shell 스크립트 내부에서 직접 사용했기 때문
✅ 해결 방법
- application.yml 파일을 base64로 인코딩하여 Secrets에 저장하고, Actions에서 복호화해서 사용
# 로컬에서 인코딩
base64 -i src/main/resources/application.yml
# Actions에서 복호화
echo "${{ secrets.APPLICATION_YML_BASE64 }}" | base64 -d > src/main/resources/application.yml
🔥 3. EC2 SSH 연결 실패: no such host
📌 에러 로그
dial tcp: lookup *** on 168.63.129.16:53: no such host
❓ 원인
- EC2_HOST 값에 잘못된 도메인이 들어가 있었음
✅ 해결 방법
- GitHub Secrets에 EC2_HOST 값을 정확한 EC2 퍼블릭 IP 또는 퍼블릭 DNS로 설정
예: ec2-3-38-204-1.ap-northeast-2.compute.amazonaws.com
(1) ssh 접속
ssh -i "my-key.pem" ubuntu@ec4-2-32-48-125.ap-northeast-2.compute.amazonaws.com
(2)
mkdir -p ~/auth-service
cd ~/auth-service
(3) docker-compose.yml 작성
nano docker-compose.yml
version: '3.8'
services:
auth-prod:
image: dockerhub_id/auth-service:latest
ports:
- "8100:8100"
container_name: auth-prod
depends_on:
- mysql
networks:
- msa-network
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: database password
MYSQL_DATABASE: database name
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- msa-network
networks:
msa-network:
volumes:
mysql-data:
✅ 입력 후 저장:
- Ctrl + O → 저장
- Enter → 확인
- Ctrl + X → 종료
vybz.kr:8100/ping 실행

CI/CD 자동 배포에서 컨테이너가 안 뜨고 계속 실패했던 원인
✅ 1. application.yml이 Docker 이미지에 포함되지 않음
🔥 실제 문제:
echo "${{ secrets.AUTH_APPLICATION_YML }}" base64 -d > src/main/resources/application.yml
→ base64 -d를 파이프로 연결하지 않고 문자열처럼 잘못 작성해서
실제로는 application.yml이 생성되지 않음 → Docker 이미지에 포함되지 않음
📌 영향:
- Spring Boot 앱 실행 시 datasource 설정이 없어서 실패
- 로그에서 Failed to determine a suitable driver class, url not specified 등 발생
✅ 2. GitHub Secrets에 들어간 base64 값이 macOS에서 잘못 인코딩됨
🔥 실제 문제:
base64 -i src/main/resources/application.yml
→ macOS에선 되지만 GitHub Actions(Linux 기반)에서는 이 -i 옵션이 무효
📌 영향:
- GitHub Actions에서 디코딩 시도할 때 에러 없이 실행은 되지만 내용이 없음
- 결과적으로 Dockerfile 내에 application.yml 파일이 없어 앱이 죽음
✅ 3. GitHub Actions에서 디코딩 후 내용 확인을 안 했음
🔥 놓쳤던 부분:
초기에 디코딩 후 실제 application.yml이 잘 들어갔는지 검증하지 않음
📌 해결책:
아래처럼 디코딩 후 내용을 출력해서 확인하는 단계 추가
- name: Build & Push auth-service
run: |
# resources 디렉토리가 없을 경우 생성
mkdir -p src/main/resources
# GitHub Secrets에 등록한 application.yml 내용을 복사
echo "${{ secrets.AUTH_APPLICATION_YML }}" | base64 -d > src/main/resources/application.yml
# 디코딩된 application.yml 확인
echo "application.yml 내용:"
cat src/main/resources/application.yml
docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/auth-service .
docker push ${{ secrets.DOCKER_HUB_USERNAME }}/auth-service
→ 이걸로 문제가 있는지 바로 확인 가능했음
eureka-service

name: CI/CD Docker Deploy to EC2
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1. GitHub 리포지토리 체크아웃
- name: Checkout code
uses: actions/checkout@v4
# 2. Docker Hub 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
# 3. 도커 이미지 빌드 & 푸시 - auth-service
- name: Build & Push eureka-service
run: |
# resources 디렉토리가 없을 경우 생성
mkdir -p src/main/resources
# GitHub Secrets에 등록한 application.yml 내용을 복사
echo "${{ secrets.EUREKA_APPLICATION_YML }}" | base64 -d > src/main/resources/application.yml
# 디코딩된 application.yml 확인
echo "application.yml 내용:"
cat src/main/resources/application.yml
docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/eureka-service .
docker push ${{ secrets.DOCKER_HUB_USERNAME }}/eureka-service
# 4. EC2에 SSH 접속 & 배포
- name: Deploy to EC2 via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/eureka-service
docker-compose pull eureka
docker-compose up -d eureka
docker image prune -f
# 5-1. 성공 시 알림
- name: Send Discord Success Notification
if: success()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_BACK }}
with:
args: |
✅ [${{ github.actor }}]님이 `${{ github.repository }}` 레포지토리에서 **배포를 완료**했어요!
🔗 커밋: ${{ github.sha }}
# 5-2. 실패 시 알림
- name: Send Discord Failure Notification
if: failure()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_BACK }}
with:
args: |
❌ [${{ github.actor }}]님이 `${{ github.repository }}` 레포지토리에서 **배포에 실패**했어요!
🔍 에러 로그를 확인해주세요.
FROM gradle:8.4-jdk17 AS builder
COPY . /app
WORKDIR /app
RUN gradle clean build -x test
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/build/libs/*-SNAPSHOT.jar ./app.jar
EXPOSE 8761
ENTRYPOINT ["java", "-jar", "app.jar"]
spring:
application:
name: eureka-service
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
management:
metrics:
enable:
system: false
mkdir -p eureka-service
cd eureka-service
nano docker-compose.yml
version: '3.8'
services:
eureka :
image: dockerhub_id/eureka-service:latest
ports:
- "8761:8761"
container_name: eureka
networks:
- msa-network
networks:
msa-network:
git add .
git commit -m "feat : 커밋 메시지"
git push -u origin main

gateway-service

name: CI/CD Docker Deploy to EC2
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1. GitHub 리포지토리 체크아웃
- name: Checkout code
uses: actions/checkout@v4
# 2. Docker Hub 로그인
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
# 3. 도커 이미지 빌드 & 푸시 - gateway-service
- name: Build & Push gateway-service
run: |
# resources 디렉토리가 없을 경우 생성
mkdir -p src/main/resources
# GitHub Secrets에 등록한 application.yml 내용을 복사
echo "${{ secrets.GATEWAY_APPLICATION_YML }}" | base64 -d > src/main/resources/application.yml
# 디코딩된 application.yml 확인
echo "application.yml 내용:"
cat src/main/resources/application.yml
docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/gateway-service .
docker push ${{ secrets.DOCKER_HUB_USERNAME }}/gateway-service
# 4. EC2에 SSH 접속 & 배포
- name: Deploy to EC2 via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/gateway-service
docker-compose pull gateway
docker-compose up -d gateway
docker image prune -f
# 5-1. 성공 시 알림
- name: Send Discord Success Notification
if: success()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_BACK }}
with:
args: |
✅ [${{ github.actor }}]님이 `${{ github.repository }}` 레포지토리에서 **배포를 완료**했어요!
🔗 커밋: ${{ github.sha }}
# 5-2. 실패 시 알림
- name: Send Discord Failure Notification
if: failure()
uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_BACK }}
with:
args: |
❌ [${{ github.actor }}]님이 `${{ github.repository }}` 레포지토리에서 **배포에 실패**했어요!
🔍 에러 로그를 확인해주세요.
FROM gradle:8.4-jdk17 AS builder
COPY . /app
WORKDIR /app
RUN gradle clean build -x test
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/build/libs/*-SNAPSHOT.jar ./app.jar
EXPOSE 8000
ENTRYPOINT ["java", "-jar", "app.jar"]
server:
port: 8000
forward-headers-strategy: framework
spring:
application:
name: gateway-service
main:
web-application-type: reactive
cloud:
gateway:
default-filters:
- DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials
global-cors:
cors-configurations:
'[/**]':
allowedOrigins:
- 'http://localhost:3000'
allow-credentials: true
allowedHeaders:
- x-requested-with
- Authorization
- content-type
- credential
- X-AUTH-TOKEN
- X-CSRF-TOKEN
allowedMethods:
- PUT
- PATCH
- GET
- POST
- DELETE
- OPTIONS
routes:
- id : auth-service
uri : lb://auth-service
predicates:
- Path=/auth-service/**
filters:
- StripPrefix=1
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka:8761/eureka/
mkdir -p gateway-service
cd gateway-service
nano docker-compose.yml
version: '3.8'
services:
gateway:
image: dockerhub_id/gateway-service:latest
ports:
- "8000:8000"
container_name: gateway
networks:
- msa-network
networks:
msa-network:
git add .
git commit -m "feat : 커밋 메시지"
git push -u origin main

🧨 MSA 배포 과정에서 겪은 문제점과 해결 방법 (feat. Docker Compose)
💡 문제 1. 컨테이너 간 통신 실패 (eureka 연결 안 됨)
- 현상: auth-service, gateway-service가 http://eureka:8761/eureka/로 Eureka에 등록되지 않음
- 원인: 도커 컨테이너 간 통신을 위한 공통 네트워크(msa-network)가 없었음
docker network create msa-network
💡 문제 2. 컨테이너가 같은 네트워크에 묶여있지 않아 DNS가 안됨
- 현상: Gateway가 auth-service를 찾지 못해 503 오류 발생
- 원인: 각 서비스의 docker-compose.yml에 네트워크를 선언하긴 했지만, 공통 네트워크를 공유하지 않음
- 해결 방법: 각 서비스별 docker-compose.yml에 아래 설정 추가
networks:
msa-network:
external: true
eureka-service docker-compose.yml :
version: '3.8'
services:
eureka :
image: jiho0815/eureka-service:latest
ports:
- "8761:8761"
container_name: eureka
networks:
- vybz-network
networks:
vybz-network:
external: true
gateway-service docker-compose.yml :
version: '3.8'
services:
gateway:
image: jiho0815/gateway-service:latest
ports:
- "8000:8000"
container_name: gateway
networks:
- vybz-network
networks:
vybz-network:
external: true
auth-service docker-compose.yml :
version: '3.8'
services:
auth-prod:
image: jiho0815/auth-service:latest
ports:
- "8100:8100"
container_name: auth-prod
networks:
- vybz-network
networks:
vybz-network:
external: true
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: 20010815
MYSQL_DATABASE: msa-practice
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- vybz-network
networks:
vybz-network:
external: true
volumes:
mysql-data:
network 목록 확인
docker network ls
NETWORK ID NAME DRIVER SCOPE
e159f0a6cb20 msa-network bridge local
msa-network에 대한 상세 정보를 JSON 형식으로 출력 :
docker network inspect msa-network
[
{
"Name": "msa-network",
"Id": "e159f0a6cb2012a72aba230b4161c95bfd6725acd5e2c8a8cf3f79c11f96c2b7",
"Created": "2025-05-21T12:01:50.349982686Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.22.0.0/16",
"Gateway": "172.22.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0798e8193bcbcf37a9034e8f5fe76b8e89e50244bcb98dbad0334921e7ab68ce": {
"Name": "eureka",
"EndpointID": "870170cec90ccd6eed6b9a124aad069b8fd5c74b3fb86506330b04fc95f96416",
"MacAddress": "02:42:ac:16:00:02",
"IPv4Address": "172.22.0.2/16",
"IPv6Address": ""
},
"2ec812cab25c0c34677576dfee7912366bb2eac849078f5468105ac7e44edcd2": {
"Name": "auth-prod",
"EndpointID": "1304e49ea59b3489908e913e3f3150304b0d4cd7d645364e520db78bc9835121",
"MacAddress": "02:42:ac:16:00:05",
"IPv4Address": "172.22.0.5/16",
"IPv6Address": ""
},
"ccf4d95f1ff7f8c2f4ffc9b6dd1ff7148990cf8e92176a46f40419354c28a3f5": {
"Name": "mysql",
"EndpointID": "1717f8cff84a30146ad3e4535413a86b469f7ddd615bc2fdb1daa38403cb2bc6",
"MacAddress": "02:42:ac:16:00:03",
"IPv4Address": "172.22.0.3/16",
"IPv6Address": ""
},
"cf4985531530b7e1675ffb09141cef2a01d0e6ecf8cf9dcc1abe8e3d498fc6b0": {
"Name": "gateway",
"EndpointID": "37251bbf2fa2ff4769130d8b7c77bdcd5fc4cc4e1a1d88f352a70d52ed7906dc",
"MacAddress": "02:42:ac:16:00:04",
"IPv4Address": "172.22.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
상위 폴더 안에 auth-service, eureka-service, gateway-service, mysql 등을 넣자 !
그 전에 폴더와 파일, 이미지들을 정리하자 !
목표로 하는 구조 :
vybz/
├── auth-service/
│ └── docker-compose.yml
├── eureka-service/
│ └── docker-compose.yml
├── gateway-service/
│ └── docker-compose.yml
├── mysql/
│ └── docker-compose.yml
(1) 현재 실행 중인 컨테이너 확인
docker ps -a
(2) 실행 중인 컨테이너 중지 및 삭제
docker stop auth-prod mysql eureka gateway
docker rm auth-prod mysql eureka gateway
(3) 불필요한 네트워크 삭제
docker network ls
docker network rm msa-network
(4) 불필요한 볼륨도 정리
docker volume ls
docker volume rm mysql-data
(5) 이미지 삭제
docker images
docker rmi <이미지ID>
(6) 마지막으로 확인
docker ps -a
docker network ls
docker volume ls
(7) docker-compose.yml 삭제
cd 서비스 이름
rm -rf docker-compose.yml
(8) 빈 폴더 삭제
rmdir auth-service
(9) vybz 최상위 폴더 생성
mkdir vybz
cd vybz
(10) auth-service, eureka-service, gateway-service, mysql 폴더 생성
mkdir -p auth-service
mkdir -p eureka-service
mkdir -p gateway-service
mkdir -p mysql
(11) 각 서비스마다 docker-compose.yml 생성 후 작성
nano docker-compose.yml
(12) 최상위 경로에서 네트워크 생성
docker network create vybz-network
(13) 각 서비스 실행
cd vybz/mysql
docker-compose up -d
cd ../eureka-service
docker-compose up -d
cd ../auth-service
docker-compose up -d
cd ../gateway-service
docker-compose up -d'Study > TIL | AWS' 카테고리의 다른 글
| Route53부터 Certbot까지 : HTTPS 서버 구축 초기 과정 (2) | 2025.07.21 |
|---|---|
| EC2 인스턴스 메모리 부족 문제 해결기 (2) | 2025.07.14 |
| EC2 인스턴스 EBS 볼륨 확장 및 파일 시스템 확장 방법 (0) | 2025.06.15 |
| AWS S3 사용 전 꼭 알아야 할 IAM 권한 설정 가이드 (2) | 2025.06.15 |
| 처음부터 끝까지! GitHub Actions로 EC2 자동 배포하기 (8) | 2025.05.19 |