Gitlab
그룹을 만들고, 프로젝트를 만든다.
인텔리제이와 연동하고 싶으면 깃랩 액세스 토큰을 발급받아 인텔리제이에 등록해준다.
간단한 테스트용 컨트롤러 하나 만들어 준다.
@RestController
public class SampleController {
@GetMapping("/sample")
public String sample() {
return "hello world";
}
}
AWS ECS/ECR
console > ECR(Elastic Container Registry) > repositoy 생성



console > ECS(Elastic Container Service) > 클러스터 생성

project-cluster를 생성하다가 실패했다.
클러스터 생성 중에 다른 짓을 하면 종종 실패한다고 한다…
이번엔 cicd-cluster로 다시 만들고 생성 완료될 때까지 대기했다.

ECS(Elastic Container Service) > 태스크 정의 > 새 태스크 정의 생성

태스크 정의 패밀리 이름을 짓고 인프라 요구 사항은 default로 둔다.
컨테이너로 가서 이름과 이미지 URI(ECR에서 만든 레포지토리 URI를 복사)를 입력하고 포트 매핑을 해준다.
나머지는 default로 두고 생성


ECS(Elastic Container Service) > 클러스터 > cicd-cluster > 서비스 생성

환경은 그대로 두고, 배포 구성에서 패밀리와 서비스 이름을 지정한다.

네트워킹에서 보안 그룹을 선택한다.

로드 밸런싱에서 로드 밸런서 유형, 컨테이너, 로드 밸런서 이름, 리스너(80)를 지정해준다.

다 했으면 생성 클릭
💡 어떠한 리소스를 생성하다가 실패하면 CloudFormation 스택에 쌓여서 동일한 이름으로는 다시 생성하지 못한다. CloudFormation에 들어가서 생성 실패한 리소스를 삭제해주고 다시 만들자.


AWS 리소스에 대한 액세스 관리: IAM
IAM > 액세스 관리 > 사용자 > 사용자 생성

간단하게 CI/CD를 구성해보는 test project니까 AdministratorAccess를 줬지만, 실제로는 꼭 필요한 권한만 주자.
직접 정책 연결을 통해 권한을 줄 수도 있고, 권한 그룹을 만들어서 사용자를 추가할 수도 있다.

생성된 사용자 들어가서 액세스 키 만들기

csv 파일 다운 받고 가지고 있자.
Gitlab Settings
프로젝트 > Settings > CI/CD > Variables > Add Variable
Key와 Value를 입력한다. Flags에 Protect variable은 체크 해제한다.


AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY 를 생성 → Value는 다운 받은 csv 파일에 있다.
인텔리제이 프로젝트에서 루트 디렉토리 경로에 .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: "AWS ECR 레포지토리 이름"
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 757703043578.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 757703043578.dkr.ecr.ap-northeast-2.amazonaws.com
- docker push 757703043578.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 [ECS 클러스터 이름] --service [ECS 클러스터 내부 서비스 이름] --task-definition [ECS 태스크 정의 이름]:1 --force-new-deployment
ECR > 프라이빗 레포지토리 > 푸시 명령 보기
여기에서 필요한 값들을 복사해서 script에 넣어주면 된다.
그리고 gitlab에 push
Project > build > Pipelines에 들어가서 확인한다.


Stages에 .gitlab-ci.yml 에 작성한 단계가 나타난다. 배포가 완료되었으므로 확인해보자.
ECS > 클러스터 > 서비스 > 로드 밸런서 보기 > DNS 이름 복사해서 새창 열고 url 입력해보자.

스프링 부트에서 반환하는 Whitelabel 페이지가 떴다.
http인지 https인지도 잘 확인하자. 이전에 80 포트로 열었기 때문에 http로 해야 한다.
앞서 만든 api를 호출해보자.
/sample

🌟 성공—— 👍🏻
코드를 좀 수정하고 다시 commit, push 해보자.
@RestController
public class SampleController {
@GetMapping("/sample")
public String sample() {
return "hello world > 수정 후 커밋해 보겠음!!";
}
}

새로운 상태가 나타났다. stages가 끝까지 완료될 때까지 기다리자. 좀 걸리네
깃랩에서 stages가 전부 완료되어도 실제로 반영되기 까지는 더 걸린다.
다시 확인

😃 SUCCESS ———
Github Actions
깃허브 액션도 해보자.
requirements → 깃허브 repo 만들고 인텔리제이랑 연동
Actions 탭에 들어가보면 다양한 템플릿들이 존재하는데 ECS를 사용할 것이다.

env 값들을 AWS에서 설정한 값에 맞게 수정해준다.
name: Deploy to Amazon ECS
on:
push:
branches: [ "main" ]
env:
AWS_REGION: ap-northeast-2
ECR_REPOSITORY: wonjun-prac/aws-ecs-cicd
ECS_SERVICE: project-cicd-service
ECS_CLUSTER: cicd-cluster
ECS_TASK_DEFINITION: .github/workflows/project-cicd-task-revision1.json
CONTAINER_NAME: project-cicd-container
permissions:
contents: read
jobs:
build:
name: Build Jar
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build
- name: Upload Build Artifacts
uses: actions/upload-artifact@v3
with:
name: build-libs
path: build/libs/*.jar
deploy:
name: Deploy
runs-on: ubuntu-latest
needs: build
environment: production
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download Build Artifacts
uses: actions/download-artifact@v3
with:
name: build-libs
path: build/libs
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
ECS_TASK_DEFINITION 의 json 파일은 .github/workflows 경로에 만들어준다.

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
위 코드의 secrets를 생성해야 한다.
repo settings > Security > Secrets and variables > Actions > New Repository Secret
AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY 를 생성
다시 Actions 들어가서 배포가 잘 되는지 확인

Github Actions와 Gitlab 비교
| Github Actions | Gitlab |
|---|---|
| .github/workflows/ci-cd.yml | .gitlab-ci.yml |
| env | variables |
| jobs | stages |
'infra > CI & CD' 카테고리의 다른 글
| [CI/CD] Github Actions, AWS ECS/ECR 트러블슈팅 (0) | 2024.08.12 |
|---|