안녕하세요! 하씨가문의 영광입니다!
이번주는 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 파일을 통해서 저는 VM에 Apache 를 설치해보겠습니다.
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 파일을 사용해보도록 하겠습니다. 오늘내용도 많은 도움이 되기를 바라며! 여기서 마치도록 하겠습니다.
'INFRA > Operation' 카테고리의 다른 글
쿠버네티스 이론 STEP4 Service (2) LB, ExternalName (0) | 2022.08.05 |
---|---|
쿠버네티스 STEP3 Service, NodePort, ClusterIP (0) | 2022.08.05 |
Terraform & Ansible 연동 효과 (0) | 2022.07.26 |
앤서블 아키텍처 구성 및 프로세스 (0) | 2022.07.21 |
쿠버네티스 STEP2 Pod & Deployment (0) | 2022.07.20 |
댓글