본문 바로가기
INFRA/Operation

Terraform Script.sh 사용 설치 방법 - Azure

by BTC_지수 2022. 8. 4.

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

이번주는 Terraform을 사용하여 Azure에 인프라를 구축하고 Script.sh 파일을 사용하여 사용자 지정 스크립트 확장을 사용하는 방법을 소개해보도록 하겠습니다

 

그럼 시작하겠습니다~

 

Terraform 인프라 구성

코드를 사용하여 인프라를 구성하기 앞서 저는 "VScode"를 사용하여 Terraform을 구성하였습니다!

리소스구성은 "registry.terraform.io" 페이지를 통해서 구성하였습니다.

(참고 : https://registry.terraform.io/)

 

1. Azure 공급자 구성

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

 

아래와 같이 "main.tf" 파일을 통해 공급자를 구성하였습니다.

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

provider "azurerm" {
    features {}
}

버전은 다음 코드와 같이 3.0.0을 사용하였습니다.

 

 

2. 리소스 그룹 구성

리소스 그룹은 "rg.tf" 파일에 구성하여줍니다.

resource "azurerm_resource_group" "jisoo-rg" {
    name = "jisoo-rg"
    location = "korea central"
}

다음과 같이 "jisoo-rg" 이름으로 korea central에 리소스 그룹을 만들어줍니다.

 

3. Network Security Group(NSG) 구성

NSG 는 "nsg.tf" 파일에 구성해줍니다.

resource "azurerm_network_security_group" "jisoo-nsg" {
    name = "jisoo-nsg"
    location = azurerm_resource_group.jisoo-rg.location
    resource_group_name = azurerm_resource_group.jisoo-rg.name

#Port 22 허용
    security_rule {
        name = "rule-ssh"
        priority = 100
        direction = "Inbound"
        access = "Allow"
        protocol = "Tcp"
        source_port_range = "*"
        destination_port_range = "22"
        source_address_prefix = "*"
        destination_address_prefix = "*"
    }

#Port 80 허용
    security_rule {
        name = "rule-http"
        priority = 110
        direction = "Inbound"
        access = "Allow"
        protocol = "Tcp"
        source_port_range = "*"
        destination_port_range = "80"
        source_address_prefix = "*"
        destination_address_prefix = "*"
    }
}

다음과 같이 Port 22, Port 80 을 허용해주는 NSG를 구성해줍니다.

 

4. Virtual Network 구성

vnet.tf 파일에 구성해줍니다.

resource "azurerm_virtual_network" "jisoo-vnet" {
    name = "jisoo-vnet"
    location = azurerm_resource_group.jisoo-rg.location
    resource_group_name = azurerm_resource_group.jisoo-rg.name
    address_space = ["10.0.0.0/16"]
}

"10.0.0.0/16" 의 대역으로 vnet을 만들어주었습니다.

 

5. Subnet 구성

Subnet 부분은 vnet.tf 파일에 함께 구성하였습니다.

 

resource "azurerm_subnet" "jisoo-sub01" {
    name = "jisoo-sub01"
    resource_group_name = azurerm_resource_group.jisoo-rg.name
    virtual_network_name = azurerm_virtual_network.jisoo-vnet.name
    address_prefixes = ["10.0.1.0/24"]
}

"10.0.1.0/24" 주소로 Subnet 을 구성해 주었습니다.

 

6. Subnet, NSG Association 구성

: NSG를 Subnet에 저는 적용시켜주었는데요! 여기서 "azurerm_subnet_network_security_group_association" 리소스를 사용하여 구성해주었습니다. 이또한 vnet.tf 파일에 구성해주었습니다.

 

resource "azurerm_subnet_network_security_group_association" "jisoo-nsgass1" {
    subnet_id = azurerm_subnet.jisoo-sub01.id
    network_security_group_id = azurerm_network_security_group.jisoo-nsg.id
}

"Subnet id" 와 "nsg id"를 통해 연결시켜줍니다.

 

다음과 같이  vnet.tf 파일을 구성한것을 볼 수 있습니다.

 

7. Public ip 구성

VM에 사용할 Public ip을 "public_ip" 파일에 구성하여줍니다.

resource "azurerm_public_ip" "jisoo-pubip" {
    name = "jisoo-pubip"
    resource_group_name = azurerm_resource_group.jisoo-rg.name
    location = azurerm_resource_group.jisoo-rg.location
    allocation_method = "Static"
}

 

8. Network Interface 구성

네트워크 인터페이스는 "interface.tf" 파일에 구성하여줍니다.

resource "azurerm_network_interface" "jisoo-nic" {
    name = "jisoo-nic"
    location = azurerm_resource_group.jisoo-rg.location
    resource_group_name = azurerm_resource_group.jisoo-rg.name

    ip_configuration {
      name = "external"
      subnet_id = azurerm_subnet.jisoo-sub01.id
      private_ip_address_allocation = "Dynamic"
      public_ip_address_id = azurerm_public_ip.jisoo-pubip.id
    }
}

 

9. VM 구성

"vm.tf" 파일에 구성해줍니다.

resource "azurerm_virtual_machine" "jisoo-vm" {
    name = "jisoo-vm"
    location = azurerm_resource_group.jisoo-rg.location
    resource_group_name = azurerm_resource_group.jisoo-rg.name
    network_interface_ids = [azurerm_network_interface.jisoo-nic.id]
    vm_size = "Standard_D2s_v3"

# Centos 사용
    storage_image_reference {
      publisher = "openLogic"
      offer = "centOS"
      sku = "7.5"
      version = "latest"
    }

#disk 유형 : StandardSSD_LRS 사용
    storage_os_disk {
        name = "jsosdisk1"
        caching = "ReadWrite"
        create_option = "FromImage"
        managed_disk_type = "StandardSSD_LRS"
    }

#VM USER 정의
    os_profile {
        computer_name = "jisoo-computer"
        admin_username = "jisoo"
        admin_password = "gkwltnsmscjswo1!ha"
    }

    os_profile_linux_config {
      disable_password_authentication = false
    }
}

 

10. Script.sh 파일 구성

Script.sh 파일을 통해서 저는 VMApache 를 설치해보겠습니다.

install.sh 파일을 만들어서 다음과 같이 코드를 작성해줍니다.

#!/bin/bash
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd

 

11. 사용자 지정 스크립트 작성

"azurerm_virtual_machine_extension" 리소스를 사용하여 exten.tf 파일에 구성하여줍니다.

resource "azurerm_virtual_machine_extension" "jisoo-vmex" {
    name = "jisoo-vmex"
    virtual_machine_id = azurerm_virtual_machine.jisoo-vm.id
    publisher = "Microsoft.Azure.Extensions"
    type = "CustomScript"
    type_handler_version = "2.0"

    settings = <<SETTINGS
    {
        "script" : "${filebase64("install.sh")}"
    }
    SETTINGS
}

filebase64주어진 경로에서 파일의 내용을 읽고 base64로 인코딩된 문자열을 반환합니다.

저는 terraform apply 명령어를 해주는 파일의 위치에 install.sh 파일도 함께 만들었기에 경로를 그대로 install.sh 파일을 적어주었습니다.

 

(참고 : base64decode를 사용하면 스크립트파일을 인식하지 못하기에 filebase64를 사용하여 스크립트를 해석해줍니다.)

 

12. 결과

 

: az cli를 다운로드하여 "azure에 login"을 해주고, "terraform init", "terraform apply"를 통해 구축하여 줍니다.

(terraform apply 를 시키기전에 terraform plan 을 통해서 잘못 구성한게 없는지 확인하는것을 추천합니다!)

참고로, 저는 "terraform apply --auto-approve"를 통해서 만드는것을 모두 허용하여 만들어주었습니다.

 

*** 중요 : terraform 파일 구성한 경로에서 명령어를 실행시켜야하는걸 잊지마세요!!

다음과 같이 9개의 리소스가 성공한것을 볼 수 있습니다!

 

Azure Portal 에 들어가서 resource group을 확인해보면 생성된것을 확인하실 수 있습니다.

 

그리고 해당 가상머신의 Public ip를 통해 들어가보면 Apache가 정상적으로 설치된것을 확인하실 수 있습니다.

 

 

마지막으로 "terraform destroy" 로 잊지말고 리소스를 다 삭제해주세요~!

 

오늘은 Script.sh 파일을 통해 사용자 지정 스크립트를 작성해보았는데요!

다음시간에는 AWS 환경에서 Script.sh 파일을 사용해보도록 하겠습니다. 오늘내용도 많은 도움이 되기를 바라며! 여기서 마치도록 하겠습니다.

댓글