MJay

AWS- 컨테이너 기반 마이크로 서비스를 위한 지속적 전달(PipeLine) 본문

Cloud Computing/Amazon AWS

AWS- 컨테이너 기반 마이크로 서비스를 위한 지속적 전달(PipeLine)

MJSon 2017. 4. 21. 18:49




요즘 시대에는 기동성이 제일 중요합니다. 기성의 세대를 붕괴시키는게 중요합니다 대표적으로  spotify , uber, airbnb 가 있습니다


모든 팀의 릴리스 단계는 대부분 이렇게 됩니다.

소스 - 변경사항을 소스 리포지토리에 체크인합니다. 이 변경사항에 대해 코드 피드백을 요구하는 팀이 많습니다.  다른 곳에서는 실시간 피드백을 위해 짝 프로그래밍을 사용합니다

빌드 -  애플리케이션의 소스 코드가 빌드 되고 코드 품질은 빌드 머신에서 테스트됩니다.




모놀리식일때는 서로 의존도가 높아서 품질이 많이 떨어졌습니다.
API  로 연동이 된다. 언제 개발 되고 수정됬는지 알 필요없었습니다
자유롭지 않았다고 볼수있습니다. 
이러한 문제를 깨달은 경영진은 마이크로 서비스 와 두 피자 팀을 만들었습니다
두 피자 팀이란 어는 팀도 피자 2판을 다 먹을 수 있는 인원보다 많아서는 안 된다는 뜻입니다. 왜냐면 팀이 커지면 의사소통 및 조정 비용이 점점 증가해 직우너들의 생산성이 떨어진다는 것을 알았기 떄문입니다.



모놀리스는 방식이 많은 개발자들이 공유된 릴리스 파이프라인을 통해 각자 변경사항을 푸쉬하다고 보니

여러 마찰이발생합니다.


능률이 엄청 떨어집니다.


그래서 이런 독립적인 전달 파이프라인을 쓰기로 했습니다.







CodeDelploy , CodeCommit 말고 CodePipeLine만 쓰면 됩니다. 


COdePipeLine 을 쓰면 통합하기 쉽습니다. 그리고 무료이고 다음부터는 추가 파이프라인에 대해 매월 1달러를 지불하게 됩니다.



소스- 변경 사항을 감지하게 위해 , GitHub 같은 소스 제공자들에 대한 풀을 지속적으로 실시합니다. 변경 사항이 감지되면 새로운 파이프라인 실행을 생성하고 새 파이프라인이 실행을 지갛ㅂ니다. 소스 작업은 소스 정보의 사본을 가져와 이를 고객이 소유한 SS 버킷에 배치합니다.  소스 작업이 완료되면 소스 단계가 성공했다고 표시되고 그 다음 단계인 빌드 단계로 넘어갑니다.

빌드 단계 - Jenkins 라는 한 가지 작업이 있습니다. Jenkins는 CustomAction으로 CodePipeLne에 통합되어 모든 사용자 정의 작업과 동일한 수명 주기를 갖습니다. 상호 작용을 통한 교신 빌드 작업이 오나료되면 빌드 단계가 성공해싿고 표시되고 그 다음 단계인 배포 단계로 넘어갑니다.

배포 단계는 AWS Elastic Beanstalk 배포 작업이라는 한 가지 작업만 있습니다. Beanstalk 작업은 고객의 S3 버킷에서 빌드 아티팩트를 가져와 가져와 이를 Elastic Beanstalk 웹 컨테이너로 배포합니다.
코드를 수정하면 빌드하고 배포한다. 젠킨스 안에 코드가 수정되면 




CloudFormation 템플릿이 프로비저닝 됩니다.

프로비저닝(provisioning)은 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말한다.

ECS 클러스터: ECS 인스턴스의 AutoScaling rㅡ룹을 포함해 마이크로 서비스에 대한 ECS 클러스터를 생성합니다. 



이를 위해 로드 밸런서 한 개를 사용하고 있습니다.  여러가지 기능이 있습니다.

ALB- Application Load Balancer

ECS 작업을 위해 동적 포트를 사용합니다.

이렇게 CloudFormation:Init를 통한 구성관리가 가능합니다.

애플리케이션 소스를 어디에서 찾아 어디에 설치할지 CloudFormation에 알려주기만 하면 CloudFormation이 그 방법을 알아냅니다.

user-data,를 통해 CloudFormation 스크립트를 가져와 트리거하여 CloudForamtion:Init에서 실행한 다음, cfn-signal을 실행하여 CLoudForamtion 서비스로 결과를 반환합니다.

CloudWatch 로그를 사용하여 AWS 콘솔에서 로그를 볼 수 있습니다.

이를 통해 디버깅 하기 편합니다.


매번 로그인 할 일 없이 도커를 관리할수있게 해주는  Docker  login 명령을 실행할 필요가 없습니다.



CodeCommit을 프라이빗 git 리포지토리로 사용하여 마이크로 서비스 각각에 대해 리포지토리를 생성합니다.
git 리포지토리를 위한 서버 또는 인프라를 프로비저닝할 필요가 없습니다.















아티팩트 - 결과물 만들어서 s3에 올린다 -> stage 단계로 넘어간다, 태스트 용으로 쓰이기 위해










Jenkins는 빌드전 그리고 빌드 후 계속 관리해준다.





pem 받아서 다시 ec2 instance도 켰습니다.




































































생겼다.























각각서비스에 대한 파이프라인이 생겼다.