1. GitLab
- GitLab으로 CI/CD 환경 구축 후 CI 과정 자동화
- GitLab 프로젝트를 생성 후 개발한 코드를 PUSH
- GitLab은 코드 Push 된 것을 확인하고 Docker Image를 생성 ECR에 등록
- 이 Docker Image로부터 Docker Container를 ECS에 실행하게 됨.
1) GitLab 가입 및 그룹, 프로젝트 생성
The most-comprehensive AI-powered DevSecOps platform
From planning to production, bring teams together in one application. Ship secure code more efficiently to deliver value faster.
about.gitlab.com
2) Spring 프로젝트 생성 및 GitLab과 연동 준비
- VCS > Enable Version Control Integration… 에서 Git 선택
- Git > Manage Remotes… 으로 GitLab이랑 연동
- GitLab이랑 연동한 상태이기 때문에 Local로 한 번 Pull 땡겨줘야 함.
- Controller, application.properties, Dockerfile 생성 및 설정
2. AWS 보안그룹 추가
- EC2 > 보안그룹
- 포트번호 80, 8080 소스 0.0.0.0/0으로 인바운드 규칙 편집 > 규칙 추가
3. AWS ECR
- Elastic Container Registry
- 리포지토리 생성
- GitLab 주소 따와서 프라이빗 리포지토리 생성
- 생성된 리포지토리 들어가서 푸시 명령 보기 누르면 어떻게 써야하는지 확인할 수 있음.
4. AWS ECS
- Elastic Container Service
1) 클러스터 생성
2) 태스크 정의 생성
→ ECR 리포지토리 URI 복사해와서 컨테이너 이미지 URL에 붙여넣기
3) 서비스 생성
- 클러스터 이름 클릭 후 서비스 영역에서 생성
- 서비스 생성 실패했는데 이거 파악할 시간 없음… 일단 넘어간다.
5. AWS IAM
- 사용자 생성 후 액세스 키 만들기 > 기타 > 설명 태그 값 (빈 값으로) > 액세스 키 생성 > .csv 파일 다운로드
그 .csv 파일 안에 액세스 키 + 액세스 시크릿 키 있음. 그게 ID랑 Password임.
6. GitLab CI 파일 작성 및 PUSH
- GitLab > Settings > CI/CD > Variables
- Add variable > IAM에서 만든 액세스 키 .csv 파일을 보고 각각 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY Value에 값 넣으면 됨.
- .gitlab-ci.yml 파일 만들기
services:
- docker:stable-dind
stages:
- build jar
- build and push docker image
- deploy
variables:
APPLICATION_NAME: "01"
TAG_NAME: "latest"
DOCKER_IMAGE: "group-013651812/project-01"
build:
image: openjdk:17-jdk-slim
stage: build jar
script:
- chmod +x gradlew
- ./gradlew clean build
artifacts:
paths:
- build/libs/*.jar
docker build:
image: docker:latest
stage: build and push docker image
rules:
- if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_REF_NAME == "main"
variables:
TAG_NAME: "latest"
- if: $CI_COMMIT_BRANCH == "develop" || $CI_COMMIT_REF_NAME == "develop"
variables:
TAG_NAME: "develop"
script:
- apk add --update --no-cache curl py3-pip py3-virtualenv
- python3 -m venv /tmp/venv
- source /tmp/venv/bin/activate
- pip install awscli
- aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
- aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
- aws configure set region ap-northeast-2
- docker build -t $DOCKER_IMAGE .
- docker tag $DOCKER_IMAGE:latest 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com/$DOCKER_IMAGE:$TAG_NAME
- aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com
- docker push 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com/$DOCKER_IMAGE:$TAG_NAME
deploy:
image: python:3.9-slim
stage: deploy
script:
- python3 -m venv /tmp/venv
- source /tmp/venv/bin/activate
- pip install awscli
- aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
- aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
- aws configure set region ap-northeast-2
- aws ecs update-service --cluster project-cluster --service project-01-service --task-definition project-01-task:1 --force-new-deployment
→ 그대로 사용하면 안됨!! 아까 봤던 도커 푸시 명령 보기에 맞춰 script 수정해야 함!!
- 그대로 커밋!!
- GitLab > Build > Pipelines
7. 결과
- ECS > 클러스터 > 서비스 > 로드밸런서 > DNS 이름 복사 후 실행
8. Github Actions
- Git > Share Project on GitHub
- Actions > ECS 검색 > Deploy to Amazon ECS Configure > Commit changes…
- 웹 상으로 수정해서 커밋해도 반영됨. 그럼 workflows > aws.yml 만들어짐.
- project-01-task-revision1.json는 아래처럼 json 파일 다운로드 받아서 만들고 workflows에 넣으면 됨.
- Settings > Secrets and variables > New repository secret 으로 액세스 키 값 넣어주면 됨.
서비스 배포 실패하고 IAM 이후는 그냥 강의 캡쳐하면서 흐름 따라간 거임...
아, 왜 서비스 안됨? 나중에 여유있을 때 다시 해봐야할 듯...
DDD 특강 정리해야하는데 강의 듣기에 급급허다...
'TIL' 카테고리의 다른 글
TIL17. Redis (2) SpringBoot로 Redis 사용해보기 + 실습 (0) | 2025.03.06 |
---|---|
TIL16. Redis (1) 특징, 설치, 타입별 명령어 (0) | 2025.03.05 |
TIL14. Docker (0) | 2025.02.28 |
TIL12. 1차 배달 플랫폼 프로젝트 회고 (0) | 2025.02.26 |
TIL11. 테스트의 늪 (0) | 2025.02.25 |