ansible과 cloudformation을 이용한 배포 자동화
TRANSCRIPT
Ansible과 CloudFormation을 이용한 배포 자동화
VCNC 개발팀 이정행
AWS 한국 유저 그룹 (#awskrug)
2014.12.20
발표자 소개
• 이정행 (@eincs)
• VCNC에서 비트윈을 개발하고 있는 개발자
• 서버팀에서 잡다한 것을 개발 중
• http://eincs.com
비트윈
• 커플들을 위한 모바일 서비스
• 아이폰, 안드로이드 어플리케이션 제공
• 채팅, 기념일, 사진, 메모, 캘린더 기능 제공
• 전 세계에서 1000만+ 다운로드 (as of 2014.12)
• http://between.us
• http://engineering.vcnc.co.kr
비트윈 서버 구조
• Java로 작성되어 있음
• 데이터 저장소로 HBase를 사용함
• Haeinsa를 통해 HBase에 접근시 ACID 트랜잭션 이용
• Thrift 서비스를 Netty위에 올려서 서비스함
• 채팅의 경우, Thrift를 이용해 클라이언트와 통신함
• AWS Tokyo리전에서 운영되고 있음
EC2
EC2
EC2
EC2
EC2
EC2
EC2
EC2
EC2
Master Master Backup
EC2
채팅서버
API서버
SNS
SES
SQS
S3
CloudFront
CloudWatch
IAM
누구나 다 아는 AWS에 웹서비스를 구축하는 이야기
EC2
웹서비스를 띄우기 위해 EC2 인스턴스를 만들어보았습니다.
설정해야 하는 값들: InstanceType, AMI, AvailabilityZone,SecurityGruop, Volumes, KeyName Tags…
EC2
데이터를 저장하기 위해서 RDS를 이용하기로 하였습니다.
설정해야 하는 값들: DBName, DBSecurityGroup, Engine, EngineVersion, MultiAZ, MaintenanceWindow, AllocatedStorage, AllowMajorVersonUpgrade…
RDS
RDS
EC2
EC2
트래픽이 많아져서 EC2를 더 띄웠습니다. ELB를 통해 로드밸런싱을 합니다.
설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone, ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…
RDS
EC2
EC2
트래픽이 많아져서 EC2를 더 띄웠습니다. ELB를 통해 로드밸런싱을 합니다.
설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone, ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…
손토스케일링™(hand)
RDS
EC2
EC2
트래픽이 많아져서 EC2를 더 띄웠습니다. ELB를 통해 로드밸런싱을 합니다.
설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone, ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…
손토스케일링™ = 서버 개발자가 잠을 잘 수 없다.
RDS
EC2
EC2
트래픽에 따라 유연하게 대응하기 위해 AutoScalingGroup을 이용하기로 하였습니다.
설정해야 하는 값들: AvailabilityZone, Cooldown, Max/Min/DesiredCapacity, LoadBalancerName, ScalingPolicy…
RDS
EC2
EC2
어떤 매트릭에 대해 알람을 걸 것인지 결정하고알람을 하나하나 등록해야합니다.
혹시 있을 장애 상황에 빠르게 대응하기 위해 CloudWatch를 이용하여 알림을 받기로 하였습니다.
RDS
EC2
EC2
VPC에서만 사용 가능한 인스턴스 타입이 있을 수 있습니다.
VPC안에 배포하기로 결정했습니다.
RDS
EC2
EC2
VPC에서만 사용 가능한 인스턴스 타입이 있을 수 있습니다.
VPC안에 배포하기로 결정했습니다.
전부 새로 만들면서 VPC 관련 설정도 해줘야…
RDS
EC2
EC2
VPC에서만 사용 가능한 인스턴스 타입이 있을 수 있습니다.
VPC안에 배포하기로 결정했습니다.
함정 카드 발동: 생각보다 설정해야할 게 많다!
비트윈 서버
로그 수집 서버
비트윈 채팅 서버
이벤트박스 서버
공지사항 서버
더보기탭 서버
광고 배너 서버
광고 알림 서버스티커 스토어
모바일쿠폰샵
OAuth 서버
리딤 서버
Kharon 서버
비트윈 Worker
각종 프리젠터
……
운영하는 서버의 종류가 많아진다면?
비트윈 서버
로그 수집 서버
비트윈 채팅 서버
이벤트박스 서버
공지사항 서버
더보기탭 서버
광고 배너 서버
광고 알림 서버스티커 스토어
모바일쿠폰샵
OAuth 서버
리딤 서버
Kharon 서버
비트윈 Worker
각종 프리젠터
……
운영하는 서버의 종류가 많아진다면?
함정 카드 발동: 만들고 설정해야 할게 몇 개인지 세기도 어렵다
RDS
EC2
EC2
인스턴스의 타입을 새로 나온 타입으로 바꾸고 싶어요.
원래 m1.small(paravirtual)로 이용하고 있다가 t2.micro(hvm)을 쓰고 싶어요.
RDS
EC2
EC2
인스턴스의 타입을 새로 나온 타입으로 바꾸고 싶어요.
원래 m1.small(paravirtual)로 이용하고 있다가 t2.micro(hvm)을 쓰고 싶어요.
m1.small을 쓰고 있었는데 t2.micro로 바꾸고 싶다.
RDS
EC2
EC2
인스턴스의 타입을 새로 나온 타입으로 바꾸고 싶어요.
원래 m1.small(paravirtual)로 이용하고 있다가 t2.micro(hvm)을 쓰고 싶어요.
함정 카드 발동: paravitual AMI는 hvm인스턴스에서 쓸 수 없다!
함정 카드 리스트
• 생각보다 설정 할 것들이 많다.
• 비슷한 것들을 반복해서 만들어야 할때도 있다.
• 만들다가 실수로 설정을 빼먹는다면?
• 여러 사람에게 지식을 알려주기가 힘들다.
• AMI를 새로 만들어야할 때도 있다.
이것들로 해결 할 수 있다!
서버 구성 관리 소프트웨어AWS 구성 관리 서비스
CloudFormation
CloudFormation
• 인프라 형상 관리
• JSON을 이용해 AWS 인프라를 소스코드처럼 관리
• 각종 AWS 컴포넌트를 설정에 따라 자동으로 생성할 수 있음
• 인프라 설정을 명시적 지식으로 만들기
sticker-store.json aws console
EC2 RDS SQS S3
CloudWatchLaunch Config
입력
리소스 생성
sticker-store.json aws console
EC2 RDS SQS S3
CloudWatchLaunch Config
입력
리소스 생성사람이 관여하는 부분 적음 = 실수 방지
sticker-store.json
Launch Config
sticker-admin.json
Launch Config
notice-server.json
Launch Config
sticker-store stack
sticker-admin stack
notice-server stack
sticker-store.json
Launch Config
sticker-admin.json
Launch Config
notice-server.json
Launch Config
sticker-store stack
sticker-admin stack
notice-server stack
만들어진 리소스들은 스택이라는 단위로 관리된다.
sticker-store.json
Launch Config
sticker-admin.json
Launch Config
notice-server.json
Launch Config
sticker-store stack
sticker-admin stack
notice-server stack
스택을 수정하거나 삭제가 가능하다.
CloudFormation Console
CloudFormation 템플릿의 구조
sticker-store.json
템플릿으로 스택을 만들 때 입력받을 파라메터들을 정의 이 파라메터의 값들을 이용해 리소스들의 설정들을 조정할 수 있다.
스택을 만들때 생성할 AWS리소스들과 설정 값들을 정의 (AutoScalingGroup, ELB …)
스택을 만든 후 AWS콘솔 상에서 결과로 보여줄 값들을 정의
Parameters
Resources
CloudFormation Console
CloudFormation의 추가 기능
• Mapping을 이용하여 조건에 따라 다른 값 설정 가능
• Condition를 이용하여 조건에 따라 리소스의 생성 여부나 리소스의 설정값을 경우에 따라 다르게 할 수 있음
• 여러 연산자(Fn::Join, Fn::Equals…)를 이용하여 데이터를 조합하여 새로운 데이터를 만들어 낼 수 있음
• 뭔가 업데이트 되는 경우 Notification로 알려주는 기능
• StackPolicy를 이용해 특정 리소스의 변경을 막는 기능
스택을 업데이트 하는 경우
• 템플릿을 변경하거나 원래 있던 템플릿은 그대로 사용하면서 파라메터만 변경하는 식으로 업데이트가 가능
• 스택이 관리하던 리소스들의 상태가 업데이트되거나 지워졌다가 새로 만들어 질 수 있음
• 리소스가 중단없이 업데이트 될지, 지웠다가 새로 만들어질지는 변경되는 값에 따라 다르며 문서에 명시되어 있음
• AutoScalingGroup의 경우 UpdatePolicy를 지정하여 자동으로 롤링 업데이트를 시킬 수 있음
CloudFormation 노하우
• 처음에는 만들 수 있는 Stack 갯수가 20개로 제한되어 있지만 늘릴 수 있음
• 하나의 템플릿에 너무 많이 담으려고 할 필요가 없음(여러 Stack을 조합하여 전체 시스템을 구성하기)
• Output을 잘 정의하면 다른 스택을 만들때 들어가는 Parameter값을 쉽게 작성 할 수 있음
CloudFormation의 불편한 점
• JSON형태로 되어 있어서 주석을 쓸 수가 없음
• 비슷한 구성의 스택을 만드는 경우 반복되는 코드가 많아짐
• 최신 기능들을 제공하지 않는 경우가 있음
• 기존에 만들었던 인프라를 CloudFormation으로 관리하려면 전부 다시 만들어야함
참고할만한 링크
• AWS CloudFormation Templatehttp://aws.amazon.com/ko/cloudformation/aws-cloudformation-templates/
• CloudFormation Template Snippetshttp://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/CHAP_TemplateQuickRef.html
• CloudFormation Template Referencehttp://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html
정리하기
• CloudFormation은 좋으며 시작하기도 어렵지 않음
• 인프라 구성을 소스코드 처럼 관리 가능함 (리뷰도 가능)
• 다른 사람에게 말로 구성에 대해 설명할 필요 없음
• 사람이 관여하는 부분이 적어 실수 방지 가능
• CloudFormation 꼭 쓰세요. 두 번 쓰세요.
Ansible
Ansible
• 서버 형상 관리
• yaml을 이용해 서버 설정을 소스코드 처럼 관리
• 설정을 이용해 서버 프로비저닝을 자동으로 할 수 있음
• 서버 설정을 명시적 지식으로 만들기
• Python으로 작성, Agent가 필요 없음
playbook.yml
Ansible 설정을 만들고 특정 서버에 대해 ansible-playbook을 실행시키면 서버 구성을 자동으로 할 수 있다
playbook.yml
제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
ChefDSL
(Ruby기반)필요 Ruby
Puppet DSL 필요 Ruby
유명한 서버 구성 소프트웨어와의 비교
제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
ChefDSL
(Ruby기반)필요 Ruby
Puppet DSL 필요 Ruby
비교적 간단한 형태의 yml을 이용해 정의를 하므로 쉽게 배울 수 있다.
제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
ChefDSL
(Ruby기반)필요 Ruby
Puppet DSL 필요 Ruby
Agent를 미리 프로비저닝 할 필요 없어서 편리하다.
제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
ChefDSL
(Ruby기반)필요 Ruby
Puppet DSL 필요 Ruby
개발 언어에 따라 배포하는 방식도 달라질 수 있다.
제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
ChefDSL
(Ruby기반)필요 Ruby
Puppet DSL 필요 Ruby
함정 카드 발동: 그 날 따라 gem이 엄청 느렸습니다…
개발 언어에 따라 배포하는 방식도 달라질 수 있다.
playbook.yml
SSH로 붙어 playbook에 설정된 값에 따라 Python 실행 파일을 만들어 서버에 업로드 한뒤 실행함
playbook.yml
SSH로 붙어 playbook에 설정된 값에 따라 Python 실행 파일을 만들어 서버에 업로드 한뒤 실행함
따로 Agent 설치과정 없이 EC2인스턴스 프로비저닝 가능
Ansible에 대한 지식 없이 서버 설정할 수 있게 할 수 있음
정리하기
• Ansible은 좋음
• 서버 구성을 소스코드 처럼 관리 가능함 (리뷰도 가능)
• Agent를 따로 설치할 필요가 없어 시작이 비교적 간단함
• 잘 활용하면 Ansible을 잘 몰라도 서버 구성을 할 수 있음
• Puppet, Chef에 대한 좋은 대안이 될 수 있음
Ansible과 CloudFormation을 이용해 AWS에 웹서비스를 구축하는 이야기
배포 서버
바스티온
Ansible Playboook들은 git으로 관리되며 배포 서버에 clone되어 있음
배포 서버
바스티온
EC2 (SNAPSHOT)
새로운 AMI를 만들기 위해 EC2인스턴스를 띄움
배포 서버
바스티온
EC2 (SNAPSHOT)
배포서버에서 Ansible을 실행시켜 EC2를 프로비저닝
배포 서버
바스티온
EC2 (SNAPSHOT)
프로비저닝된 EC2로 AMI 생성AMI
배포 서버
바스티온
EC2 (SNAPSHOT)
프로비저닝된 EC2로 AMI 생성AMI
배포 서버
바스티온
EC2 (SNAPSHOT)
미리 준비한 템플릿으로 CloudFormation 스택 생성
AMI
webservice.json
배포 서버
바스티온
EC2 (SNAPSHOT)
필요한 모든 구성이 알아서 만들어짐AMI
webservice.jsonLaunch Config
배포 서버
바스티온
EC2 (SNAPSHOT)
필요한 모든 구성이 알아서 만들어짐AMI
webservice.jsonLaunch Config
끝.
배포 서버
바스티온
EC2 (SNAPSHOT)
필요한 모든 구성이 알아서 만들어짐AMI
webservice.jsonLaunch Config
리소스 설정에 대해 사람이 관여하는 부분이 적음
함정 카드 리스트
• 생각보다 설정 할 것들이 많다.
• 비슷한 것들을 반복해서 만들어야 할때도 있다.
• 만들다가 실수로 설정을 빼먹는다면?
• 여러 사람에게 지식을 알려주기가 힘들다.
• AMI를 새로 만들어야할 때도 있다.
함정 카드 리스트
• 생각보다 설정 할 것들이 많다.
• 비슷한 것들을 반복해서 만들어야 할때도 있다.
• 만들다가 실수로 설정을 빼먹는다면?
• 여러 사람에게 지식을 알려주기가 힘들다.
• AMI를 새로 만들어야할 때도 있다.
모두 CloudFormation, Ansible로 해결 가능!
결론
• CloudFormation과 Ansible은 정말 좋습니다.
• 서버와 인프라 구성에 대한 지식을 명시적으로 만듭니다.
• 서버 및 인프라 프로비저닝할 때 실수를 줄여줍니다.
• 문서화가 잘되어 있어서 시작하기에도 어렵지 않습니다.
Thank You