ECS 컨테이너 인스턴스 ( Docker 호스트 에 대해 이야기하고 있습니다. 여기서는 AWS 용어가 마음에 들지 않습니다)와 배포를 두 가지로 유지하겠습니다.
ECS 스택을 가동하십시오. CloudFormation 및 Auto-Scaling 그룹을 통해이를 관리 할 수 있습니다. 그냥 배포하는 플랫폼으로 클러스터의 생각 에 , 당신이 필요하지 뭔가 재배포 .
그런 다음 CD의 경우 가장 쉬운 방법은 서비스 정의를 업데이트하여 새 작업 정의를 사용하고 ECS 롤링이 컨테이너를 업데이트하도록하는 것입니다.
작업을 시작할 때마다 ECS는 로컬에 이미지가있는 경우에도 docker pull image : tag를 실행하여 해당 이미지의 최신 버전이 있는지 확인합니다. 따라서 사용하는 이미지 태그는 중요하지 않습니다 (모든 빌드에서 태그를 변경할 필요는 없습니다).
즉, 쉽게 배포하기 위해 myimage : latest를 반복해서 구축 할 수 있습니다.
필요한 것은 이미지 = myimage : latest 인 작업 정의입니다. 해당 작업 정의를 사용하여 서비스를 생성하고 ECS가 작업 (서비스 인스턴스)을 시작할 때마다 가장 최근에 구축 한 "myimage : latest"가됩니다.
거기에서 CodeDeploy에서 퍼즐에 하나의 조각 만 누락되어 람다 함수를 호출하여 작업 정의의 새 개정을 작성하고 서비스를 업데이트하면 ECS가 해당 개정에 대한 새 작업을 자동으로 작성합니다. 이전 작업을 제거하십시오.
예를 들면 :
MyService라는 서비스를 만들었다 고 가정 해 봅시다. 작업 정의 MyTaskDefinition : 1 (개정 1)에 대해 2 개의 작업을 실행하도록 해당 서비스를 구성했습니다. 해당 작업 정의에는 이미지가 "myimage : latest"로 설정된 하나의 컨테이너 정의가 있습니다.
- 어제 ID (SHA) 365d8f7bf565를 가진 myimage : latest를 빌드했습니다.
- 컨테이너 인스턴스 ABC가 MyTaskDefinition - 1 -containerName-someLongId 라는 태스크를 실행 중입니다. 해당 컨테이너를 검사 할 때 "sha256 : 365d8f7bf565 .........."이미지가 실행되고 있습니다.
- 다른 컨테이너 인스턴스 DEF가 다른 작업을 실행 중입니다. 이름은 비슷하지만 (ID 만 다름) 동일한 이미지를 실행하고 있습니다.
- 리포지토리로 변경 사항을 푸시합니다.
- CodePipeline은 해당 변경 사항을 선택하고 이미지를 작성하여 ECR에 게시합니다.
- 새로운 Docker 이미지는 myimage : latest이지만 ID (SHA)는 f7ec5e54ac96입니다.
- 이제 Lambda 함수와 AWS NodeJS SDK를 사용하여 클러스터를 호출하려면 파이프 라인에 단계를 추가해야합니다.
- 새 작업 정의를 작성하십시오 (이전과 정확히 동일 함). MyTaskDefinition이됩니다 : 2
- MyTaskDefinition : 2를 사용하도록 MyService를 업데이트하십시오 (1 대신).
- ECS는 새로운 작업을 만들 것입니다. 컨테이너 이름은 MyTaskDefinition - 2 -containerName-someLongId입니다. 해당 컨테이너를 검사하면 "sha256 : f7ec5e54ac96 ......."이 실행되고 있음을 알 수 있습니다. 컨테이너 인스턴스 ABC에 대해 2 개의 작업이있을 수 있습니다. 서비스 구성에 따라 스프레이 될 수 있습니다.
- 얼마 후 ECS는 ABC 및 DEF에서 이전 작업 MyTaskDefinition-1-containerName-someLongId를 제거합니다.
참고 : 실제로 새 작업 정의를 만들 필요는 없습니다. 원하는 경우 대신 서비스 작업 목록을 검색하여 하나씩 수동으로 중지 할 수 있습니다. 새 작업을 중지하기 전에 ECS가 작업을 다시 시작할 때까지 기다려야합니다 (즉, 첫 번째 컨테이너를 중지하고 ECS가 교체 할 때까지 기다렸다가 두 번째 컨테이너를 중지합니다). ECS가 컨테이너를 다시 시작하면 앞에서 설명한대로 최신 myimage : latest built을 가져옵니다. 새 작업 정의를 작성하는 것이 쉽고 오류가 덜 발생한다고 생각합니다 (기다리고 확인하는 데 필요한 논리가 없으며 ECS는 새 작업 정의가있는 경우 롤링 업데이트를 처리합니다).