이 모듈에서는 Amazon Elastic Container Service(ECS)를 사용하여 EC2 컴퓨팅 인스턴스의 관리형 클러스터를 인스턴스화하고 클러스터에서 실행되는 컨테이너로서 이미지를 배포합니다. 구축 시작

아키텍처 개요

a. 클라이언트
클라이언트는 포트 80을 통해 로드 밸런서로 요청을 전송합니다.

b. 로드 밸런서
로드 밸런서는 사용 가능한 모든 포트에 걸쳐 요청을 분배합니다.

c. 대상 그룹
인스턴스는 애플리케이션의 대상 그룹에 등록되어 있습니다.

d. 컨테이너 포트
각 컨테이너는 node.js 상위 클러스터를 이 네임스페이스 내의 포트 80에 바인딩하는 단일 애플리케이션 프로세스를 실행합니다.

e. 컨테이너화된 node.js 모놀리스
node.js 상위 클러스터는 모놀리스 애플리케이션 내에서 작업자들에게 트래픽을 분배하는 역할을 담당합니다. 이 아키텍처는 컨테이너화되어 있지만 각 컨테이너의 모든 기능이 나머지 컨테이너와 동일하므로 모놀리스 방식입니다.

Amazon Elastic Container Service(ECS)는 확장성과 성능이 뛰어나며 Docker 컨테이너를 지원하는 컨테이너 관리 서비스로서, 이 서비스를 사용하여 Amazon EC2 인스턴스의 관리형 클러스터에서 애플리케이션을 손쉽게 실행할 수 있습니다. 간단한 API 호출로 Docker 지원 애플리케이션을 시작 및 중단하고, 클러스터의 전체 상태를 쿼리하며, 보안 그룹, Elastic Load Balancing, EBS 볼륨, IAM 역할 등 여러 익숙한 기능에 액세스할 수 있습니다.

리소스 필요와 가용성 요구 사항에 따라 클러스터 전체에 컨테이너를 배치할 일정을 수립하는 데에도 Amazon ECS를 사용할 수 있습니다. 또는 비즈니스나 애플리케이션의 특정 요구 사항에 맞도록 자체 스케줄러나 타사 스케줄러를 통합할 수 있습니다.

Amazon Elastic Container Service에 대한 추가 비용은 없습니다. 애플리케이션을 저장하고 실행하기 위해 생성한 AWS 리소스(예: EC2 인스턴스 또는 EBS 볼륨)에 대해 지불하시면 됩니다.


아래의 단계별 지침에 따라 Amazon ECS를 사용하여 node.js를 배포하십시오. 섹션을 확장하려면 각 단계 번호를 클릭하십시오.

break-the-monolith
  • 1단계. AWS CloudFormation을 사용하여 ECS 클러스터 시작

    먼저, Application Load Balancer의 배후에 배포된 Amazon ECS 클러스터를 생성합니다.

    1. AWS CloudFormation 콘솔로 이동합니다.
    2. Create Stack(스택 생성)을 선택합니다.
    3. 'Upload a template to Amazon S3(Amazon S3로 템플릿 업로드)'를 선택하고 amazon-ecs-nodejs-microservice/2-containerized/infrastructure/ecs.yml의 GitHub 프로젝트에서 ecs.yml 파일을 선택합니다. Next(다음)를 선택합니다.
    4. 스택 이름은 BreakTheMonolith-Demo로 입력합니다. 다른 파라미터 값은 동일하게 둡니다.
      1. Desired Capacity = 2
      2. InstanceType = t2.micro
      3. MaxSize = 2
    5. Next(다음)를 선택합니다.
    6. 이 페이지의 옵션은 수정할 필요가 없습니다. [Next]를 선택합니다.
    7. 다음 페이지의 맨 아래에 있는 확인란을 선택하고 Create(생성)를 선택합니다. 스택에 주황색으로 CREATE_IN_PROGRESS라고 표시된 것을 확인할 수 있습니다. 화면 오른쪽 상단에 있는 새로 고침 버튼을 선택하면 진행률을 확인할 수 있습니다. 이 프로세스의 소요 시간은 일반적으로 5분 미만입니다.
    스택 생성

    ⚐ 참고: 또한 AWS CLI를 사용하여 AWS CloudFormation 스택을 배포할 수도 있습니다. 리전을 이 코드에 추가하고 컴퓨터의 amazon-ecs-nodejs-microservices/3-microservices 폴더에서 터미널을 실행하기만 하면 됩니다.

    $ aws cloudformation deploy \
       --template-file infrastructure/ecs.yml \
       --region <region> \
       --stack-name Nodejs-Microservices \
       --capabilities CAPABILITY_NAMED_IAM
  • 2단계. 클러스터가 실행 중인지 점검

    클러스터 점검
    • 클릭하여 클러스터로 이동한 후 'Tasks(작업)' 탭을 선택하면 실행 중인 작업이 없습니다.
    작업
    • 'ECS Instances(ECS 인스턴스)' 탭을 선택하면 AWS CloudFormation 템플릿을 통해 생성된 2개의 EC2 인스턴스가 있습니다.
    ECS 인스턴스
  • 3단계. 작업 정의 작성

    작업 정의는 클러스터 전체에 걸쳐 애플리케이션 컨테이너를 어떻게 배포할지를 Amazon ECS에 지시합니다.

    • Amazon ECS 콘솔의 왼쪽에서 'Task Definitions(작업 정의)' 메뉴로 이동합니다.
    • Create new Task Definition(새 작업 정의 생성)을 선택합니다.
    • Task Definition Name = api.
    • Add Container(컨테이너 추가)를 선택합니다.
    • 다음 파라미터를 지정합니다.
      • 파라미터를 정의하지 않으려면 비워 두거나 다음과 같이 기본값으로 설정합니다. Container name = api image = [account-id].dkr.ecr.[region].amazonaws.com/api:v1(이전 단계에서 생성한 ECR 리포지토리 이미지의 URL).
      • :v1 태그가 모듈 1에서 이미지를 태깅하고 푸시하는 데 사용한 값과 일치하는지 확인합니다. Memory = Hard limit: 256 Port mappings = Host port:0, Container port:3000 CPU units = 256
    • Add(추가)를 선택합니다.
    • Create(생성)를 선택합니다.
    • 이제 작업 정의가 콘솔에 표시됩니다.
    작업 정의
  • 4단계. Application Load Balancer 구성: 대상 그룹

    Application Load Balancer(ALB)는 서비스가 들어오는 트래픽을 받을 수 있게 합니다. ALB는 클러스터에서 실행 중인 컨테이너 인스턴스를 대상 그룹으로 사용하여 트래픽을 컨테이너 인스턴스로 자동으로 라우팅합니다.

    VPC 이름 확인: AWS 계정을 이전에도 사용한 적이 있는 경우 VPC가 여러 개 있을 수 있습니다. 올바른 VPC로 대상 그룹을 구성하는 것이 중요합니다.

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

    ALB 대상 그룹 구성

    • EC2 콘솔의 Target Group(대상 그룹) 섹션으로 이동합니다.
    • Create target group(대상 그룹 생성)을 선택합니다.
    • 대상 그룹을 구성합니다(여기에서 지시하지 않는 경우 기본값을 수정하지 않음).
      • Name = api
      • Protocol = HTTP
      • Port = 80
      • VPC = 이전 단계의 로드 밸런서와 일치하는 VPC를 선택합니다. 이 VPC는 대개 기본 VPC가 아닙니다.
      • 고급 상태 확인 설정: Healthy threshold = 2 Unhealthy threshold = 2 Timeout = 5 Interval = 6
    • Create(생성)를 선택합니다.
    대상 그룹 생성
  • 5단계. Application Load Balancer 구성: 리스너

    리스너는 ALB로 들어오는 연결 요청을 확인합니다.

    ALB에 리스너 추가

    • EC2 콘솔의 Load Balancer(로드 밸런서) 섹션으로 이동합니다.
    • demo라는 이름의 로드 밸런서가 이미 있습니다.
    • 확인란을 선택하여 로드 밸런서 세부 정보를 확인합니다.
    • Listeners(리스너) 탭을 선택합니다.
    • Create Listener(리스너 생성)를 선택합니다.
      • Protocol = HTTP
      • Port = 80
      • Default target group = api
    • Create(생성)를 클릭합니다.
    ALB에 리스너 추가
  • 6단계. 서비스로 모놀리스 배포

    이제 모놀리스를 클러스터에 서비스로 배포할 수 있습니다.

    • Amazon ECS 콘솔의 왼쪽에서 'Clusters(클러스터)' 메뉴로 이동합니다.
    • 클러스터(BreakTheMonolith-Demo-ECSCluster)를 선택합니다.
    • Services(서비스) 탭에서 Create(생성)를 선택합니다.
    • 서비스를 구성합니다(기본값을 수정하지 않음). Service name = 작업의 API 번호 = 1
    • Configure ELB(ELB 구성)를 선택합니다.
      • ELB Type = Application Load Balancer.
      • IAM 역할의 경우 BreakTheMonolith-Demo-ECSServiceRole을 선택합니다.
      • Load Balancer ELB name = demo.
      • Add to ELB(ELB에 추가)를 선택합니다.
    • 대상 그룹에 서비스를 추가합니다.
      • Listener port = 80:HTTP
      • Target group name = 다음 그룹 선택: api.
    • Save(저장)를 선택합니다.
    서비스 배포
    • Create Service(서비스 생성)를 선택합니다.
    • View Service(서비스 보기)를 선택합니다.
    구성 옵션

    잘했습니다! 이제 서비스가 실행됩니다. 컨테이너가 정상 상태로 등록되고 트래픽을 수신하기 시작하는 데 1분 정도 걸릴 수 있습니다.

  • 7단계. 모놀리스 테스트

    인터넷에서 서비스를 사용할 수 있는지 확인하고 Ping 테스트를 실행하여 배포를 검증합니다.

    서비스 URL 찾기:

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


    서비스의 각 부분 보기:
    node.js 애플리케이션은 URL을 기준으로 각 작업자에게 트래픽을 라우팅합니다. 작업자를 보려면 다음과 같이 작업자 이름 api/[worker-name]을 DNS 이름의 끝에 추가합니다.

    • http://[DNS 이름]/api/users
    • http://[DNS 이름]/api/threads
    • http://[DNS 이름]/api/posts

    다음과 같이 URL의 끝에 레코드 번호를 추가하여 특정 레코드로 드릴다운할 수도 있습니다. http://[DNS name]/api/posts/1 또는 http://[DNS name]/api/users/2

    사용자 데모