fullmoon's bright IT blog

[T101] Terraform study - Azure로 알아보는 간단한 테라폼 배포하기 (1) - 기본 개념, 리소스그룹, 스토리지계정 만들기 본문

Cloud/Azure

[T101] Terraform study - Azure로 알아보는 간단한 테라폼 배포하기 (1) - 기본 개념, 리소스그룹, 스토리지계정 만들기

휘영청 2022. 11. 13. 00:31
728x90

안녕하세요 휘영청입니다.

이번에 가시다님 스터디를 하면서 테라폼을 정리해볼까 합니다 :)

워낙 많은 분들이 좋은 글을 써주셔서 저는 Azure로 테라폼 리소스 배포를 정리해볼까합니다!


테라폼 개요

  1. Hashicorp가 개발한 오픈 소스 툴
  2. Infra를 자동화하고 관리
  3. 코드를 정의하기 위해 선언적 언어를 사용
  4. 사내 환경에서 인프라스트럭처를 프로비저닝하거나 여러 클라우드 환경 자체에서도 인프라 구축이 가능

 

왜 테라폼을 도입하는지?

애플리케이션을 개발하는 개발자를 보유하고 있고 이 개발자들이 애플리케이션을 도입하는 과정에서 애플리케이션을 호스팅하려면 서버가 필요합니다. 많은 사용자들이 현재는 클라우드를 채택하고 있습니다.

이 과정에서 Deploy > Configure 과정으로 인프라를 배포하게 되는데 개선과정이 필요한 부분이 있습니다.

예를 들면 AutoScaling이나 High Availabilty 등의 여러 조건이요. 또한 새로운 기능을 도입하다 보면 배포되어있는 어플리케이션의 변경 사항을 고려해야합니다.

만약 프로덕션 기반 환경에서 인프라를 관리할 뿐만 아니라 테스트 환경에서'도' 인프라를 관리해야 한다면?

물론 이미 실제로 클라우드를 도입하고 있기 때문에 일반적으로 테스트 환경에서 사용할 수 있죠. 온프레미스 환경보다는 빠르게 테스트 해볼 수 있고 자원의 제한도 없습니다.

 테라폼이 편한 이유는?

 

여기서 테라폼을 적용하기 전에 이미 만든 환경에서는 테스트가 완료된 후에는 애플리케이션 서버를 설치할 필요가 없을 수 있지만 일일히 배포를 해보기 때문에 시간과 비용이 많이 듭니다.

실제로 테라폼을 적용하여 비용 절감에 도움이 되고 쉽게 배포하고자 하는 테스트 환경을 다시 만드는 것이 가능하기 때문입니다.

결론 : 관리, 배포, 재사용이 편하다

 

 

Workflow

https://developer.hashicorp.com/terraform/tutorials/aws-get-started/infrastructure-as-code?in=terraform%2Faws-get-started

Terraform은 워크플로우를 거쳐서 생성됩니다.

configuration file 은 JSON 이나 HCL으로 작성될 수 있습니다.

Argument는 특정 이름에 값을 할당하고 Block은 배포하고자하는 인프라입니다.

1) Terraform init : Terraform configuration file을 포함하고 있는 working directory를 생성합니다. 

  • 지정한 backend에 상태 저장을 위한 .tfstate 파일을 생성합니다. 여기에는 가장 마지막에 적용한 테라폼 내역이 저장됩니다.
  • init 작업을 완료하면, local에는 .tfstate에 정의된 내용을 담은 .terraform 파일이 생성됩니다.

2) Terraform plan : 정의한 코드가 어떤 인프라를 만들게 되는지 미리 예측 결과를 보여줍니다. 단, plan을 한 내용에 에러가 없다고 하더라도, 실제 적용되었을 때는 에러가 발생할 수 있다는 점! configuration file에 기초하여 실행됩니다. 이건 상태파일도 가지고 있습니다.

상태파일?  TerraForm 구성 파일을 여러 번 실행할 수 없기 때문에 여러 번 실행하게 된다면 TerraForm이 이미 존재하는 경우 동일한 리소스를 계속 생성하지 않도록 해야 합니다. 따라서 현재 환경의 상태를 파악하여 상태 파일을 유지 관리합니다.

3) Terraform apply :  실제로 Terraform plan에서 적용한 값을 적용하여 배포합니다. 여기서 오류가 생길 수도 있습니다.(무한 트러블 슈..ㅅ)

4) Terraform destory :  configuration file에서 만들어졌던 인프라를 삭제합니다.


Azure resource depoly : Resource group, Azure Storage Account

Provider

TerraForm 구성 파일에서 가장 먼저 지정하는 것은 Provider 정보입니다.

항상 업데이트가 되고 있으니까 종종 확인해주세요!/

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "3.31.0"
    }
  }
}

provider "azurerm" {
  # Configuration options
}

 

Terraform configuration file을 먼저 알고 갑시다.

이것은 테라폼으로 어떻게 infrastructure를 manage할 수 있으냐를 말할 수 있습니다!

1. Block

예시로 든 것처럼 이 resource block은 배포하고자하는 인프라를 나타냅니다.

resource "azurerm_resource_group" "hwi_grp" {
    name = "hwi_grp"
    location = "koreacentral"
  }

이 resource block은 resource type과 resource name을 포함하고 있습니다.

예를 든다면 

"azurerm_resource_group" "hwi_grp"을 보자면

resource type = azurerm_resource_group

resource name = hwi_grp인거죠.

2. Provider

Provider는  terraform 바이너리가 AWS나 Azure 등의 공급자를 대신해 API를 호출하여 리소스를 생성합니다.

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

👇🏻👇🏻👇🏻

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "3.31.0"
    }
  }
}

 

 


[실습1]  : Creating an Azure Resurce group 

[예시 도식표]

먼저 Azure resource group을 만들어보겠습니다. 

먼저 알고가야하는 리소스들을 간단히 정리해보자면

Azure AD(Azure Active Directory)는 액세스 관리 서비스입니다. 이 서비스 Azure Portal 및 기타 SaaS 애플리케이션과 같은 외부 리소스에 액세스할 수 있습니다. 여기에 user identity가 들어가는 것입니다. 여기서 구독(subscription)에서 Resource group들을 만들 수 있습니다. 저는 이미 Subscribtion을 완료했기 때문에 설정은 넘어갑니다.

먼저 이 부분 세팅을 하고 Resource group을 만듭니다!

Terraform configuration file을 만들어 apply를 하면 Terraform API가 Azure AD를 거쳐 Resource group을 생성하는 것입니다.그러므로 리소스를 생성할 때는 Subscription을 지정해주면 좋겠죠!

[Resource group]

리소스 그룹은 일반적으로 리소스의 논리적으로 나누는 그룹화에 사용됩니다. 

실제로 포탈에서 리소스 그룹을 만드는 방법은 리소스 그룹을 선택 후 추가를 누른 후에 

  • 구독: Azure 구독을 선택합니다.
  • 리소스 그룹: 새 리소스 그룹 이름을 입력합니다.
  • 지역: Azure 위치를 선택합니다(예: 미국 중부)
  • 원하는경우 태그를 생성합니다.

이렇게 클릭이 많은 리소스 그룹 만들기를 테라폼으로 한방에 가능합니다!

그렇지만 코드로 인프라를 자동화하거나 관리하려면
우선 Azure를 통해 수동으로 만들어보고 어떻게 동작하는 것인지 이해하는 것이 매우 중요합니다!

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group

링크를 참조하세요 !

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

이렇게 Arguments Reference 를 확인합니다. 여기서 저는 항상 이름을 어떻게 지정해야하는지 헷갈렸는데요.

name     = "example" 이 값이 리소스의 실제 이름입니다. 

실제로 적용해보자면, 이렇게 해볼 수 있습니다.

제가 배포한 main.tf의 내용입니다.

#프로바이더
terraform {
    required_providers {
      azurerm = {
        source = "hashicorp/azurerm"
        version = "3.29.1"
      }
    }
  }

#프로바이더지정및구독아이디   
provider "azurerm" {
  subscription_id = "bfa5d97b-bcb7-4de5-844e-7412348afdd2"
  features {}
}


#리소스그룹지정하기
resource "azurerm_resource_group" "hwi_grp" {
    name = "hwi_grp"
    location = "koreacentral"
  }

여러분도 간단하게 한번 실습해보세요!

 

[실습2] : Creating an Azure Storage Account

두 번 째로 Azure Storage Account에 대해 배포해보겠습니다.

Azure 스토리지 계정에는 blob, 파일 공유, 큐, 테이블, 디스크 등, 모든 Azure Storage 데이터 개체가 포함됩니다.

스토리지 계정은 HTTP 또는 HTTPS를 통해 전 세계 어디에서나 액세스할 수 있는 Azure Storage 데이터에 고유한 네임스페이스를 제공합니다.

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_account : 참고링크

[storage accout 개요]

https://learn.microsoft.com/ko-kr/azure/storage/common/storage-account-overview

 

Storage 계정 개요 - Azure Storage

Azure Storage의 다양한 스토리지 계정 유형에 대해 알아봅니다. 계정 이름, 성능 계층, 액세스 계층, 중복, 암호화, 엔드포인트 등을 살펴봅니다.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/azure/storage/common/storage-account-create?tabs=azure-portal

 

스토리지 계정 만들기 - Azure Storage

Blob, 파일, 큐, 테이블을 저장할 스토리지 계정을 만드는 방법에 대해 알아봅니다. Azure 스토리지 계정은 데이터를 읽고 쓰기 위해 Microsoft Azure에 고유한 네임스페이스를 제공합니다.

learn.microsoft.com

여기서 참고하면 storage accout 에서 들어가야하는 기본사항의 섹션은

subscription, Resource group, storage accout name 그리고 location

  • 성능 = account_tier
  • 중복성 구성 = account_replication_type 입니다. 이 부분만 필수적으로 들어가면 배포할 수 있습니다. 

이 부분만 확인하면 스토리지 계정을 생성할 수 있습니다. :)

저는 로컬로 선택하겠습니다. 독스에는 Geo Storage로 되어있네요. 실제로 참조한 내용이 표시됩니다.

account_replication_type 
(Required) Defines the type of replication to use for this storage account. Valid options are LRS, GRS, RAGRS, ZRS, GZRS and RAGZRS. Changing this forces a new resource to be created when types LRS, GRS and RAGRS are changed to ZRS, GZRS or RAGZRS and vice versa.

account_kind - (Optional) Defines the Kind of account. Valid options are BlobStorage, BlockBlobStorage, FileStorage, Storage and StorageV2. Changing this forces a new resource to be created. Defaults to StorageV2.
#실습1과 똑같은 구성외에 추가합니다.
#스토리어카운트
#스토리지 계정 서비스가 더 많은 속성을 가지고 있으므로 더 많은 arguements가 들어가요

resource "azurerm_storage_account" "storage_account" {
  name                     = "terraformstorhwi1234" #하나뿐인이름
  resource_group_name      = "hwi_grp"
  location                 = "koreacentral"
  account_tier             = "Standard"
  account_replication_type = "LRS"
  account_kind = "StorageV2"
}

*주의사항

  • 스토리지 계정의 이름을 지정할 때는 Storage 계정 이름은 3자에서 24자 사이여야 하고 숫자 및 소문자만 포함할 수 있습니다.
  • 추가로 스토리지 계정 이름은 Azure 내에서 고유해야 합니다.
  • 두 개의 스토리지 계정이 같은 이름을 사용할 수 없습니다.

짜잔

이렇게 간단히 테라폼을 훑어보고 리소스 그룹과 스토리지 계정을 만드는 방법을 소개했습니다.

다음 (2)편에는 추가적으로 네트워킹 부분도 해볼까합니다.

이상 중간과제 및 테라폼으로 애저 리소스 배포하기 블로그를 마칩니다.

728x90