본문 바로가기

Ryu's Tech

AWS Cloudformation-클라우드 포메이션의 사용목적과 장단점

개요

사실 이 글을 쓰면서 의미가 있을까? 라는 의문이 들기도 하다.

이미 aws를 접해 본 사람들은 알겠지만 설명서/자습서/예제 등 너무나도 잘 정리가  되어있고 계속 업데이트 되고 있다.

사실 해당 내용만 잘 읽고 따라해도 금방 이해가 될 것 같지만 내용이 꽤 방대해 직접 사용하면서 이해하는 것과는 다소 거리가 있고, 실제 사용하면서 느끼는 점이나 팁을 공유해 줄 수 있을것 같아 글을 쓴다.

다소 주관적인 해석이나 잘못된 부분이 있을 수 있고, 글을 쓴 시점에서 당장 내일 업데이트가 되어 내용이 맞지 않을 수 있다.

목적

클라우드 포메이션은 "자원 배포"가 목적이고 배포 도구 이다. 하지만 이는 두 가지로 활용될 수 있는데, 

 - 일반적인 클라우드 포메이션을 통한 자원 배포

 - 다수 리소스 배포를 위한 클라우드 포메이션 사용

예를 들어 설명하면 클라우드 포메이션을 활용해 VPC,Subnet,EC2 등을 배포하는 방법도 있을 것이고, 오토 스케일 기능을 위해 추가 되는 자원을 클라우드 포메이션 템플릿으로 배포하는 방법도 있다.

뭐 결국 같은 말 같기도 하다.

장점

인프라 배포 기록

클라우드 포메이션은 사실상 알고있는 한도에서는 aws의 거의 모든 자원을 배포가 가능하다.

그리고 배포하는 자원에 대해 시간이 지나 기억을 더듬거나 메모로 남겨진 것이 아닌 템플릿,파라매터와 같은 기록이 그대로 남기 때문에 인프라 배포 기록 관리에 좋다.

깔끔함

AWS는 마우스 클릭만으로 배포하는 것도 몇몇 제한이 있기도 하지만 충분히 가능하고 오히려 절차나 사용방법이 더 쉽기도 하다.

하지만 EC2를 사용할때를 예를들어봐도, 손으로 생성/삭제를 하다보면 자동으로 생성됐던 Security Group나 Elastic IP와 같은 인프라 잔여물 들이 계속 쌓이게 된다.

이러한 배포를 클라우드 포메이션 템플릿을 사용하게 되면 생성한 자원은 삭제할때 확실하게 정리가 된다.

AWS의 이해

위에서 얘기한 자원 배포를 마우스 클릭으로 해도 충분하지만 aws가 자동으로 해 주는 것이 많아 자세한 부분까지 알기는 어렵지만 클라우드 포메이션을 사용하면 이해하지 않으면 사용하기가 어렵다. 장점이자 단점.

특히 AWS를 사용할때 모르고 쓰면 모르고 쓰는 것이겠지만 잘 쓰기 위해서는 가장 먼저 필요한 것이 AWS VPC,Subnet,AZ,Internet Gateway, NAT Gateway 등 AWS의 가장 기본이 되는 인프라를 이해해야 하는데, 이러한 자원을 배포하는데 클라우드 포메이션을 사용하면 강제로 이해가 되는 수준이다.

예: 퍼블릭 및 프라이빗 서브넷이 있는 VPC

좀 더 구체적인 예를 하나 들면 VPC 생성을 누르면 아래와 같은 화면이 나온다.

정말 기본적으로 필요한 값들은 채우거나 선택해서 넣어주기만 하면 기본적으로 배포가 된다. 문제는 이렇게 배포하면 그 이후 기존의 인프라에서 확장이나 변경이 필요할때이다.

위 배포 템플릿을 사용하면 다중 AZ(가까운 다른지역의 실제 AWS 물리인프라에 나눠서 배포) 형태로 구성을해야 다른 서비스의 장애복구 옵션을 사용할 수 있는데, 이런 구성을 이해하지 않으면 다중AZ 형태의 인프라 배포는 쉽지 않을 수 있다.

처음 규모가 작을 때 이러한 템플릿을 사용하고 나중에 이러한 복구가능한 인프라 배포를 위해 다시 공부한다고 해도 연관관계를 모르면 서비스가 올라가 있는 인프라는 변경이 정말 힘들고, 사전에 향후 확장을 고려하지 않은 인프라라면 적용이 어렵고 다른 형태로 접근이 필요할 수 있다.

하지만 클라우드 포메이션을 사용해 위 인프라를 배포한다고 치면, 생성되는 절차와 요구조건, 추가로 사용될 옵션 등 다양한 것들을 강제로 볼 수 있게 된다....보다 볼 수 밖에 없다.

AWS 이해의 예: Subnet의 클라우드 포메이션 템플릿

친절한 AWS에서는 이러한 템플릿의 내용을 모두 나열하고 예도 들어주고 있다.

AWS::EC2::Subnet

Type: AWS::EC2::Subnet
Properties:
AssignIpv6AddressOnCreation: Boolean
AvailabilityZone: String
CidrBlock: String
Ipv6CidrBlock: String
MapPublicIpOnLaunch: Boolean
Tags:
- Resource Tag
VpcId: String

AWS에서 사용되는 설명의 단어와 같은 것들을 모른다면 어렵기도 하지만 모르는 것을 찾아보고 보다보면 다른 리소스를 찾아봐도 이해가 점점 빠르고 쉬워진다.

위에서 사용된 AssignIpv6AddressOnCreation의 설명을 한번 보면

AssignIpv6AddressOnCreation

이 서브넷에서 생성된 네트워크 인터페이스에서 IPv6 주소를 수신하는지 여부를 나타냅니다. 기본 값은 false입니다.

필수 항목 여부: 조건부. AssignIpv6AddressOnCreation에 대한 true 또는 false 값을 지정하면 Ipv6CidrBlock도 지정해야 합니다.

유형: 부울

업데이트 필요 조건무중단

참고

AssignIpv6AddressOnCreation이 지정된 경우 MapPublicIpOnLaunch는 지정할 수 없습니다.

이런 식으로 친절하지 않고 딱딱한 설명이긴 하지만 관련 내용들을 하나씩 찾아보면 어느정도 짐작이 가능하다. 하지만 aws는 생각보다 짐작대로 흘러가지 않는다.

강제로 이해시키는 AWS

아직 해보지 않은 aws에서의 IPv6를 설명하려고 보니 또 강제로 공부하게 되어 여기에 쓰다 보니 글이 너무 길어져 기본적인 내용과 필요한 내용을 정리하게 됐다.

2018/09/07 - [Ryu's Tech] - AWS의 VPC, 퍼블릭 서브넷, 프라이빗 서브넷 그리고 인터넷 연결 방식

AssignIpv6AddressOnCreation를 설명하려고 하니 해당 글에는 너무 범위를 넘어서는 것 같고, 이 글에 쓰자니 글이 또 너무 길어져 패스한다.

더 장점을 쓰고 싶지만 위의 글을 쓰고 지쳤다.

재사용

파라매터 값을 활용해서 템플릿을 만들어놓으면 동일한 자원 구조의 배포에 재사용이 가능하다. 

손으로 하나라도 설정해서 배포하게 되면 실수가 생기기 마련인데, 클라우드 포메이션을 통해 같은 자원을 이름만 다르게 배포하면 실수가 매우 줄어든다.

(이 내용은 차후 nested stack 형태의 배포에서 설명하게 될 것 같다.)

자원 업데이트

aws 리소스를 업데이트를 하고 싶을 때 템플릿을 통해 업데이트를 진행하면 기존 리소스가 제거되고 생성되는지, 생성된 채로 무중단으로 업데이트 되는지를 확인 할 수 있다. 

위의 클라우드 포메이션 관련 문서를 보면 "업데이트 필요 조건"을 확인하면 되고, 클라우드 포메이션 스택 업데이트를 하려하면 진행되기 전에 무중단, 중단, 대체 형태로 업데이트 시 발생하는 동작을 알려준다.

자원 전달

aws 자원 배포에 대해 누군가에게 알려주거나 전달할 때 웹으로 단계적으로 설명하거나 하는 것보다 클라우드 포메이션을 서로 안다면 이해가 편하고 전달이 쉽다.

단점

너무 많은 설정

사실상 배포할 수 있는 거의 모든 옵션을 포함하는 만큼, 봐야할 내용이 너무나도 많다. 

그나마 좀 더 쉬운 방법은 웹에서 설정하는 값들을 클라우드 포메이션과 비교해보고 문서에서 필수(Required) 값 위주로 작성하면 그나마 좀 쉬워진다.

옵션을 하나하나 공부하기에는 정말 많은 시간이 필요하다.

문법

json, yaml의 문법에 익숙해져야 하는 부분도 있고, 다른 자원에 대해 Getatt, Ref, Sub등 필요에 따라 다양한 방식으로 템플릿으로 생성한 값들을 참조해야 하거나 해야 하는데, yaml과 json의 장단점이 있고, 이러한 문법을 맞추는게 쉽지 않다.

구성

구성을 짜는 것이 어디까지 클라우드 포메이션으로 배포를 해야 하는가를 정해야 하는데, 그 경계를 정하기가 쉽지가 않다. 

힘들게 짜놓고 나서 결국 그 템플릿은 필요가 없어지는 경우도 많다.

인프라의 변경 빈도 고려

개발-스테이징-프로덕션 형태의 구성일 때도 클라우드 포메이션은 좋게 활용될 수 있는데, 같은 형태의 인프라 세트를 쉽게 배포할 수 있다.

하지만 이러한 구분을 하지 않거나, 인프라가 크게 변하지 않거나, 자주 변하지 않는 형태라 템플릿을 재사용할 필요가 없다면 큰 의미가 없을 수 있다.

정리

정리하다보니 aws는 어떻게 쓰는지에 따라 크게 달라질 수 있을 수 있어 사실 aws에 대한 내용은 매우 주관적인 글이 될 수 있을 것 같다.

사실 클라우드 포메이션을 사용하기 전에 테라폼도 많이 고민해 봤지만 좀 더 편하거나 장점은 있을 것 같지만, 처음부터 테라폼으로 접근하는 것보다 aws에서 제공하는 방식에 먼저 익숙해 져야 나중에 테라폼을 사용할때 큰 의미가 있을 것 같았다.

그리고 실제로 클라우드 포메이션을 쓰면서도 처음이 좀 힘들었지만 aws에 대해 이해하는데 정말 많은 도움이 됐고, 편하다.

이전에는 aws의 설명서와 자습서 정도만 참고했었지만 설명이 어려운 부분도 많은데,

이럴때 클라우드 포메이션 정의 문서를 찾아보면 해당 자원 배포를 이해하는데 도움이 될 때도 많았다.