ansible과 cloudformation을 이용한 배포 자동화

Post on 20-Jul-2015

1.030 Views

Category:

Technology

5 Downloads

Preview:

Click to see full reader

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

top related