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

75
Ansible과 CloudFormation을 이용한 배포 자동화 VCNC 개발팀 이정행 AWS 한국 유저 그룹 (#awskrug) 2014.12.20

Upload: aws-korea-ug

Post on 20-Jul-2015

1.030 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: Ansible과 CloudFormation을 이용한 배포 자동화

Ansible과 CloudFormation을 이용한 배포 자동화

VCNC 개발팀 이정행

AWS 한국 유저 그룹 (#awskrug)

2014.12.20

Page 2: Ansible과 CloudFormation을 이용한 배포 자동화

발표자 소개

• 이정행 (@eincs)

• VCNC에서 비트윈을 개발하고 있는 개발자

• 서버팀에서 잡다한 것을 개발 중

• http://eincs.com

Page 3: Ansible과 CloudFormation을 이용한 배포 자동화

비트윈

• 커플들을 위한 모바일 서비스

• 아이폰, 안드로이드 어플리케이션 제공

• 채팅, 기념일, 사진, 메모, 캘린더 기능 제공

• 전 세계에서 1000만+ 다운로드 (as of 2014.12)

• http://between.us

• http://engineering.vcnc.co.kr

Page 4: Ansible과 CloudFormation을 이용한 배포 자동화

비트윈 서버 구조

• Java로 작성되어 있음

• 데이터 저장소로 HBase를 사용함

• Haeinsa를 통해 HBase에 접근시 ACID 트랜잭션 이용

• Thrift 서비스를 Netty위에 올려서 서비스함

• 채팅의 경우, Thrift를 이용해 클라이언트와 통신함

• AWS Tokyo리전에서 운영되고 있음

Page 5: Ansible과 CloudFormation을 이용한 배포 자동화

EC2

EC2

EC2

EC2

EC2

EC2

EC2

EC2

EC2

Master Master Backup

EC2

채팅서버

API서버

SNS

SES

SQS

S3

CloudFront

CloudWatch

IAM

Page 6: Ansible과 CloudFormation을 이용한 배포 자동화

누구나 다 아는 AWS에 웹서비스를 구축하는 이야기

Page 7: Ansible과 CloudFormation을 이용한 배포 자동화

EC2

웹서비스를 띄우기 위해 EC2 인스턴스를 만들어보았습니다.

설정해야 하는 값들: InstanceType, AMI, AvailabilityZone,SecurityGruop, Volumes, KeyName Tags…

Page 8: Ansible과 CloudFormation을 이용한 배포 자동화

EC2

데이터를 저장하기 위해서 RDS를 이용하기로 하였습니다.

설정해야 하는 값들: DBName, DBSecurityGroup, Engine, EngineVersion, MultiAZ, MaintenanceWindow, AllocatedStorage, AllowMajorVersonUpgrade…

RDS

Page 9: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

트래픽이 많아져서 EC2를 더 띄웠습니다. ELB를 통해 로드밸런싱을 합니다.

설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone, ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…

Page 10: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

트래픽이 많아져서 EC2를 더 띄웠습니다. ELB를 통해 로드밸런싱을 합니다.

설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone, ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…

손토스케일링™(hand)

Page 11: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

트래픽이 많아져서 EC2를 더 띄웠습니다. ELB를 통해 로드밸런싱을 합니다.

설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone, ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…

손토스케일링™ = 서버 개발자가 잠을 잘 수 없다.

Page 12: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

트래픽에 따라 유연하게 대응하기 위해 AutoScalingGroup을 이용하기로 하였습니다.

설정해야 하는 값들: AvailabilityZone, Cooldown, Max/Min/DesiredCapacity, LoadBalancerName, ScalingPolicy…

Page 13: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

어떤 매트릭에 대해 알람을 걸 것인지 결정하고알람을 하나하나 등록해야합니다.

혹시 있을 장애 상황에 빠르게 대응하기 위해 CloudWatch를 이용하여 알림을 받기로 하였습니다.

Page 14: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

VPC에서만 사용 가능한 인스턴스 타입이 있을 수 있습니다.

VPC안에 배포하기로 결정했습니다.

Page 15: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

VPC에서만 사용 가능한 인스턴스 타입이 있을 수 있습니다.

VPC안에 배포하기로 결정했습니다.

전부 새로 만들면서 VPC 관련 설정도 해줘야…

Page 16: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

VPC에서만 사용 가능한 인스턴스 타입이 있을 수 있습니다.

VPC안에 배포하기로 결정했습니다.

함정 카드 발동: 생각보다 설정해야할 게 많다!

Page 17: Ansible과 CloudFormation을 이용한 배포 자동화

비트윈 서버

로그 수집 서버

비트윈 채팅 서버

이벤트박스 서버

공지사항 서버

더보기탭 서버

광고 배너 서버

광고 알림 서버스티커 스토어

모바일쿠폰샵

OAuth 서버

리딤 서버

Kharon 서버

비트윈 Worker

각종 프리젠터

……

운영하는 서버의 종류가 많아진다면?

Page 18: Ansible과 CloudFormation을 이용한 배포 자동화

비트윈 서버

로그 수집 서버

비트윈 채팅 서버

이벤트박스 서버

공지사항 서버

더보기탭 서버

광고 배너 서버

광고 알림 서버스티커 스토어

모바일쿠폰샵

OAuth 서버

리딤 서버

Kharon 서버

비트윈 Worker

각종 프리젠터

……

운영하는 서버의 종류가 많아진다면?

함정 카드 발동: 만들고 설정해야 할게 몇 개인지 세기도 어렵다

Page 19: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

인스턴스의 타입을 새로 나온 타입으로 바꾸고 싶어요.

원래 m1.small(paravirtual)로 이용하고 있다가 t2.micro(hvm)을 쓰고 싶어요.

Page 20: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

인스턴스의 타입을 새로 나온 타입으로 바꾸고 싶어요.

원래 m1.small(paravirtual)로 이용하고 있다가 t2.micro(hvm)을 쓰고 싶어요.

m1.small을 쓰고 있었는데 t2.micro로 바꾸고 싶다.

Page 21: Ansible과 CloudFormation을 이용한 배포 자동화

RDS

EC2

EC2

인스턴스의 타입을 새로 나온 타입으로 바꾸고 싶어요.

원래 m1.small(paravirtual)로 이용하고 있다가 t2.micro(hvm)을 쓰고 싶어요.

함정 카드 발동: paravitual AMI는 hvm인스턴스에서 쓸 수 없다!

Page 22: Ansible과 CloudFormation을 이용한 배포 자동화

함정 카드 리스트

• 생각보다 설정 할 것들이 많다.

• 비슷한 것들을 반복해서 만들어야 할때도 있다.

• 만들다가 실수로 설정을 빼먹는다면?

• 여러 사람에게 지식을 알려주기가 힘들다.

• AMI를 새로 만들어야할 때도 있다.

Page 23: Ansible과 CloudFormation을 이용한 배포 자동화

이것들로 해결 할 수 있다!

서버 구성 관리 소프트웨어AWS 구성 관리 서비스

Page 24: Ansible과 CloudFormation을 이용한 배포 자동화

CloudFormation

Page 25: Ansible과 CloudFormation을 이용한 배포 자동화

CloudFormation

• 인프라 형상 관리

• JSON을 이용해 AWS 인프라를 소스코드처럼 관리

• 각종 AWS 컴포넌트를 설정에 따라 자동으로 생성할 수 있음

• 인프라 설정을 명시적 지식으로 만들기

Page 26: Ansible과 CloudFormation을 이용한 배포 자동화

sticker-store.json aws console

EC2 RDS SQS S3

CloudWatchLaunch Config

입력

리소스 생성

Page 27: Ansible과 CloudFormation을 이용한 배포 자동화

sticker-store.json aws console

EC2 RDS SQS S3

CloudWatchLaunch Config

입력

리소스 생성사람이 관여하는 부분 적음 = 실수 방지

Page 28: Ansible과 CloudFormation을 이용한 배포 자동화

sticker-store.json

Launch Config

sticker-admin.json

Launch Config

notice-server.json

Launch Config

sticker-store stack

sticker-admin stack

notice-server stack

Page 29: Ansible과 CloudFormation을 이용한 배포 자동화

sticker-store.json

Launch Config

sticker-admin.json

Launch Config

notice-server.json

Launch Config

sticker-store stack

sticker-admin stack

notice-server stack

만들어진 리소스들은 스택이라는 단위로 관리된다.

Page 30: Ansible과 CloudFormation을 이용한 배포 자동화

sticker-store.json

Launch Config

sticker-admin.json

Launch Config

notice-server.json

Launch Config

sticker-store stack

sticker-admin stack

notice-server stack

스택을 수정하거나 삭제가 가능하다.

Page 31: Ansible과 CloudFormation을 이용한 배포 자동화

CloudFormation Console

Page 32: Ansible과 CloudFormation을 이용한 배포 자동화

CloudFormation 템플릿의 구조

sticker-store.json

Page 33: Ansible과 CloudFormation을 이용한 배포 자동화
Page 34: Ansible과 CloudFormation을 이용한 배포 자동화

템플릿으로 스택을 만들 때 입력받을 파라메터들을 정의 이 파라메터의 값들을 이용해 리소스들의 설정들을 조정할 수 있다.

Page 35: Ansible과 CloudFormation을 이용한 배포 자동화

스택을 만들때 생성할 AWS리소스들과 설정 값들을 정의 (AutoScalingGroup, ELB …)

Page 36: Ansible과 CloudFormation을 이용한 배포 자동화

스택을 만든 후 AWS콘솔 상에서 결과로 보여줄 값들을 정의

Page 37: Ansible과 CloudFormation을 이용한 배포 자동화

Parameters

Page 38: Ansible과 CloudFormation을 이용한 배포 자동화

Resources

Page 39: Ansible과 CloudFormation을 이용한 배포 자동화

CloudFormation Console

Page 40: Ansible과 CloudFormation을 이용한 배포 자동화

CloudFormation의 추가 기능

• Mapping을 이용하여 조건에 따라 다른 값 설정 가능

• Condition를 이용하여 조건에 따라 리소스의 생성 여부나 리소스의 설정값을 경우에 따라 다르게 할 수 있음

• 여러 연산자(Fn::Join, Fn::Equals…)를 이용하여 데이터를 조합하여 새로운 데이터를 만들어 낼 수 있음

• 뭔가 업데이트 되는 경우 Notification로 알려주는 기능

• StackPolicy를 이용해 특정 리소스의 변경을 막는 기능

Page 41: Ansible과 CloudFormation을 이용한 배포 자동화

스택을 업데이트 하는 경우

• 템플릿을 변경하거나 원래 있던 템플릿은 그대로 사용하면서 파라메터만 변경하는 식으로 업데이트가 가능

• 스택이 관리하던 리소스들의 상태가 업데이트되거나 지워졌다가 새로 만들어 질 수 있음

• 리소스가 중단없이 업데이트 될지, 지웠다가 새로 만들어질지는 변경되는 값에 따라 다르며 문서에 명시되어 있음

• AutoScalingGroup의 경우 UpdatePolicy를 지정하여 자동으로 롤링 업데이트를 시킬 수 있음

Page 42: Ansible과 CloudFormation을 이용한 배포 자동화

CloudFormation 노하우

• 처음에는 만들 수 있는 Stack 갯수가 20개로 제한되어 있지만 늘릴 수 있음

• 하나의 템플릿에 너무 많이 담으려고 할 필요가 없음(여러 Stack을 조합하여 전체 시스템을 구성하기)

• Output을 잘 정의하면 다른 스택을 만들때 들어가는 Parameter값을 쉽게 작성 할 수 있음

Page 43: Ansible과 CloudFormation을 이용한 배포 자동화

CloudFormation의 불편한 점

• JSON형태로 되어 있어서 주석을 쓸 수가 없음

• 비슷한 구성의 스택을 만드는 경우 반복되는 코드가 많아짐

• 최신 기능들을 제공하지 않는 경우가 있음

• 기존에 만들었던 인프라를 CloudFormation으로 관리하려면 전부 다시 만들어야함

Page 44: Ansible과 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

Page 45: Ansible과 CloudFormation을 이용한 배포 자동화

정리하기

• CloudFormation은 좋으며 시작하기도 어렵지 않음

• 인프라 구성을 소스코드 처럼 관리 가능함 (리뷰도 가능)

• 다른 사람에게 말로 구성에 대해 설명할 필요 없음

• 사람이 관여하는 부분이 적어 실수 방지 가능

• CloudFormation 꼭 쓰세요. 두 번 쓰세요.

Page 46: Ansible과 CloudFormation을 이용한 배포 자동화

Ansible

Page 47: Ansible과 CloudFormation을 이용한 배포 자동화

Ansible

• 서버 형상 관리

• yaml을 이용해 서버 설정을 소스코드 처럼 관리

• 설정을 이용해 서버 프로비저닝을 자동으로 할 수 있음

• 서버 설정을 명시적 지식으로 만들기

• Python으로 작성, Agent가 필요 없음

Page 48: Ansible과 CloudFormation을 이용한 배포 자동화

playbook.yml

Ansible 설정을 만들고 특정 서버에 대해 ansible-playbook을 실행시키면 서버 구성을 자동으로 할 수 있다

Page 49: Ansible과 CloudFormation을 이용한 배포 자동화

playbook.yml

Page 50: Ansible과 CloudFormation을 이용한 배포 자동화

제품 DSL Agent 개발언어

Ansible yml 없음 (SSH) Python

ChefDSL

(Ruby기반)필요 Ruby

Puppet DSL 필요 Ruby

유명한 서버 구성 소프트웨어와의 비교

Page 51: Ansible과 CloudFormation을 이용한 배포 자동화

제품 DSL Agent 개발언어

Ansible yml 없음 (SSH) Python

ChefDSL

(Ruby기반)필요 Ruby

Puppet DSL 필요 Ruby

비교적 간단한 형태의 yml을 이용해 정의를 하므로 쉽게 배울 수 있다.

Page 52: Ansible과 CloudFormation을 이용한 배포 자동화

제품 DSL Agent 개발언어

Ansible yml 없음 (SSH) Python

ChefDSL

(Ruby기반)필요 Ruby

Puppet DSL 필요 Ruby

Agent를 미리 프로비저닝 할 필요 없어서 편리하다.

Page 53: Ansible과 CloudFormation을 이용한 배포 자동화

제품 DSL Agent 개발언어

Ansible yml 없음 (SSH) Python

ChefDSL

(Ruby기반)필요 Ruby

Puppet DSL 필요 Ruby

개발 언어에 따라 배포하는 방식도 달라질 수 있다.

Page 54: Ansible과 CloudFormation을 이용한 배포 자동화

제품 DSL Agent 개발언어

Ansible yml 없음 (SSH) Python

ChefDSL

(Ruby기반)필요 Ruby

Puppet DSL 필요 Ruby

함정 카드 발동: 그 날 따라 gem이 엄청 느렸습니다…

개발 언어에 따라 배포하는 방식도 달라질 수 있다.

Page 55: Ansible과 CloudFormation을 이용한 배포 자동화

playbook.yml

SSH로 붙어 playbook에 설정된 값에 따라 Python 실행 파일을 만들어 서버에 업로드 한뒤 실행함

Page 56: Ansible과 CloudFormation을 이용한 배포 자동화

playbook.yml

SSH로 붙어 playbook에 설정된 값에 따라 Python 실행 파일을 만들어 서버에 업로드 한뒤 실행함

따로 Agent 설치과정 없이 EC2인스턴스 프로비저닝 가능

Page 57: Ansible과 CloudFormation을 이용한 배포 자동화
Page 58: Ansible과 CloudFormation을 이용한 배포 자동화

Ansible에 대한 지식 없이 서버 설정할 수 있게 할 수 있음

Page 59: Ansible과 CloudFormation을 이용한 배포 자동화

정리하기

• Ansible은 좋음

• 서버 구성을 소스코드 처럼 관리 가능함 (리뷰도 가능)

• Agent를 따로 설치할 필요가 없어 시작이 비교적 간단함

• 잘 활용하면 Ansible을 잘 몰라도 서버 구성을 할 수 있음

• Puppet, Chef에 대한 좋은 대안이 될 수 있음

Page 60: Ansible과 CloudFormation을 이용한 배포 자동화

Ansible과 CloudFormation을 이용해 AWS에 웹서비스를 구축하는 이야기

Page 61: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

Ansible Playboook들은 git으로 관리되며 배포 서버에 clone되어 있음

Page 62: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

EC2 (SNAPSHOT)

새로운 AMI를 만들기 위해 EC2인스턴스를 띄움

Page 63: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

EC2 (SNAPSHOT)

배포서버에서 Ansible을 실행시켜 EC2를 프로비저닝

Page 64: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

EC2 (SNAPSHOT)

프로비저닝된 EC2로 AMI 생성AMI

Page 65: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

EC2 (SNAPSHOT)

프로비저닝된 EC2로 AMI 생성AMI

Page 66: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

EC2 (SNAPSHOT)

미리 준비한 템플릿으로 CloudFormation 스택 생성

AMI

webservice.json

Page 67: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

EC2 (SNAPSHOT)

필요한 모든 구성이 알아서 만들어짐AMI

webservice.jsonLaunch Config

Page 68: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

EC2 (SNAPSHOT)

필요한 모든 구성이 알아서 만들어짐AMI

webservice.jsonLaunch Config

끝.

Page 69: Ansible과 CloudFormation을 이용한 배포 자동화

배포 서버

바스티온

EC2 (SNAPSHOT)

필요한 모든 구성이 알아서 만들어짐AMI

webservice.jsonLaunch Config

리소스 설정에 대해 사람이 관여하는 부분이 적음

Page 70: Ansible과 CloudFormation을 이용한 배포 자동화

함정 카드 리스트

• 생각보다 설정 할 것들이 많다.

• 비슷한 것들을 반복해서 만들어야 할때도 있다.

• 만들다가 실수로 설정을 빼먹는다면?

• 여러 사람에게 지식을 알려주기가 힘들다.

• AMI를 새로 만들어야할 때도 있다.

Page 71: Ansible과 CloudFormation을 이용한 배포 자동화

함정 카드 리스트

• 생각보다 설정 할 것들이 많다.

• 비슷한 것들을 반복해서 만들어야 할때도 있다.

• 만들다가 실수로 설정을 빼먹는다면?

• 여러 사람에게 지식을 알려주기가 힘들다.

• AMI를 새로 만들어야할 때도 있다.

모두 CloudFormation, Ansible로 해결 가능!

Page 72: Ansible과 CloudFormation을 이용한 배포 자동화

결론

Page 73: Ansible과 CloudFormation을 이용한 배포 자동화

• CloudFormation과 Ansible은 정말 좋습니다.

• 서버와 인프라 구성에 대한 지식을 명시적으로 만듭니다.

• 서버 및 인프라 프로비저닝할 때 실수를 줄여줍니다.

• 문서화가 잘되어 있어서 시작하기에도 어렵지 않습니다.

Page 74: Ansible과 CloudFormation을 이용한 배포 자동화
Page 75: Ansible과 CloudFormation을 이용한 배포 자동화

Thank You