AWS + Docker + Github Actions를 이용한 CI/CD
개발 환경 Docker AWS EC2 Ubuntu Github Actions Spring boot Java 17 Gradle 인텔리제이에서 코드를 작성 후, Github로 Push. Github에서 조건을 만족할 경우, Github Actions 실행. (develop branch에 코드가 Push, Pull Request될 경
koeyhk.tistory.com
이전 글의 과정에서
AWS + Docker + Github Actions를 이용한 CI/CD를 구축하는 데 있어 생긴 오류들을 모아봤다!
1. make application-dev.yml
# application-dev.yml 생성
- name: make application-dev.yml
run: |
cd ./src/main/resources
touch ./application-dev.yml
echo "${{ secrets.APPLICATION_DEV_YML }}" > ./application-dev.yml
shell: bash

Github Actions에서 make aplication-dev.yml 을 수행하는 중 오류 발생 !
폴더명에 공백이 있을 때 발생하는 오류라는데 고쳐지지 않았다 . .
다른 방법으로 고민해본 후 다음과 같이 작성하였다.
# Ignore yml 파일 추가
- name: Copy dev secret
env:
DEV_SECRET: ${{ secrets.APPLICATION_DEV_YML }}
DEV_SECRET_DIR: src/main/resources
DEV_SECRET_DIR_FILE_NAME: application-dev.yml
run: echo $DEV_SECRET | base64 --decode >> $DEV_SECRET_DIR/$DEV_SECRET_DIR_FILE_NAME
- DEV_SECRET : github secrets에 저장된 DEV_SECRET에 있는 암호화된 secret 파일 본문을 가져옴
- DEV_SECRET_DIR : main code에 해당 secret파일이 저장될 위치 (로컬 프로젝트 내 위치)
- DEV_SECRET_DIR_FILE_NAME : 생성될 파일 이름 (기존과 동일해야 함)
해당 방법으로 application-dev.yml 파일을 base64로 인코딩하여 Github Secrets에 등록한 후 해결됐다!
[Github Actions] Github Secrets에 secret파일 등록(secret.yml 등)
Github Secrets에 Secret파일 등록으로 CI/CD 깃허브에 올릴 때는 조심해야하는 파일들이 있는데 AWS, API 등에 접근할 수 있는 키를 가진 환경변수 등이 공유될 경우 큰 문제가 생길 수 있다. 그렇기 때문
mumomu.tistory.com
2. Docker push - denied: requested access to the resource is denied
# docker build & push to production
- name: Docker build & push to DockerHub
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }}:latest-dev .
docker push ${{ secrets.DOCKER_REPO }}:latest-dev

DockerHub에 이미지를 push 과정에서 오류가 발생하였다!
이는 이미지를 push할 때
(docker id)/(docker repository name):tag
형태로 해야하기 때문에 발생한 오류였다 . . 따라서 deploy.yml 파일을 다음과 같이 수정하였다 !
# docker build & push to production
- name: Docker build & push to DockerHub
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest-dev .
docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest-dev
# 서버에 접속하여 도커 이미지를 pull 받고 실행하기
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.DEV_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.KEY }}
port: 22
script: |
sudo docker stop spring-dev
sudo docker rm spring-dev
sudo docker image rm ${{ secrets.DOCKER_REPO }}
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest-dev
sudo docker run -d --name spring-dev -p 8080:8080 -e spring.profiles.active=dev-env ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest-dev
수정한 후 도커 이미지의 push가 잘 되는 것을 DockerHub에서 확인 가능했다

3. dial tcp ***:22: i/o timeout
- AWS EC2 인스턴스를 생성할 때 저장된 pem 키를 메모장으로 열어 -----BEGIN RSA PRIVATE KEY-----부터 -----END RSA PRIVATE KEY-----까지를 복사해서 다시 넣어줌
- EC2 인스턴스의 퍼블릭 IPv4 DNS를 복사하여 Github Secrets DEV_HOST에 등록
두 가지 과정을 거친 후 해결되었다 !
4. Github Actions에서 초록불이 떴지만 서버가 실행되지 않음!

이유를 고민하다가
docker ps
해당 명령어로 컨테이너가 돌아가고 있는지 확인해보니, 실행하지 못 하고 Exited 된 것을 확인할 수 있었다!
docker logs 컨테이너명
로그를 보니 java.sql.SQLNonTransientConnectionException: Socket fail to connect to host:address
으로 db와 연결이 되지 않는다는 것을 확인해 포트 번호가 잘못되었다는 것을 알 수 있었다.
그 후 다시 돌려보니 .. 이번에는 java.sql.SQLSyntaxErrorException: (conn=706) Unknown database
오류가 발생한 것을 확인할 수 있었다. 이는 url에 지정된 데이터베이스를 찾지 못 해 발생한 오류인데
EC2에서 show database;로 확인해본 결과,

존재하는데!!! 계속 같은 오류가 발생했다. 이미 생성된 데이터베이스임에도 불구하고 찾지 못하는 문제였다.
이는 application-dev.yml 파일에서 spring: datasource: url:의 마지막에
?createDatabaseIfNotExist=true
코드를 붙여주니 해결되었다 ,,
[Docker, Springboot] java.sql.SQLSyntaxErrorException: Unknown database
에러 : java.sql.SQLSyntaxErrorException: Unknown database 스프링부트 초기 세팅시, url 에 지정된 데이터베이스를 찾지 못해 에러가 발생했다. url에 지정한 데이터베이스명은 project 로 아래 이미지에서 확인
junior-datalist.tistory.com
이후 서버가 돌아가는 것을 확인할 수 있었다!
'Trouble Shooting' 카테고리의 다른 글
게시글 테이블과 게시글 이미지 테이블의 연관 관계 설정 (0) | 2023.11.11 |
---|---|
RDB vs NoSQL (0) | 2023.10.20 |
소셜 로그인, JWT 관련 의문점 정리 (0) | 2023.10.18 |
벌크연산과 @Modifying / Not supported for DML operations [DELETE] (0) | 2023.02.22 |
Spring Boot 프로젝트 배포 자동화 설정 문제 해결 (0) | 2023.02.04 |
AWS + Docker + Github Actions를 이용한 CI/CD
개발 환경 Docker AWS EC2 Ubuntu Github Actions Spring boot Java 17 Gradle 인텔리제이에서 코드를 작성 후, Github로 Push. Github에서 조건을 만족할 경우, Github Actions 실행. (develop branch에 코드가 Push, Pull Request될 경
koeyhk.tistory.com
이전 글의 과정에서
AWS + Docker + Github Actions를 이용한 CI/CD를 구축하는 데 있어 생긴 오류들을 모아봤다!
1. make application-dev.yml
# application-dev.yml 생성
- name: make application-dev.yml
run: |
cd ./src/main/resources
touch ./application-dev.yml
echo "${{ secrets.APPLICATION_DEV_YML }}" > ./application-dev.yml
shell: bash

Github Actions에서 make aplication-dev.yml 을 수행하는 중 오류 발생 !
폴더명에 공백이 있을 때 발생하는 오류라는데 고쳐지지 않았다 . .
다른 방법으로 고민해본 후 다음과 같이 작성하였다.
# Ignore yml 파일 추가
- name: Copy dev secret
env:
DEV_SECRET: ${{ secrets.APPLICATION_DEV_YML }}
DEV_SECRET_DIR: src/main/resources
DEV_SECRET_DIR_FILE_NAME: application-dev.yml
run: echo $DEV_SECRET | base64 --decode >> $DEV_SECRET_DIR/$DEV_SECRET_DIR_FILE_NAME
- DEV_SECRET : github secrets에 저장된 DEV_SECRET에 있는 암호화된 secret 파일 본문을 가져옴
- DEV_SECRET_DIR : main code에 해당 secret파일이 저장될 위치 (로컬 프로젝트 내 위치)
- DEV_SECRET_DIR_FILE_NAME : 생성될 파일 이름 (기존과 동일해야 함)
해당 방법으로 application-dev.yml 파일을 base64로 인코딩하여 Github Secrets에 등록한 후 해결됐다!
[Github Actions] Github Secrets에 secret파일 등록(secret.yml 등)
Github Secrets에 Secret파일 등록으로 CI/CD 깃허브에 올릴 때는 조심해야하는 파일들이 있는데 AWS, API 등에 접근할 수 있는 키를 가진 환경변수 등이 공유될 경우 큰 문제가 생길 수 있다. 그렇기 때문
mumomu.tistory.com
2. Docker push - denied: requested access to the resource is denied
# docker build & push to production
- name: Docker build & push to DockerHub
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }}:latest-dev .
docker push ${{ secrets.DOCKER_REPO }}:latest-dev

DockerHub에 이미지를 push 과정에서 오류가 발생하였다!
이는 이미지를 push할 때
(docker id)/(docker repository name):tag
형태로 해야하기 때문에 발생한 오류였다 . . 따라서 deploy.yml 파일을 다음과 같이 수정하였다 !
# docker build & push to production
- name: Docker build & push to DockerHub
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest-dev .
docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest-dev
# 서버에 접속하여 도커 이미지를 pull 받고 실행하기
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.DEV_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.KEY }}
port: 22
script: |
sudo docker stop spring-dev
sudo docker rm spring-dev
sudo docker image rm ${{ secrets.DOCKER_REPO }}
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest-dev
sudo docker run -d --name spring-dev -p 8080:8080 -e spring.profiles.active=dev-env ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest-dev
수정한 후 도커 이미지의 push가 잘 되는 것을 DockerHub에서 확인 가능했다

3. dial tcp ***:22: i/o timeout
- AWS EC2 인스턴스를 생성할 때 저장된 pem 키를 메모장으로 열어 -----BEGIN RSA PRIVATE KEY-----부터 -----END RSA PRIVATE KEY-----까지를 복사해서 다시 넣어줌
- EC2 인스턴스의 퍼블릭 IPv4 DNS를 복사하여 Github Secrets DEV_HOST에 등록
두 가지 과정을 거친 후 해결되었다 !
4. Github Actions에서 초록불이 떴지만 서버가 실행되지 않음!

이유를 고민하다가
docker ps
해당 명령어로 컨테이너가 돌아가고 있는지 확인해보니, 실행하지 못 하고 Exited 된 것을 확인할 수 있었다!
docker logs 컨테이너명
로그를 보니 java.sql.SQLNonTransientConnectionException: Socket fail to connect to host:address
으로 db와 연결이 되지 않는다는 것을 확인해 포트 번호가 잘못되었다는 것을 알 수 있었다.
그 후 다시 돌려보니 .. 이번에는 java.sql.SQLSyntaxErrorException: (conn=706) Unknown database
오류가 발생한 것을 확인할 수 있었다. 이는 url에 지정된 데이터베이스를 찾지 못 해 발생한 오류인데
EC2에서 show database;로 확인해본 결과,

존재하는데!!! 계속 같은 오류가 발생했다. 이미 생성된 데이터베이스임에도 불구하고 찾지 못하는 문제였다.
이는 application-dev.yml 파일에서 spring: datasource: url:의 마지막에
?createDatabaseIfNotExist=true
코드를 붙여주니 해결되었다 ,,
[Docker, Springboot] java.sql.SQLSyntaxErrorException: Unknown database
에러 : java.sql.SQLSyntaxErrorException: Unknown database 스프링부트 초기 세팅시, url 에 지정된 데이터베이스를 찾지 못해 에러가 발생했다. url에 지정한 데이터베이스명은 project 로 아래 이미지에서 확인
junior-datalist.tistory.com
이후 서버가 돌아가는 것을 확인할 수 있었다!
'Trouble Shooting' 카테고리의 다른 글
게시글 테이블과 게시글 이미지 테이블의 연관 관계 설정 (0) | 2023.11.11 |
---|---|
RDB vs NoSQL (0) | 2023.10.20 |
소셜 로그인, JWT 관련 의문점 정리 (0) | 2023.10.18 |
벌크연산과 @Modifying / Not supported for DML operations [DELETE] (0) | 2023.02.22 |
Spring Boot 프로젝트 배포 자동화 설정 문제 해결 (0) | 2023.02.04 |