이 모듈에서는 node.js 애플리케이션을 Application Load Balancer(ALB)를 기반으로 상호 연결된 일련의 서비스로 배포합니다. 그런 다음 ALB를 사용하여 모놀리스의 트래픽을 마이크로서비스로 원활하게 전환합니다. 구축 시작

이 프로세스에 따라 마이크로서비스를 시작하고 애플리케이션의 트래픽을 모놀리스로부터 안전하게 전환합니다.

아키텍처 개요
  1. 배포된 모놀리스
    시작 구성입니다. Amazon ECS의 컨테이너에서 실행되는 모놀리스 node.js 앱입니다.
  2. 마이크로서비스 시작
    이전 모듈에서 구축해 Amazon ECR로 푸시한 세 가지 컨테이너 이미지를 사용하여 기존 Amazon ECS 클러스터에서 세 가지 마이크로서비스를 시작합니다.
  3. 대상 그룹 구성
    모듈 2에서와 마찬가지로 각 서비스의 대상 그룹을 추가하고 새 마이크로서비스에 연결하도록 ALB 규칙을 업데이트합니다.
  4. 트래픽 전환 및 모놀리스 종료
    ALB에서 규칙을 하나 변경하여 실행 중인 마이크로서비스로 트래픽을 라우팅하기 시작합니다. 모두 정상적으로 작동하면 모놀리스를 종료합니다.

아래의 단계별 지침에 따라 마이크로서비스를 배포합니다. 섹션을 확장하려면 각 단계 번호를 클릭하십시오.

break-the-monolith
  • 1단계. 서비스의 작업 정의 작성

    모듈 2에서부터 실행 중인 동일한 클러스터에 세 가지 새로운 마이크로서비스를 배포합니다. 모듈 2에서와 마찬가지로 각 서비스의 작업 정의를 작성합니다.

    ⚐ 참고: 작업 정의에는 컨테이너를 여러 개 추가할 수 있으므로 단일 서비스에서 세 가지 마이크로서비스를 모두 서로 다른 컨테이너로 실행하는 것도 가능합니다. 하지만 이렇게 할 경우 모든 컨테이너를 서비스와 함께 선형적으로 확장해야 하므로 모놀리스 방식에서 벗어나지 못합니다. 3개의 독립적인 서비스를 구축하는 것이 목표이므로, 서비스마다 해당 서비스용 이미지를 사용하여 컨테이너를 실행하는 자체 작업 정의가 필요합니다.

    이러한 작업 정의는 콘솔 UI에서 작성하거나, JSON으로 작성하여 속도를 높일 수 있습니다. 작업 정의를 JSON 파일로 작성하려면 새 Task Definition(작업 정의) 화면의 하단에서 Configure via JSON(JSON을 통해 구성)을 선택합니다.

    작업 정의에 대한 파라미터는 다음과 같습니다.

    • Name = [service-name] 
    • Image = [service ECR repo URL]:latest 
    • cpu = 256 
    • memory = 256 
    • Container Port = 3000 
    • Host Post = 0



    또는 JSON을 사용할 경우:

    {
        "containerDefinitions": [
            {
                "name": "[service-name]",
                "image": "[account-id].dkr.ecr.us-west-2.amazonaws.com/[service-name]:[tag]",
                "memoryReservation": "256",
                "cpu": "256",
                "essential": true,
                "portMappings": [
                    {
                        "hostPort": "0",
                        "containerPort": "3000",
                        "protocol": "tcp"
                    }
                ]
            }
        ],
        "volumes": [],
        "networkMode": "bridge",
        "placementConstraints": [],
        "family": "[service-name]"
    }

    ♻ 이 프로세스를 반복하여 서비스마다 작업 정의를 작성합니다.

    • posts
    • threads
    • users
  • 2단계. Application Load Balancer 구성: 대상 그룹

    모듈 2에서와 마찬가지로 각 서비스의 대상 그룹을 구성합니다. 대상 그룹은 트래픽이 각 서비스에 제대로 전달되도록 합니다.

    VPC 이름 확인: AWS CloudFormation 스택에는 자체 VPC가 있는데, 대개 기본 VPC가 아닙니다. 올바른 VPC로 대상 그룹을 구성하는 것이 중요합니다.

    • EC2 콘솔의 Load Balancer(로드 밸런서) 섹션으로 이동합니다.
    • demo라는 이름의 로드 밸런서가 이미 있습니다.
    • 확인란을 선택하여 로드 밸런서 세부 정보를 확인합니다.
    • 세부 정보 페이지의 VPC 속성 값을 기록해 둡니다.

     

    대상 그룹 구성

    • EC2 콘솔의 Target Group(대상 그룹) 섹션으로 이동합니다.
    • Create target group(대상 그룹 생성)을 선택합니다.
    • 대상 그룹 구성(여기에 별도로 명시되어 있지 않은 경우 기본값을 수정하지 않음): Name = [service-name] Protocol = HTTP Port = 80 VPC = 이전 단계의 로드 밸런서와 일치하는 VPC를 선택합니다
      • 고급 상태 확인 설정: Healthy threshold = 2 Unhealthy threshold = 2 Timeout = 5 Interval = 6
    • Create(생성)를 선택합니다.

     

    ♻ 이 프로세스를 반복하여 서비스마다 대상 그룹을 생성합니다.

    • posts
    • threads
    • users

     

    마지막으로, 네 번째 대상 그룹 생성

    • drop-traffic

    이 대상 그룹은 '더미' 대상으로, 마이크로서비스를 완전히 실행한 후에 트래픽이 모놀리스에 도달하지 않도록 하기 위해 사용합니다. 테이블에 총 5개의 대상 그룹이 있습니다.

    개 대상 그룹
  • 3단계. 리스너 규칙 구성

    리스너는 트래픽을 적절하게 라우팅하기 위해 ALB에 수신되는 연결 요청을 점검합니다.

    현재 4개의 서비스(모놀리스 및 3개의 마이크로서비스) 모두 동일한 로드 밸런서를 기반으로 실행 중입니다. 모놀리스에서 마이크로서비스로 전환하기 위해 마이크로서비스로 트래픽을 라우팅하기 시작하고 모놀리스로의 트래픽 라우팅을 중지합니다.

    리스너 열기

    • EC2 콘솔의 Load Balancer(로드 밸런서) 섹션으로 이동합니다.
    • demo라는 이름의 로드 밸런서가 이미 있습니다.
    • 확인란을 선택하여 로드 밸런서 세부 정보를 확인합니다.
    • Listeners(리스너) 탭을 선택합니다.

     

    리스너 규칙 업데이트

    • 리스너에 대해 View/edit rules(규칙 보기/편집) >를 선택합니다.
    • +를 선택하고 규칙을 삽입합니다.
    • 규칙 조건은 다음과 같습니다.
      • IF Path = /api/[service-name]* THEN Forward to [service-name]
      • 예: Path = /api/posts* forward to posts
    • 모놀리스로의 트래픽을 유지하는 규칙 1개와 각 서비스에 대한 규칙 1개씩, 총 4개의 규칙을 새로 생성합니다. 기본 규칙을 포함하여 총 5개의 규칙을 갖게 됩니다. 다음과 같은 순서로 규칙을 추가해야 합니다.
      • api: /api* forwards to api
      • users: /api/users* forwards to users
      • threads: /api/threads* forwards to threads
      • posts: /api/posts* forwards to posts
    • 페이지 왼쪽 상단에서 뒤로 화살표를 선택하여 로드 밸런서 콘솔로 돌아갑니다.
    리스너 규칙 구성
  • 4단계. 마이크로서비스 배포

    이제 클러스터에 3가지 서비스를 배포합니다. 각각의 서비스에 대해 다음 단게를 반복합니다.

    • Amazon ECS 콘솔의 왼쪽에서 'Clusters(클러스터)' 메뉴로 이동합니다.
    • 클러스터(BreakTheMonolith-Demo-ECSCluster)를 선택합니다.
    • Services(서비스) 탭에서 Create(생성)를 선택합니다.
    • 서비스 구성(기본값을 수정하지 않음): Task definition = X에 대해 가장 높은 값 선택: [service-name]:X(대부분의 경우 X = 1) Service name = [service-name] Number of tasks = 1
    • Configure ELB(ELB 구성) 선택
      • ELB Type = Application Load Balancer
      • IAM 역할에 대해 BreakTheMonolith-Demo-ECSServiceRole 선택
      • demo 로드 밸런서를 선택합니다.
      • Add to ELB(ELB에 추가)를 선택합니다.
    • 대상 그룹에 서비스를 추가합니다.
      • Listener port = 80:HTTP
      • Target group name = 그룹 선택: [service-name]
    • Save(저장)를 선택합니다.
    • Create Service(서비스 생성)를 선택합니다.
    • View Service(서비스 보기)를 선택합니다.


    몇 초 안에 모든 서비스가 시작됩니다. 계속 진행하기 전에 모든 서비스와 작업이 정상적으로 실행 중인지 다시 확인합니다.

    마이크로서비스 배포
  • 5단계. 마이크로서비스로 트래픽 전환

    지금은 마이크로서비스가 실행 중이지만, 모든 트래픽이 아직 모놀리스 서비스로 전달되고 있습니다.

    마이크로서비스로 트래픽을 다시 라우팅하도록 리스너 규칙 업데이트:

    • EC2 콘솔의 Load Balancer(로드 밸런서) 섹션으로 이동합니다.
    • demo 로드 밸런서에서 리스너에 대해 View/edit rules(규칙 보기/편집) >를 선택합니다.
    • 첫 번째 규칙(/api* forwards to api)을 삭제합니다.
    • drop-traffic으로 전달하도록 기본 규칙을 업데이트합니다.

    다음과 같이 규칙을 업데이트해야 합니다.

    마이크로서비스로 트래픽 전환

    모놀리스 해제: 이제 트래픽이 마이크로서비스로 전달되며, 모놀리스 서비스를 가동 중지할 수 있습니다.

    • Amazon ECS 클러스터, BreakTheMonolith-Demo-ECSCluster로 돌아갑니다.
    • api 서비스를 선택한 후 Update(업데이트)를 선택합니다.
    • Number of Tasks(작업 수)를 0으로 변경합니다.
    • Update Service(서비스 업데이트)를 선택합니다.

     

    이제 Amazon ECS가 서비스가 배포된 클러스터의 컨테이너에서 모든 연결을 빼낸 후 컨테이너를 중지합니다. 약 30분 후에 Deployments(배포) 또는 Tasks(작업) 목록을 새로 고치면 작업 수가 0으로 바뀐 것을 확인할 수 있습니다. 서비스는 아작 활성 상태이므로, 어떤 이유로든 롤백해야 할 경우, 서비스를 업데이트하여 작업을 추가로 배포하면 됩니다.

    • api 서비스를 선택한 후 Delete(삭제)를 선택하고 삭제를 확인합니다.


    이제 node.js가 모놀리스에서 마이크로서비스로 가동 중단 없이 완전하게 전환되었습니다!

  • 6단계. 배포 확인

    서비스 URL 찾기: 이 자습서의 모듈 2에서 사용한 것과 동일한 URL입니다.

    • EC2 콘솔의 Load Balancers(로드 밸런서) 섹션으로 이동합니다.
    • demo-microservices 로드 밸런서를 선택합니다.
    • DNS 이름 값을 복사하여 브라우저에 붙여 넣습니다.
    • 'Ready to receive requests(요청 수신 준비됨)'이라는 메시지가 나타납니다.

     

    각 마이크로서비스의 값 확인: ALB는 요청 URL을 기준으로 트래픽을 라우팅합니다. 각 서비스를 보려면 다음과 같이 DNS 이름의 끝에 서비스 이름을 추가하면 됩니다.

    • http://[DNS 이름]/api/users
    • http://[DNS 이름]/api/threads
    • http://[DNS 이름]/api/posts
    각 마이크로서비스의 값 확인

    ⚐ 참고: 이들 URL은 모놀리스를 배포할 때와 동일한 작업을 수행합니다. 이 앱에 연결할 것으로 예상되는 모든 API 또는 소비자가 변경 사항의 영향을 받지 않는다는 점에서 이는 매우 중요합니다. 모놀리스에서 마이크로서비스로 전환할 때 인프라의 다른 부분은 변경할 필요가 없습니다.

    또한 Postman과 같은 도구를 사용하여 API를 테스트할 수도 있습니다.