🧡 AWS

AWS ECS로 컨테이너 관리하기: NLB와 Auto Scaling (feat. DockerHub)

MNY 2024. 11. 5. 19:29
728x90
반응형
해당 단원의 사진은 그냥 참고용!
-> 글로 적혀있는 내용을 참고하시기 바랍니다. ☺
Keyword
  1. ECS
  2. NLB
  3. Auto Scaling
  4. Fargate vs EC2

 

Flow
  1. LoadBalnace 대상 그룹 생성
  2. LoadBalanc(NLB) 생성
  3. 태스크 정의
  4. 클러스터 생성
  5. 클러스터 -> 서비스 생성

 

 Auto Scaling 종류?

  1. AWS
    1. ECS AutoScaling
    2. EC2 group AutoScaling
  2. 컨테이너 오토스케일링
    1. 쿠버네티스

 

 LoadBalance 대상 그룹 생성 

  • Fargate는 IP 주소 선택 -> IP 주소를 선택하라는 말...
    • 사진은 참고용이며, 다를 수 있음.

 

  • 대상 그룹에 아무것도 추가하지 않고 생성하기
    • 사진은 참고용이며, 다를 수 있음.

 

 LoadBalance(NLB) 생성 

  • 인터넷 경계로 선택

 

  • VPC와 서브넷은 기존의 것을 선택

 

  • 우리가 앞서 만들었던 대상그룹 선택
  • 포트 : 8080

 

 태스크 정의

  • 해당 부분에서 환경변수 설정해주는데 이 부분이 사진이 없음.
    • 혹시 모르니 환경변수 하나씩 추가하는 것을 권장…
  • 시작 유형은 전부 선택

 

  • 컨테이너 이미지 URL은 도커 허브의 레파지토리명 제대로 입력할 것
    • 계정ID / 이미지명 : tag
  • 포트 : 8080

 

  • VPC와 서브넷은 기존의 것을 사용
  • 보안 그룹도 기존으 것 사용해도 무방
    • 8080을 사용하는 보안그룹 생성 권장
  • 퍼블릭IP 켜기

 

 클러스터 생성 

 

  • 원하는 용량 : 최소 1 최대 3
  • VPC와 서브넷은 기존의 것을 사용
  • 기존 보안 그룹 사용해도 무방

 

 서비스 생성

 

  • 우리가 만들었던 로드밸런서와 대상그룹 연결하기

 

 back - Jenkins 업데이트 

Jenkins 컨테이너 내부에서 AWS CLI 설치

  • Jenkins 컨테이너 내부 관리자 권한으로 들어가기:
docker exec -itu0 jenkins
// user 0번은 보통 관리자
  • AWS CLI 설치:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

 

back - Jenkins 업데이트

pipeline {
    agent any

    environment {
        // Docker Hub credentials
        DOCKER_HUB_CREDENTIALS = 'docker-hub-credentials'
        DOCKER_HUB_REPO = 'ysy561356/today-space-back'
        DOCKER_CONTAINER = 'back-today-space-container'  // 여기에서 프로퍼티 정의
        
        // Github credentials
        GIT_CREDENTIALS_ID = 'github-token'
        GIT_BRANCH = 'release'
        GIT_URL = 'https://github.com/today-space/today-space-back.git'
        
        // AWS
        AWS_CREDENTIALS_ID = 'aws-credentials-id'  // 이 값이 Jenkins에 저장된 자격 증명의 ID입니다.
    }

    stages {
         stage('Clone Git Repository') {
             steps {
                 script {
                     // GitHub 저장소에서 코드 클론
                     git credentialsId: "${GIT_CREDENTIALS_ID}", branch: "${GIT_BRANCH}", url: "${GIT_URL}"
                    
                     // gradlew 파일에 실행 권한 부여
                     sh 'chmod +x gradlew'
                    
                     // Gradle 빌드
                     sh './gradlew build'
                    
                     // destination 디렉토리 생성
                     sh 'mkdir -p ../destination'
                     sh 'mkdir -p ../destination/build/libs'
                    
                     // JAR 파일과 Dockerfile을 특정 경로로 이동
                     sh 'cp build/libs/*.jar ../destination/build/libs'
                     sh 'cp Dockerfile ../destination/'
                 }
             }
         }
         stage('Build and Push Docker Image') {
		        steps {
		            script {
		                dir('../destination') { // 특정 경로로 이동
				                // Git 태그를 이용해 버전 설정
				                def gitTag = sh(returnStdout: true, script: 'git describe --tags --always').trim()
				                def dockerImage = docker.build("${DOCKER_HUB_REPO}:${gitTag}", "./")
		                  
				                
		                    // Docker Hub에 로그인
		                    withCredentials([usernamePassword(credentialsId: DOCKER_HUB_CREDENTIALS, usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]) {
		                        sh 'echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin'
		                    }
		                    
		                    // docker 이미지 태그별 push
		                    dockerImage.push("${gitTag}")
		                    dockerImage.push("latest")		                }
		            }
		        }
		    }
        stage('Restart Docker Compose on EC2') {
            steps {
                script {
                    withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', credentialsId: env.AWS_CREDENTIALS_ID]]) {
                        withAWS(role: 'developUser', roleAccount: '211125316339') {
                            sh """
                                aws ecs update-service --region ap-northeast-2 --cluster back-today-space-cluster --service back-today-space-service-v2 --force-new-deployment
                            """
                        }
                    }
                }
            }
        }
    }
    post {
        always {
            cleanWs()
        }
        success {
            echo 'Deployment successful!'
        }
        failure {
            echo 'Deployment failed!'
        }
    }
}

 

 참고 자료 

  • AWS CLI 설치
 

의 최신 버전으로 설치 또는 업데이트 AWS CLI - AWS Command Line Interface

이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이

docs.aws.amazon.com

 

  • ECS vs EKS 차이점?
 

ECS vs EKS의 차이점 (그리고 EC2 vs Fargate 차이)

AWS로 아키텍처를 구축하려고 할 때 4가지 아키텍처 중 1가지를 골라야 한다. AWS ECS와 EKS를 선택할 때 요구사항과 관련지어 잘 선택하는게 중요하다. 아래의 4가지 관점을 참고해서 어떤게 나에게

soohey.tistory.com

 

  • health Check 관련
 

AWS 서버 배포 중 어이없는 실수 - Health Check 관련

 

devocean.sk.com

 

 

로드밸런서 대상그룹 unhealthy 삽질기(with 권한설정)

CD 적용 시 발생한 로드밸런서 대상그룹 unhealthy 문제(with 간헐적 502 에러)

choo.oopy.io

 

NLB-TG 대상이 왜 다 비정상이 될까요? - 인프런 | 커뮤니티 질문&답변

누구나 함께하는 인프런 커뮤니티. 모르면 묻고, 해답을 찾아보세요.

www.inflearn.com

 

  • ECS 개념
 

[AWS] Elastic Container Service (ECS) 기초 개념

AWS Elastic Container Service (ECS) 서비스를 이해하고 사용하기 위한 기초 개념을 정리합니다. 1. 작업 명세 (Task Definition)과 작업(Task) 작업 명세 (Task definition)는 컨테이너로 배포할 어플리케이션에 대한

5equal0.tistory.com

 

2탄-(AWS속성과정) AWS ECS 시작하기 3/4

인프라 운영은 가상 서버에서 컨테이너 기반 운영으로 변경되고 있다. AWS에서 컨테이너 서비스는 ECS와 EKS가 있다. 그중 , ECS를 알아보고 서비스를  빠르게 구축해 보자. 유튜브 삼성전자 ECS 삼

brunch.co.kr

 

728x90
반응형