본문 바로가기
INFRA/Operation

Terraform 리소스에 대한 이해 - Azure 1편

by BTC_지수 2022. 8. 21.

안녕하세요! 하씨가문의 영광입니다

 

이번에는 이제까지 Terraform 으로 구축한 내용만 다루어보았는데요

이번에는 그속을 세세하게 파헤쳐보도록 하겠습니다.

 

그럼 시작해보도록 하겠습니다! 고고

 

Azure 공급자

 

저희가 Azure 테라폼을 구축하기에 앞서 제일 먼저 하는 첫 순서가 "Azure 공급자"에 대한 구성입니다.

 

Azure 공급자는 Azure Resource Manager API를 사용하여 Microsoft Azure에서 인프라를 구성하는 데 사용할 수 있습니다.

 

Azure에 인증

Terraform은 Azure에 인증하기 위한 다양한 방법을 지원합니다.

 

  • Azure CLI를 사용하여 Azure에 인증
  • 관리형 서비스 ID를 사용하여 Azure에 인증
  • 서비스 주체 및 클라이언트 인증서를 사용하여 Azure에 인증
  • 서비스 주체 및 클라이언트 암호를 사용하여 Azure에 인증
  • OpenID Connect를 사용하여 Azure에 인증

저는 주로 "Azure CLI를 사용하여 Azure에 인증" 하는 방법으로 많이 사용하고 있습니다. (제일 간편하더라구요!)

 

Terraform을 비대화형으로 실행할 때(예: CI 서버에서 Terraform을 실행할 때) 서비스 주체 또는 관리 서비스 ID를 사용하고 Terraform을 로컬로 실행할 때 Azure CLI를 사용하여 인증하는 것이 좋습니다.

 

사용 예시
# Azure 제공 소스 & 사용되는 버전
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=3.0.0"
    }
  }
}

# Azure 제공자 구성
provider "azurerm" {
  features {}
}

위와 같이 Azure 제공 Source는 하쉬코프이고 버전은 3.0.0 임을 나타내줍니다.

 

제공자 구성을 조금더 자세히 살펴보도록 하겠습니다.

 

  • features : 필수! 로 사용되야하는 인수이며 특정 Azure 공급자 리소스의 동작을 사용자 지정하는 데 사용할 수 있는 정의된 블록입니다.

간단하게 features 블록에 사용되는 인수를 살펴보도록 하겠습니다. 모두 선택 사항이므로 필요하실때에 사용하면 되는 인수들 입니다.

 

  • client_id : 사용해야 하는 클라이언트 ID 입니다. 이것은 ARM _CLIENT_ID 환경 변수에서도 얻을 수 있습니다.
  • environment : 사용해야 하는 클라우드 환경입니다. 가능한 값은 public, usgoverment, german 및 china 입니다. 기본값은 public입니다. 이것은 ARM_ENVIRONMENT 환경 변수에서도 얻을 수 있습니다.
  • subscription_id : 사용해야 하는 구독 ID 입니다. 이것은 ARM_SUBSCRIPTION_ID 환경 변수에서도 얻을 수 있습니다.
  • tenant_id : 테넌트 ID를 사용해야 합니다. 이것은 ARM_TENANT_ID 환경 변수에서도 얻을 수 있습니다.
  • auxiliary_tenant_ids : 다중 테넌시 및 교차 테넌트 시나리오에 필요한 보조 테넌트 ID 목록입니다. 이것은 ARM_AUXILIARY_TENANT_IDS 환경 변수에서도 얻을 수 있습니다.

여기까지 간단하게 Azure 공급자에 대해서 세세하게 파헤져 보았습니다! 이제는 Azure의 배포의 시작인 Azure Resource Group을 한번 살펴보겠습니다.

 

Azure Resource Group

 

resource "azurerm_resource_group" "example" {
  name     = "example"
  location = "West Europe"
}

azurerm_resource_group 블록에서 사용되는 인수는 다음과 같습니다.

 

  • name : 필수! 로 생성해야하는 인수입니다. 이 리소스 그룹에 사용해야 하는 이름입니다. 이를 변경하면 새 리소스 그룹이 생성됩니다.

여기서 중요한점은 resource "azurerm_resource_group" "example" 에서 example이 이 리소스의 이름이 아님을 아셔야합니다. example terraform을 사용하여 resource group을 만들때 사용하는 이름이고 이 블록 안에서 사용하는 name은 실제 Azure Portal안에서 배포될때 사용되는 resource group의 이름입니다. 다른 자원들도 동일하니 주의 하셔야합니다.

 

  • location : (필수!) 이 리소스 그룹이 있어야 하는 Azure 지역입니다. 예를 들면, Korea Central에 생성하는것을 의미합니다. 이를 변경하면 마찬가지로 새 리소스 그룹이 생성됩니다.
  • tags 선택사항 입니다. 리소스 그룹에 할당해야 하는 태그 매핑을 의미합니다.

 

 

NSG

 

네트워크 보안 규칙 목록이 포함된 네트워크 보안 그룹을 관리합니다. 네트워크 보안 그룹을 사용하면 인바운드 또는 아웃바운드 트래픽을 활성화하거나 거부할 수 있습니다.

 

resource "azurerm_network_security_group" "example" {
  name                = "acceptanceTestSecurityGroup1"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  security_rule {
    name                       = "test123"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
  }

  tags = {
    environment = "Production"
  }
}

 

"azurerm_network_security_group" 블록에서 사용되는 인수들은 다음과 같습니다.

 

  • name : (필수!) 네트워크 보안 그룹의 이름을 지정합니다. 이를 변경하면 새 리소스가 생성됩니다.
  • resource_group_name : (필수!) 네트워크 보안 그룹을 생성할 리소스 그룹의 이름 입니다.
  • location : (필수!) 리소스가 있는 지원되는 Azure 위치를 지정합니다. 이를 변경하면 새 리소스가 생성됩니다.
  • security_rule : (선택 사항) 정의된 보안 규칙을 정의하고할때 사용하는 블록입니다. 열고 닫고 하는 포트에 대한 것을 나타내줍니다.

 

security_rule 블록에서 사용되는 인수는 다음과 같습니다. 여기서는 필수로 적어야하는 사항과 선택에 따른 사항을 따로 구분하여 적도록 하겠습니다.

 

필수사항
  • name : 보안 규칙의 이름입니다.
  • protocol : 이 규칙이 적용되는 네트워크 프로토콜입니다. 가능한 값으로는 Tcp, Udp, Icmp, Esp, Ah, * 이 가능합니다. 
  • access : 네트워크 트래픽의 허용 여부를 지정합니다. 가능한 값은 Allow 및 Deny 입니다.
  • priority : 규칙의 우선 순위를 지정합니다. 100에서 4096 사이일 수 있습니다. 우선 순위 번호는 컬렉션의 각 규칙에 대해 고유해야 합니다. 우선 순위 번호가 낮을수록 우선 순위가 높아집니다.
  • direction : 방향은 들어오는 트래픽 또는 나가는 트래픽에 대해 규칙을 평가할지 여부를 지정합니다. 가능한 값은 Inbound 및 Outbound 입니다.

 

선택사항
  • description : 이 규칙에 대한 설명입니다. 140자로 제한됩니다.
  • source_port_range : 소스 포트 또는 범위 뜻합니다. 0 ~ 65535 사이 숫자 또는 범위 또는 * 중에 기재하시면됩니다.( * 는 모두를 뜻합니다.) 
  • destination_port_range : 대상 포트 또는 범위를 뜻합니다. 마찬가지로 0 ~ 65535 사이의 숫자 또는 범위 또는 * 를 지정해주시면됩니다. 
  • source_address_prefix : CIDR 또는 소스 IP 범위 또는 모든 IP를 뜻하는 ' * '을 사용할 수 있으며, 'VirtualNetwork', 'AzureLoadBalancer' 및 'Internet'과 같은 태그도 사용할 수 있습니다.
  • destination_address_prefix : 대상 주소 접두사 목록입니다. 태그를 사용 할 수 없습니다.

 

저는 NSG를 구성하실때에 지금까지 설명해놓은 필수사항, 선택사항 구분없이 다 지정하여 기재하시는걸 더 추천드립니다. 그렇게 해야 더 확실하게 나중에 코드를 볼때에도 제가 어떤것을 열어두었고 닫아두었는지를 한눈에 구분할 수 있습니다. 

 

오늘은 지금까지 Terraform으로 구성한것을 더 세분화하여 알아보았습니다. 

다음주에도 마저 이어서 Azure 리소스에 대해서 더 자세히 파헤쳐보도록 하겠습니다.

 

그럼 담주에 또만나요~

 

 

댓글