Azure 테라폼 VS AWS 테라폼 비교 Virtual Network VS VPC

VNet
작성자
Roronoa
작성일
2022-09-21 20:50
조회
1136
Azure 테라폼 VS AWS 테라폼 비교  (Azure Terraform with Virtual Network VS AWS Terraform with VPC)

Azure의 가상네트워크 와 AWS의 Virtual Private Cloud(VPC)는 외부적으로는 완전히 같은 리소스들이지만 내부적으로는 Azure의 세계관과 AWS의 세계관이 완전히 다릅니다. 우선 두개의 가상네트워크를 통칭해서 가상네트워크라고 부르겠습니다. 이름 부터 “가상” 네트워크 이므로 기존의 온프레미스 스위치로 구성된 물리적 네트워크를 하드웨어 와 소프트웨어 네트워크를 결합해서 만든 리소스입니다. 

 

Azure와 AWS는 태생이 다르며 서로의 세계관이 다릅니다. 클라우드에서 AWS와 Azure는 표면적으로는 같은 서비스처럼 보이지만 내부적으로는 매우 다른 알고리즘으로 구성되어 있습니다. 클라우드에서 특징들과 기능은 끊임없이 변화하는 상태이며 오늘 다르고 내일 또 업데이트 되는 탄력적 진화 시스템입니다. 심지어 지금 이순간도 클라우드 기술이 변하고 있으며 그 단위가 일주일 이하도 있습니다. 세부적인 기능은 언제 바뀌었는지 조차도 어려울정도로 지속적으로 테스트하고 연구하지 않으면 점점 뒷쳐지며 심지어 엔지니어로서, 개발자로서 자신의 영역을 줄 여야만 하는 시대에 살고 있습니다.

 

Azure 와 AWS에서 가장 기본이 되며 가장 먼저 만들어야 하며 가장 마지막에 지워야 되는 리소스 이며 가장 변경하기 어려운 리소스는 가상네트워크 와 VPC 입니다. 그래서 이 두개의 차이를 테라폼 코드를 통해서 한번 알아보겠습니다.
azure
그림001

위에 그림001에서 두개의 각자의 폴더가 있습니다. 보통 한개의 폴더에서 terraform init을 하면 그 폴더 하위에 있는 모든 .tf 파일이 실행됩니다. 위에 그림001 은 두개의 폴더에 AWS 폴더(상단폴더) 와 Azure 폴더(하단폴더)가 있습니다. 두개의 파일이 있으며 main.tf 파일은 변수들과 리소스 생성 부분이 main.tf 파일로 구성되어 있고 Provider는 AWS 와 Azure 각각 공급자(Azure 또는 AWS)를 지정하는 부분이 있습니다. 그러므로 main.tf 만 보면 됩니다. 이 예제는 가장 이해 하기 쉽게 terraform 기본 예제를 Docs overview | hashicorp/azurerm | Terraform Registry 테라폼 공식 홈페이지에서 가져왔으며 최대한 AWS와 Azure를 비슷하게 비교하기 위해서 약간의 예제를 변형 했습니다.
azure
그림002

위에 그림002의 최상위 폴더는 Azurevaws001이라는 폴더가 있고 그 하위로 두개의 빨간색 AWS 폴더와 파란색 Azure 는 각각 폴더 마다 실행 해야 됩니다.
azure
그림003

위에 그림003에서 보면 왼쪽은 Azure 오른쪽은 AWS 입니다. 파란색 화살표는 Azure 버전이 3.0.0 이고 AWS 버전은 4.0 이상으로 표시되어 있습니다 AWS 가 버전이 조금더 많은 상황입니다. 첫번째 블록을 보면 terraform {} 에 각각 프로바이더 Azure 와 AWS의 버전을 나타내는 부분입니다

 

두번 째 블락은

 

기본 문법은 이렇습니다. 

<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
  # Block body
  <IDENTIFIER> = <EXPRESSION> # Argument
}

 variable은 변수를 지정하는 블락 타입 입니다. 그리고 azure_region은 이 블락 에 Lebel 즉 이름입니다.  description 과 type 은 Argument 와 값으로 구성되어 있습니다. 쉽게 생각하면 그냥 변수에 값을 넣는 것이라 생각하면 됩니다. default 는 아무 값이 없다면 기본값으로 West US2가 들어가는것 입니다. 

 

variable "azure_region" {

  description = "Region name"

  type        = string

  default     = "West US 2" 

}

 

왼쪽 Azure 코드와 오른쪽 AWS의 코드의 다른점은 데이터센터가 존재하는 위치가 다르고 이름이 다르다는 차이점이 있습니다. West US 2는 Azure 이며 us-west-2 는 AWS 입니다.
azure
그림004

그림004에서 보는 것처럼 West US 2는 Azure 이며 us-west-2 는 AWS 입니다. 두개가 같은 미국 서부2 이지만 데이터센터의 위치가 다르며 이름도 다릅니다. Azure의경우는 West US 2 는 워싱턴주에 위치하며 AWS 는 오레곤에 위치 합니다. 6시간 차이 나는 거리 이고 네트워크 선이 다르므로 유저의 위치에 따라 데이터센터의 레이턴시 또한 존재 합니다.
azure
그림005

이 variable 블락은 변수이고 가변적으로 선언하는 의미가 있으며 다양한 방법으로 재사용하기 위해 사용됩니다. Variable “azure_region” 은 밑에서 var.azure_region 으로 어디서든 재사용 가능합니다.
azure
그림006

variable “base_cidr_block” 은 Azure 와 AWS 코드가 완전 일치 합니다. 왜냐면 가상네트워크를 구성하는 필수 조건이 cider 주소값이기 때문에 이 변수는 생성에 꼭 필요합니다.
azure
그림007

위에 그림 007에서 Azure 는 subnet Name 이 있지만 AWS에는 subnet Name 블락이 없고 availability_zones이 있습니다. Azure에도 최근 availability_zones 이 생겼지만 AWS와 다른 방식으로 구성되어 있습니다. Azure 의 경우는 가상머신에 availability_zones 의 디펜던시를 가지며 AWS는 서브넷에 디펜던시를 가지는 구조입니다. 이는 매우 큰 차이 입니다. 이 디펜던시 때문에 내부 아키텍처 적으로 크게 차이 날수 있습니다. 그러나 큰 관점에서는 같은 기능이지만 방법이 다르다고 생각 하시면 됩니다. 왼쪽에 Azure의 Subnet 이름은 기본적으로 필수 조건입니다

그러나 AWS에서는 subnet 이름이 필수 조건이 아닙니다. AWS에서는 서브넷 이름이 없어도 서브넷을 생성할 수있습니다. 이는 AWS 와 Azure 의 매우 큰 차이 점이며 AWS는 Tag 중심으로 이름을 연동되게 되어 있으며 Azure 이름이 없이는 생성 되지 않습니다.
azure
그림008

aws_subnet | Resources | hashicorp/aws | Terraform Registry 그림008은 테라폼 공식 문서의 AWS 레지스터 문서 입니다. Cidr Block이 Optional 로 표시되어 있으며 모든 변수가 optional로 표시되어 있습니다.
azure
그림009

모든 변수가 옵션이면 위에 그림009 처럼 빈 페러미터 블락으로도 VPC 가 생성되어야 하나 그림009처럼 Cidr Block 이나 IPAM이 없으면 400에러가 나오면서 생성되지 않습니다. 공식문서가 고쳐져야 될듯 합니다.
azure
그림010

위에 그림은 azurerm_subnet | Resources | hashicorp/azurerm | Terraform Registry

Azure 테라폼 공식 문서의 서브넷에 대한 레지스트 입니다. 4개의 required 가 있으며 4개가 지정되지 않으면 생성이 안됩니다.
azure
그림011

그림011 처럼 왼쪽 Azure는 가상네트워크에 4개의 변수가 있어야 생성이 되며 AWS는 Cidr 만 있으면 생성이됩니다. 그리고 서브넷의 경우는 Count 함수가 있는데 이 Count 함수는 length 길이 만큼 반복되는데 이 반복변수는 Azure는 서브넷 의 겟수만큼 반복되며 AWS는 Zone의 갯수만큼 반복이 됩니다. 이 이유는 위에서 설명한 것과 같은 이유입니다
azure
그림012

풀 코드

왼쪽 Azure Terraform 코드

https://luffystoragekorea001.blob.core.windows.net/azurevsazure/terraform/azure/main.tf

오른쪽 AWS Terraform 코드 

https://luffystoragekorea001.blob.core.windows.net/azurevsazure/terraform/aws/main.tf
azure
그림013

그림 013은 Azure 테라폼 결과 이며 Azure 포털에서 확인 할수 있습니다 서브넷에 이름이 필수로 설정해서 잘 표현되 있는 것을 볼 수 있습니다
azure
그림014

그림 014는 AWS 테라폼 결과이며 AWS 콘솔에서 확인 할 수 있습니다. 서브넷 이름이 필수가 아니므로 이름 없는 서브넷이 생성되어 있습니다. 테라폼에서 Tag 이름을 넣으면 이름을 설정할수 가 있으며 이는 AWS의 초기 부터 이름없이 리소스 생성이 가능한 AWS 만의 특별한 점입니다. 개인적으로는 이름이 없이 생성되는 것은 관리 측면에서 맞지 않는다고 생각 하고 있으며 네이밍 컨벤션에 맞춰서 만드는 것이 기본이라 생각하고 있습니다. 

 

이 코드는 예시이며 AWS와 Azure 차이점을 극명하게 보여 준다고 생각하고 있습니다. 가까이 보면 차이가 많지만 멀리보면 같은 기술입니다. 방법의 차이라고 할수 있습니다. 사실 세계관의 차이 입니다. Azure 와 AWS 가 어떤 기술이 장점이고 단점이있다고 판단하는 것은 이제 큰 의미가 없습니다. 마치 벤츠와 BMW 의 차이 입니다. 

테라폼을 예시로 Azure 와 AWS을 비교해 보았습니다.