💡 Git Push 만으로 서버를 업데이트하고 자동 배포할 수 있도록 구성한다. ( Github Actions, EC2 ECR/ECS 를 사용 )
문제 상황
- AWS ECR 등록 + ECS 클러스터, 서비스, Task 및 로드밸런서를 구성한 상태 + .github/workflows/.yml 파일 작성 완료 (ECS 템플릿 사용)
- MySQL DB를 사용하고, Spring Boot 어플리케이션을 배포하려고 한다.
- Dockerfile이 올바르게 작성되었고, AWS RDS를 배포한 후 로컬에서 Connection을 확인해 본 결과 정상이다.
- Github Actions의 workflow가 초록색 체크 표시가 뜨며 아무런 문제가 없다.
- 다만 AWS 클러스터의 서비스의 Task가 실패한 상황
시도
Cloud Watch에서 로그를 봤다.
처음에 jwt.secret.key가 bean 등록이 안되어 있다고 에러가 발생했다.
로컬에서 돌려보면 아무런 문제가 없다.
task-revision.json의 environment에 jwt.secret.key를 등록해주었다. → 실패: dev profile을 읽을 수 없다는 에러가 발생했다.
task-revision.json의 environment에 다음과 같이 dev 프로필을 등록해주었다. → 실패: DB를 찾을 수 없다는 에러가 발생했다.
"environment": [
{
"name": "SPRING_PROFILES_ACTIVE",
"value": "dev"
}
],
...
보안 상 application-dev.yml 파일을 깃허브에 푸시하지 않았다.
그 안에 DB 관련 정보가 다 들어있기 때문이다.
그래서 못 읽는 건가 싶어서 application-dev.yml을 푸시한 후 workflow를 다시 실행해보았다.
→ 실패: DB connection time out, 즉 DB 연결하는 데 너무 오랜 시간이 걸려 서비스가 중지되었다.
RDS 보안 그룹 인바운드 규칙을 보니 3306 포트가 열려 있긴 하나 특정 ip에 대해서만 열려 있었다.
이를 모든 ip에 대해 접근할 수 있도록 수정했다. (테스트니까… 실제 환경에서는 X)
workflow를 다시 돌려보니 그제서야 ECS 서비스의 태스크가 동작하며 정상적으로 배포가 되었다. CI/CD 환경이 구축된 것이다.
배포는 정상적으로 되었지만 보안상 너무 많은 것을 잃었다.
- DB url, username, password가 깃허브에 공개적으로 올라가 있다.
- 모든 ip, 즉, 누구나 내가 배포한 RDS에 접근할 수 있다.
해결
1, 2 둘 중에 하나만 막아도 괜찮을 것 같다.
1의 경우 actions의 secrets에 따로 데이터소스 관련 환경 변수를 등록해준 뒤, yml 파일을 다음과 같이 수정하면 된다.
- name: Build with Gradle
run: ./gradlew clean build -x test
env:
SPRING_PROFILES_ACTIVE: ${{ secrets.SPRING_PROFILES_ACTIVE }}
SPRING_DATASOURCE_URL: ${{ secrets.SPRING_DATASOURCE_URL }}
SPRING_DATASOURCE_USERNAME: ${{ secrets.SPRING_DATASOURCE_USERNAME }}
SPRING_DATASOURCE_PASSWORD: ${{ secrets.SPRING_DATASOURCE_PASSWORD }}
2의 경우 RDS 보안 그룹 인바운드 규칙에 들어가서 특정 ip만 허용하도록 구성할 수 있다.
로드밸런서 DNS를 통해 배포된 컨테이너에 접근
총 13번의 시도 끝에 AWS ECS/ECR + Github Actions를 활용한 CI/CD에 성공했다.
Cloud Watch 에서도 정상 동작하는 것을 확인했다.
💡 Cloud Watch를 잘 뜯어보자!!!
'infra > CI & CD' 카테고리의 다른 글
Gitlab-CI, Github Actions와 AWS ECS를 이용한 CI/CD 구축 (0) | 2024.08.09 |
---|