반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

Devsecops로 발전하는 엔지니어

Gitlab CI/CD를 이용한 ECS배포 -2 본문

Devops

Gitlab CI/CD를 이용한 ECS배포 -2

cloud/devops/opensource 관심 많은 곰 2025. 9. 3. 15:42
반응형

📁 GitLab 프로젝트 구조

 

 

1. Multi-container TaskDefinition

→ ecs 한개당 mysql, wordpress두개를 컨테이너로 업데이트 하기 위한 과정

  • WordPress 컨테이너 (공식 이미지)
  • MySQL 8.0 컨테이너
  • Bridge 네트워크 모드 with links
  • 볼륨 마운트로 MySQL 데이터 영속성
{
  "family": "devops-test-task",
  "networkMode": "bridge",
  "containerDefinitions": [
    {
      "name": "devops-test-container",
      "image": "wordpress:latest",
      "links": ["mysql"],
      "environment": [
        {"name": "WORDPRESS_DB_HOST", "value": "mysql:3306"}
      ]
    },
    {
      "name": "mysql",
      "image": "mysql:8.0",
      "environment": [
        {"name": "MYSQL_ROOT_PASSWORD", "value": "root123"}
      ]
    }
  ]
}

DB정보의 경우 .env 파일내부에 따로 기록 한다.

2. Gitlab-ci.yml파일 작성

stages:
  - build
  - deploy

variables:
  AWS_DEFAULT_REGION: ap-northeast-2
  ECR_REGISTRY: ECRARN 기재
  ECR_REPOSITORY: docker-test
  IMAGE_TAG: $CI_COMMIT_SHA

build:
  stage: build
  image: docker:24.0.5
  services:
    - docker:24.0.5-dind
  variables:
    DOCKER_HOST: tcp://docker:2376
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - apk add --no-cache python3 py3-pip
    - pip3 install --break-system-packages awscli
    - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY
  script:
    - echo "Building WordPress Docker image..."
    - docker build -t $ECR_REPOSITORY:$IMAGE_TAG docker/wordpress-repo
    - docker tag $ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
    - docker tag $ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
    - echo "Pushing images to ECR..."
    - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
    - docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
    - echo "Build and push completed!"
  only:
    - main

deploy:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk add --no-cache python3 py3-pip jq
    - pip3 install --break-system-packages awscli
  script:
    - echo "Deploying WordPress + MySQL multi-container to ECS..."
    - echo "Registering task definition..."
    - TASK_DEF_ARN=$(aws ecs register-task-definition --cli-input-json file://multi-container-task-def.json --region $AWS_DEFAULT_REGION --query 'taskDefinition.taskDefinitionArn' --output text)
    - echo "Task definition registered - $TASK_DEF_ARN"
    - echo "Updating ECS service..."
    - aws ecs update-service --cluster devops-test-cluster --service devops-test-service --task-definition $TASK_DEF_ARN --force-new-deployment --region $AWS_DEFAULT_REGION
    - echo "Multi-container deployment completed!"
    - echo "WordPress will be available at <http://ALB주소>"
  only:
    - main
~

3. Gitlab내부에 세팅

  • Setting → CI/CD → Variables에 Aws정보들 삽입

4. Docker-compose.yml파일 작성

version: '3.8'

services:
  wordpress:
    build: .
    container_name: wordpress-local
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME:-wordpress}
      WORDPRESS_DB_USER: ${WORDPRESS_DB_USER:-wordpress}
      WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD:-wordpress}
      WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX:-wp_}
      WORDPRESS_DEBUG: ${WORDPRESS_DEBUG:-false}
    volumes:
      - ./wp-content:/var/www/html/wp-content
      - wordpress_data:/var/www/html
    depends_on:
      - db
    networks:
      - wordpress-network

  db:
    image: mysql:5.7
    container_name: wordpress-db
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword}
      MYSQL_DATABASE: ${WORDPRESS_DB_NAME:-wordpress}
      MYSQL_USER: ${WORDPRESS_DB_USER:-wordpress}
      MYSQL_PASSWORD: ${WORDPRESS_DB_PASSWORD:-wordpress}
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - wordpress-network

volumes:
  wordpress_data:
  db_data:

networks:
  wordpress-network:
    driver: bridge
~

local에서 docker compose up -d 로 제대로 실행 되는지 확인하는게 바로 배포하기 이전에 좋다.

git add .
git commit -m "add the gitlab ci"
git push origin main

git push 되면 아래의 이미지 로직으로 배포 처리 진행이 된다.

 

 

 

반응형