본문 바로가기

클라우드/Public Cloud(Naver, Amazon)

aws CloudFormation을 사용한 인프라 배포 자동화 (Arch-5)

일관되고 안정적인 방법으로 인프라를 배포하기는 어렵습니다. 문서화되지 않은 지름길을 취하지 않고 문서화된 절차를 따라야하기 때문이다. 또한 직원 수를 줄였을 때 시간 외에 인프라를 배포하기 어려울 수 있다. AWS CloudFormation은 자동화된 일정에서 자동으로 배포할 수 있는 템플릿으로 인프라를 정의하여 이를 변경한다.

이 실습에서는 CloudFormation으로 여러 인프라 계층을 배포하고, 일부 리소스를 유지하면서 스택을 업데이트하고, 스택을 삭제하는 방법을 보여준다. 또한 CloudFormation 템플릿을 기반으로 사전 포장된 '제품'을 제공하기 위해 Service Catalog를 사용하는 방법을 보여준다.

먼저 네트워킹 계층을 배포해야한다. 권장 사항은 layers에 인프라를 배포하는 것이다. 일반적인 계층은 다음과 같다. 네트워크(Amazon VPC), 데이터베이스, 애플리케이션 이렇게하면 Dev/Test/Production 간에 일반적인 네트워크 토폴로지를 배포하거나 여러 애플리케이션에 표준 데이터베이스를 배포하는 것과 같이 시스템 간에 템플릿을 다시 사용할 수 있다. Amazon VPC를 사용하여 Networking layer를 생성하는 AWS CloudFormation 템플릿을 배포한다. CloudFormation 템플릿이란 스크립트 파일이 템플릿이라 불린다. CloudFormation 템플릿으로 CloudFormation 스택을 생성하게 된다. 스택이란 리소스 모음이다. 하나의 단위로 관리할 수 있는 AWS 리소스 모음으로 생성, 업데이트 삭제 되며 스택의 모든 리소스는 CloudFormation 템플릿에 의해 정의된다. 예를 들어 스택에는 웹 애플리케이션을 실행하는 데 필요한 모든 리소스(ex: 웹 서버, 데이터베이스 및 네트워킹 규칙)가 포함될 수 있고 해당 웹 애플리케이션이 더 이상 필요하지 않은 경우 간단히 스택을 삭제하면 관련 리소스가 모두 삭제된다.

먼저 네트워크 템플릿을 바탕화면에 다운로드 받았다.

(원하는 경우 텍스트 편집기에서 템플릿을 열고 리소스가 정의된 방법을 확인 가능!)

서비스 메뉴에서 CloudFormation을 클릭한다.

Stacks에서 스택을 생성하겠다.

템플릿을 지정하기 위해 Upload a template file을 클릭한 후 choose file을 클릭해 바탕화면에 받아놓은 lab-network.yaml파일을 선택한 후 next!

스택을 생성하기 위해 스택이름을 lab-network로 설정하였다.

: Application, : inventory로 설정하여 태그를 구성하였다.

설정한 사항을 검토하고 스택을 생성한다.

상태가 Create_Complete으로 변해야 무사히 잘 생성된 것이다.

리소스 탭을 확인하여 보면 템플릿에서 생성된 리소스 목록이 나타난다. 인터넷 게이트웨이, Route, VPC 등 리소스를 확인할 수 있다.

Events 탭을 클릭하면 리소스 생성부터 리소스 생성 완료까지 실행되는 활동을 표시!

Outputs 탭을 클릭한다. CloudFormation 스택은 지정된 리소스 ID 및 리소스 링크와 같이 output information을 제공할 수 있다. PublicSubnet : 생성된 퍼블릭 서브넷 ID, VPC : 생성된 VPC ID 또한 출력 결과는 다른 스택에 사용할 값을 제공한다. 이는 Export name열에 표시된다. 이 경우 VPC 및 서브넷 ID는 이름 내보내기가 제공되므로 다른 스택이 VPC 및 서브넷에서 값을 검색하고 리소스를 빌드할 수 있다. 이러한 값은 다음 작업에 사용된다.

템플릿 탭을 보면 스택을 생성하는데 사용한 템플릿을 보여준다. 이 스택을 생성하는 도안 업로드한 템플릿을 보여준다. 자유롭게 템플릿을 검토하고, 생성한 리소스를 확인하고 내보낼 값을 정의한 끝의 Outputs 섹션에서 확인한다.

이제 network layer가 배포되었다. Amazon EC2 인스턴스와 보안 그룹을 포함하는 application layer를 배포하겠다. CloudFormation 템플릿은 기존 CloudFormation 스택의 Outputs에서 VPC 및 서브넷 IDimport한다. 그런 다음 이 정보를 사용하여 VPC의 보안 그룹과 서브넷의 EC2 인스턴스를 만든다.

Application layer 템플릿을 바탕화면에 받아놓았다.

탐색 창에서 스택을 클릭한 후 스택을 생성하겠다.

바탕화면에 있는 application 템플릿 파일을 업로드하겠다.

스택의 이름과 네트워크 스택의 이름을 입력한다. (기존에 만든 lab-network 이름 입력!)

키 값과 value값을 설정하고 next를 클릭한 후 설정사항 검토 후 스택을 생성한다.

생성된 스택의 상태가 CREATE_COMPLETE로 변할 때까지 대기한다.

애플리케이션이 준비되었다. Outputs 탭을 클릭한다.

URL이 하나 보인다. URL을 복사한 후 새 웹 브라우저 탭을 열고 URL에 접속하였다.

무사히 애플리케이션이 작동함을 확인할 수 있다.

애플리케이션이 어떻게 작동하나 확인하기 위해 Template를 확인하겠다.

CloudFormation 스택의 다른 CloudFormation 스택의 값을 참조할 수 있다. 아래는 lab-network템플릿을 참조하는 lab-application템플릿의 일부이다. 맨 아래 줄에 위치한 {NetworkStackName}-VPCID는 스택 생성할 때 입력한 lab-network를 의미한다. Lab-network vpcIDimport하겠다는 의미이다. VPC ID 값을 가져와 보안 그룹엘 정의하는 VPC ID필드에 값을 삽입한다. 결과적으로 첫 번째 스택이 생성한 VPC 내에 보안 그룹이 생성된다.

Amazon EC2 인스턴스를 올바른 서브넷에 배치하는 코드는 다음과 같다. 서브넷 IDlab-network 스택에서 가져오고 lab-application 스택에서 사용하여 첫 번째 스택에서 생성된 퍼블릭 서브넷으로 인스턴스를 시작한다. 이는 여러 CloudFormation 스택을 사용하여 multiple layers에 인프라를 배포하는 방법을 보여준다.

스택을 업데이트 해보겠다. CloudFormation은 배포된 스택을 업데이트할 수도 있다. 스택을 업데이트할 때 CloudFormation은 변경되는 리소스만 수정하거나 대체한다. 변경하지 않은 모든 리소스는 그대로 남는다. 이 작업에서 lab-application 스택을 업데이트하여 보안 그룹의 설정을 수정한다. CloudFormation은 업데이트로 수정하지 않고 다른 모든 리소스를 있는 그대로 유지한다. 먼저 보안 그룹의 현재 설정을 검토한다.

서비스 메뉴에서 EC2메뉴를 클릭한다.

탐색 창에서 Security Groups를 클릭한 후 웹 서버 보안 그룹을 선택한다.

인바운드 탭을 클릭한다. HTTP트래픽을 허용하는 규칙 하나만 존재함을 확인할 수 있다.

Application2.yaml 템플릿을 바탕화면에 다운로드 했다.

다시 CloudFormation으로 돌아가 Lab-application을 선택한 후 Update항목을 클릭한다.

현재의 스택을 업데이트하기 위해 Replace를 선택한다.

템플릿 파일 업로드를 클릭한 후 새로 받은 yaml파일을 선택한다.

Next 세번 클릭 후 검토페이지로 이동한다. 변경사항을 미리 확인할 수 있다. (보안 그룹)

스택정보 화면이 UPDATE_COMPLETE로 변하면 업데이트가 완료된 것이다.

EC2 콘솔로 들어가 Web Server Security group을 선택한다.

인바운드 탭에 SSH트래픽에 대한 추가 규칙이 표시됨을 확인할 수 있다. 이는 변경 사항을 문서화된 반복적인 절차에 따라 배포하는 방법을 보여준다. CloudFormation 템플릿은 소스 코드 리포지토리에 저장하여 배포된 템플릿 및 인프라의 내역을 유지 관리할 수 있다.

Application1.yamlapplication2.yaml의 차이를 보기 위해 각각의 스택에서 템플릿을 살펴보았다. 보안 그룹이 바뀌었는데 보안 그룹의 부분만 확인하여 보았다. Application1의 부분에는 80포트에 대한 정보만 application2의 부분에는 22번 포트에 대한 정보가 템플릿에서 생겨남으로써 스택이 무사히 업데이트가 되었음을 확인할 수 있다.

Lab-application(application2) lab-network의 스택을 통해서 무사히 인스턴스를 생성!

무사히 인스턴스가 작동하나 확인하기 위해 80번포트와 22번포트가 보안그룹에 열려있으므로 웹 페이지 접속과 SSH접속을 확인하겠다. Web Server의 인스턴스의 페이지 하단에 공인ip로 접속해본 결과 페이지가 무사히 작동한다.

SSH접속도 해보겠다. Xshell6을 사용하였다. 이름을 application2.yaml으로 하였고 호스트에는 공인 ip를 입력한 후 연결한 후 사용자이름과 키페어를 입력하면 무사히 접속이 된다. 사용자이름은 ec2-user로 해야한다. (과정 생략)

AWSCloudFormation DesignerAWS CloudFormation 템플릿을 작성, 확인, 수정하기 위한 그래픽 도구이다. Designer를 사용하면 드래그 앤 드롭 인터페이스를 사용하여 템플릿 리소스를 다이어그램을 표시한 후 통합된 JSON YAML 편집기를 사용하여 해당 세부정보를 편집할 수 있다. AWS CloudFormation을 처음 사용하든 경험이 풍부하든 상관없이 AWS CloudFormation를 사용하면 템플릿 리소스 간 상호관계를 신속하게 파악하고 템플릿을 쉽게 수정할 수 있다.

** 키페어를 사용하려면 기존 yaml파일에 인스턴스 생성 전에 parmeter 섹션에 keypair을 값을 설정한 후 스택을 생성해야 key pair을 사용할 수 있다. **

CloudFormation서비스로 돌아가 왼쪽 탐색 창에서 Designer를 클릭한다.

로컬 파일을 열기 위해 파일 메뉴를 사용하여 이전에 다운로드한 lab-application2.yaml 템플릿을 선택한다.

Designer가 템플릿의 그래픽 표현을 표시한다. DesignerCloudFormation 템플릿의 시각적 편집기이므로 일반적으로 아키텍처 다이어그램을 그리는 대신 템플릿에 정의된 리소스와 템플릿의 관계를 그린다. Designer의 기능을 실험해보겠다. 리소스 유형 창에서 맘에 드는 서비스를 클릭하여 아무거나 디자인 영역으로 드래그 하면 리소스가 템플릿에 자동으로 삽입된다.

삽입된 리소스를 저 동그란 색이있는 원을 드래그하여 리소스 간 관계를 만들 수 있다. 템플릿의 관계를 시각적으로 표현하고 연결할 수있다.

스택을 삭제하겠다. 리소스가 더 이상 필요하지 않으면 CloudFormation은 스택용 빌드 된 리소스를 삭제할 수 있다. 삭제 정책은 리소스가 삭제될 때 리소스를 보존하거나(경우에 따라) 백업할 수 잇는 리소스에 대해서도 지정할 수 있다. 이는 데이터베이스, 디스크  볼륨 또는 스택 삭제 후 필요할 수 있는 모든 리소스를 유지하는데 유용하다.

Lab-application 스택의 템플릿을 확인해보면 스택은 Amazon EBS 디스크 볼륨이 삭제되기 전에 스냅샷을 생성하도록 구성되어 있다. 마지막 줄에 있는 DeletePolicy는 삭제되기 전에 디스크 볼륨의 스냅샷을 생성하도록 CloudFormation에 지시한다.

이제 lab-application을 삭제하고 삭제 정책의 결과를 확인한다. CloudForamtion 콘솔로 돌아가 lab-application을 클릭한 후 delete 버튼을 클릭한다.

스택을 삭제하고 스택이 삭제될 때까지 기다린다. (새로 고침으로 확인!)

스택이 무사히 삭제되었다.

EC2 서비스로 돌아간다.

왼쪽 탐색 창에서 Snapshots를 클릭한다. 삭제된 스택의 snapshotWeb Data라는 이름으로 이용 가능하게 생성되었음을 확인할 수 있다.