AWS CloudFormation으로 인프라 자동화 시작하기

Junghyo Cho
Pagecall Engineering
10 min readNov 27, 2018

이 글은 CloudFormatin을 처음으로 시작하는 사용자를 위한 안내서이다. 이미 CloudFormation을 능숙하게 사용하고 있다면 사용 방법에 대한 설명은 대충 보고, 실무에서 어떻게 사용하는지에 대해서 주의깊게 읽어보면 좋을 것이다.

CloudFormation이란

CloudFormation은 Amazon Web Services(AWS) 리소스를 자동으로 생성해 주는 서비스이다. 사용하려는 AWS 리소스를 템플릿 파일로 작성하면, CloudFormation이 이를 분석해서 AWS 리소스를 생성한다. 이렇게 생성된 리소스를 스택이라고 한다.

어떻게 작동할까

CloudFormation 아래 그림과 같이 작동한다. 템플릿 작성, 템플릿 업로드, 스택 생성, 스택 설정 및 리소스 생성의 4단계이다.

CloudFormation 작동 방식(출처 : AWS CloudFormation 사용 설명서)

템플릿은 어떻게 만들까

템플릿은 JSON이나 YAML 형식으로 만들 수 있다. JSON에 익숙하다면 자주 사용하는 텍스트 편집기로 JSON형식의 템플릿을 작성한다. 템플릿의 형식은 CloudFormation 디자이너에서 JSON에서 YAML로 또는 그 반대로 자유롭게 변경할 수 있다. 디자이너는 템플릿에 선언된 리소스를 그래픽으로 표시하고 편집할 수 있는 기능도 제공한다.

  • Choose template language 에서 템플릿을 JSON 또는 YAML 형식으로 볼 수 있다.
  • template1의 Resources에 EC2Instance와 InstanceSecurityGroup이 선언되어 있고, 오른쪽 위의 그림에서 어떻게 연결되어 있는지 볼 수 있다.

CloudFormation은 어떤 특징이 있을까

  • 표준화된 템플릿 파일로 전체 인프라를 모델링한다. 별도로 인프라를 표준화하는 작업이 필요하지 않고 이미 정의된 CloudFormation 템플릿을 사용하기만 하면된다. 템플릿에 대한 자세한 설명도 AWS CloudFormation 사용 설명서에 나와 있다.
  • 인프라를 코드로 관리한다. 인프라를 코드로 관리하는 것을 Infrastructure as code라고 한다. 코드를 Git과 같은 버전 관리 시스템으로 관리하면 개발자가 소스코드를 관리하는 것과 비슷하게 인프라를 관리할 수 있다.
  • 인프라 관리가 편리하다. 템플릿에 리소스를 정의하기만 하면 리소스를 생성하고 리소스가 서로 연계되도록 구성한다. 리소스가 더 이상 필요하지 않으면 스택을 삭제하는 것만으로 전체 리소스를 삭제할 수 있다.
    인프라 구성을 재사용한다. 한번 구성한 인프라는 얼마든지 다시 구축할 수 있다. 한 리전에서 사용한 템플릿을 다른 리전에서 동일하게 사용한다. 같은 리전에서 재사용하려면 스택 이름을 다르게 설정한다.
  • 사용 요금이 없다. 생성된 리소스에 대한 요금만 지불하면 되고 CloudFormation 자체에는 별도로 요금이 부과되지 않는다.

비슷한 제품은 무엇이 있을까

Terraform

HashiCorp에서 오픈 소스로 개발하고 있는 인프라 관리 툴이다. CloudFormation과 마찬가지로 코드에 필요한 리소스를 선언하여 관리할 수 있게 한다. 하지만 사용할 수 있는 리소스가 AWS 에 국한되지 않는다.

Vagrant

역시 HashiCorp에서 개발하고 있는 개발 환경 관리 툴이다. 프로덕션용 인프라를 구축하기 보다는 개발 환경 구성에 특화되어 있다. 예를 들어, 공유폴더나 HTTP 터널링 같은 설정을 쉽게 할 수 있다.

누가 사용하면 좋을까

인프라 관리자

CloudFormation을 사용해 편리하게 인프라를 관리할 수 있다. 인프라 선언이 템플릿 파일에 있으므로 별도 문서를 작성할 필요가 없고 템플릿에 대한 간략한 설명만 있으면 된다. YAML을 사용한다면 템플릿 내에 설명을 추가할 수 있다. 단, JSON으로 변환할 때에는 주석이 제거되므로 AWS에서 추천하지는 않는다.

복잡한 인프라 아케텍처를 설계할 때 유용하다. 리소스를 하나씩 생성하고 삭제할 필요 없이 한꺼번에 생성하고 테스트할 수 있다. 변경이 있으면 CloudFormation이 이전 구성과 비교해 변경할 부분만 찾아준다. 더이상 리소스가 필요하지 않다면 스택을 삭제하는 것만으로 전체 리소스를 삭제한다.

서비스 확장에 유연하게 대응할 수 있다. 한 국가에서 서비스를 시작했는데 반응이 좋아 다른 국가로 서비스를 확대한다고 생각해보자. CloudFormation 으로 인프라를 구성했다면 다른 국가의 리전에 스택을 생성하는 것만으로 인프라 구성을 끝낼 수 있다.

개발자

개발자는 주로 로컬 환경에서 개발하고 테스트 한다. 프로덕션 환경에 배포하고 나면 로컬과는 다른 환경 문제로 고생하는 경우가 많다. CloudFormation 템플릿으로 구성된 인프라가 있다면 개발자도 쉽게 프로덕션 환경과 유사한 환경에서 개발하거나 테스트할 수 있다.

테스터

일반적으로 테스트 서버나 스테이지 서버를 별도로 유지하는 경우가 많다. CloudFormation을 사용하면 테스트 환경을 간편하게 생성하고 삭제할 수 있으므로, 서버를 별도로 유지할 필요가 없다. 프로덕션 환경에 대한 백업 정책이 잘 구성되어 있다면, 프로덕션 서버와 거의 실시간으로 동기화되는 스테이지 서버를 구성할 수 있다.

부하 테스트에 사용되는 인프라를 간단하게 구성한다. CloudFormation에 스팟 인스턴스 요청을 사용해 부하 테스트에 필요한 리소스를 쉽게 만든다. 테스트가 끝나면 스택을 삭제하는 것으로 리소스를 정리한다. 여러 리전에 걸쳐 테스트가 필요하다면 AWS CLI나 API를 이용해 CloudFormation 스택을 동시에 여러 개 생성할 수 있다.

실무에서는 어떤 순서로 작업할까

1. 인프라 설계

담당자가 인프라를 어떻게 구성할지 설계한다.

2. CloudFormation 템플릿 작성

설계된 인프라를 CloudFormation 템플릿으로 작성한다.

3. CloudFormation 스택 생성

AWS 콘솔이나 AWS CLI를 통해 템플릿으로 스택을 생성한다. AWS 리소스가 생성되고 서로 연계된다.

스택 생성이 완료되면 인프라 구축은 완료된다. 개발된 애플리케이션이 있다면 서비스를 시작한다.

4. CloudFormation 템플릿 수정

AWS 리소스를 추가하려면 기존 CloudFormation 템플릿에 추가한다.

5. Change sets 생성

AWS 콘솔이나 AWS CLI를 통해 수정된 템플릿으로 change sets를 생성한다. CloudFormation이 새롭게 추가, 변경 또는 교체되는 리소스를 보여준다. 아직 AWS 리소스가 변경되지는 않는다.

데이터베이스와 같은 중요한 리소스가 교체되지 않도록 주의한다. 교체가 필요하다면 데이터를 꼭 백업해 둔다.

6. Change sets 실행

Change sets를 실행하면 실제로 AWS 리소스가 변경된다.

간단한 예제를 실행해보려면

1. AWS 계정 생성

AWS 계정을 생성한다. AWS Free Tier에서 무료로 사용할 수 있는 리소스를 볼 수 있다.

2. 간단한 CloudFormation 템플릿을 찾는다.

서울 리전에서 실행할 수 있는 간단한 예제를 보려면 여기를 선택한다. 예제는 하나의 EC2 인스턴스와 Security Group으로 구성된다.

서울 리전이 아니거나 더 많은 예제를 보고 싶으면 샘플 템플릿을 참조한다.

3. 샘플 스택 생성

예제를 선택하면 CloudFormation 디자이너로 이동한다. 상단 메뉴에서 ‘Create stack’ 아이콘을 클릭한다.

각 단계에서 다음과 같이 필요한 정보를 입력해서 스택을 생성한다.

  • Step 1. Specify template : 설정을 그대로 두고 Next를 선택한다.
  • Step 2. Specify stack details : Stack name과 KeyName을 입력하고 Next를 선택한다. 아직 생성된 키가 없다면 EC2 콘솔로 이동한 후, Key pairs 메뉴에서 키를 생성하고 다시 처음부터 시작한다.
  • Step 3. Configure stack options : 설정을 그대로 두고 Next를 선택한다.
  • Step 4. Review : 설정을 그대로 두고 Create stack을 선택한다.
    Stacks 의 상태가 CREATE_COMPLETE가 되면 스택 생성이 완료된다. 생성된 리소스는 스택 이름을 선택한 후 Resources 탭에서 확인할 수 있다.

실제 서비스할 수 있는 예제를 실행해보려면

1. AWS 계정 생성

AWS 계정을 생성한다. AWS Free Tier에서 무료로 사용할 수 있는 리소스를 볼 수 있다. 무료로 사용할 수 있는 리소스 이외의 리소스를 사용한다면 요금이 청구될 수 있다.

2. 실제 서비스를 구성하는 CloudFormation 템플릿을 찾는다.

서울 리전에서 실행할 수 있는 Chef를 사용하여 WordPress 배포 예제를 보려면 여기를 선택한다.

서울 리전이 아니거나 더 많은 예제는 샘플 템플릿에서 리전을 선택한 후 ‘샘플 솔루션’을 선택하면 볼 수 있다.

3. 서비스 스택 생성

예제를 선택하면 CloudFormation 디자이너로 이동한다. 상단 메뉴에서 ‘Create stack’ 아이콘을 클릭한다.

각 단계에서 다음과 같이 필요한 정보를 입력해서 스택을 생성한다.

  • Step 1. Specify template : 설정을 그대로 두고 Next를 선택한다.
  • Step 2. Specify stack details : Stack name, DBPassword, DBUser, KeyName을 입력하고 Next를 선택한다. 아직 생성된 키가 없다면 EC2 콘솔로 이동한 후, Key pairs 메뉴에서 키를 생성하고 다시 처음부터 시작한다.
  • Step 3. Configure stack options : 설정을 그대로 두고 Next를 선택한다.
  • Step 4. Review : 설정을 그대로 두고 Create stack을 선택한다.
    Stacks 의 상태가 CREATE_COMPLETE가 되면 스택 생성이 완료된다. 생성된 리소스는 스택 이름을 선택한 후 Resources 탭에서 확인할 수 있다.

CloudFormation 사용 사례 — TURN 서버 인프라 구축

PageCall API 서버 인프라를 구축하는데 CloudFormation을 사용할 수 있다. PageCall API 서버 인프라는 로드 밸런서, 대상 그룹, Auto Scaling 그룹으로 구성된다. 코드 배포는 CodeDeploy를 사용한다.

이 모든 것을 직접 생성하고 설정하려면 적어도 한 두 시간은 필요하다. CloudFormation을 사용한다면 템플릿을 업로드하고 스택 생성 버튼을 누르기만 하면 나머지 작업들은 모두 자동으로 처리된다. 잠시 다른 작업을 하다가 결과를 확인하기만 하면 된다.

아래 코드는 실제로 우리가 사용할 템플릿 코드이다. PageCall API 서버를 CloudFormation을 이용해 자동으로 생성한 후 코드의 맨 아래 Outputs에 접속 가능한 주소를 출력한다. 이 주소를 이용해 API 서버에 접속할 수 있다. 새로운 버전이 릴리즈되면 CodeDeploy를 이용해 자동으로 배포한다. 배포 방식은 이 글의 범위를 벗어나지만, 현재 우리는 Bitbucket pipeline을 사용해서 CodeDeploy를 호출하고 있다.

레퍼런스

--

--