1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

タイトルの通りBicepとTerraformでAzureのVMをデプロイしてみたメモになります。
2つの違いについては簡単にはまとめていますが、詳細については記載をしておりません。
IaC初心者が試しに触ってみた記事になりますのでご承知おき頂ければと思います。

事前準備

環境の準備やチュートリアルがMicrosoft公式から出ていますので、そちらを参考に実施しました。

自身のローカル端末にて環境を用意する場合以下のインストールが必要となります。(Visual Studio Code利用前提)
・Visual Studio Codeのインストール
・Azure CLI
・Visual Studio CodeのBicep拡張機能インストール
・Terraformのインストール
・Visual Studio CodeのTerraform拡張機能インストール 

Bicep事前準備

Terraform事前準備

Bicepファイルの作成とデプロイ

事前準備が完了したら、まずはBicepでVMをデプロイしてみます。
Bicepファイルの作成方法や構文などについては公式リンクを記載します。

今回は以下のようなBicepファイルを用意します。

Bicepファイルの作成

@description('リージョンの指定')
param location string = resourceGroup().location

@description('VMの名前')
param vmName string = 'myWinVM'

@description('管理者ユーザー名')
param adminUsername string

@description('管理者パスワード')
@secure()
param adminPassword string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: 'myVNet'
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: 'mySubnet'
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
    ]
  }
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2021-05-01' = {
  name: 'myNIC'
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          subnet: {
            id: virtualNetwork.properties.subnets[0].id
          }
          privateIPAllocationMethod: 'Dynamic'
        }
      }
    ]
  }
}

resource virtualMachine 'Microsoft.Compute/virtualMachines@2021-11-01' = {
  name: vmName
  location: location
  properties: {
    hardwareProfile: {
      vmSize: 'Standard_D2s_v3'
    }
    osProfile: {
      computerName: vmName
      adminUsername: adminUsername
      adminPassword: adminPassword
    }
    storageProfile: {
      imageReference: {
        publisher: 'MicrosoftWindowsServer'
        offer: 'WindowsServer'
        sku: '2019-Datacenter'
        version: 'latest'
      }
      osDisk: {
        createOption: 'FromImage'
        managedDisk: {
          storageAccountType: 'Premium_LRS'
        }
      }
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterface.id
        }
      ]
    }
  }
}

このBicepファイルでは以下のリソースを作成します

  • 仮想ネットワーク
  • ネットワークインターフェース
  • 仮想マシン

Bicepファイルのデプロイ

デプロイ手順:
1 Azure CLIをインストールし、ログインします

az login

2 リソースグループを作成します(作成済みの場合は省略可)

az group create --name myResourceGroup --location eastus

3 Bicepファイルをデプロイします

az deployment group create --resource-group myResourceGroup --template-file main.bicep --parameters adminUsername=azureuser adminPassword=YourSecurePassword123!

ポータルを確認するとBicep上で指定したリソースが作成できました。
image.png

Terraform作成とデプロイ

次にTerraformファイルを作成します。
内容は上記のBicepと同様にします。

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "terraformTest"
  location = "japaneast"
  tags = {
    Name = "Naoto_Minagawa"
  }
}

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

resource "azurerm_subnet" "subnet" {
  name                 = "mySubnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.0.0/24"]
}

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

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_windows_virtual_machine" "vm" {
  name                = "myWinVM"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_D2s_v3"
  admin_username      = var.admin_username
  admin_password      = var.admin_password
  network_interface_ids = [
    azurerm_network_interface.nic.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Premium_LRS"
  }

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2019-Datacenter"
    version   = "latest"
  }
}

variable "admin_username" {
  description = "管理者ユーザー名"
  type        = string
}

variable "admin_password" {
  description = "管理者パスワード"
  type        = string
  sensitive   = true
}

上記Terraformファイルでは先に作成したBicepファイル同様に以下のリソースを作成します

  • 仮想ネットワーク
  • ネットワークインターフェース
  • 仮想マシン

Terraformファイルのデプロイ

デプロイ手順:
1 Azure CLIをインストールし、ログインします

az login

2 Terraformの初期化を実施します

terraform init

3 Terraformのplanを確認します

terraform plan

Terraformを初めて触ったのですが、このplanコマンド実施後にAzure上でどういったリソースが作成されるかをコマンドライン上でリストアップしてくれます。
Bicepではそういったリソースリストアップはなさそうでした。

image.png

image.png

4 リソースをデプロイします

terraform apply

作成確認のメッセージが表示されるため「yes」と入力します。
image.png

ポータルを確認するとBicep同様にterraformで定義したリソースが作成されていました。
image.png

デプロイ後の比較

実際に2つを試してみてそれぞれの特徴やメリットデメリットを以下に簡単にまとめてみました。

Bicep

特徴

  • Microsoft Azureに特化したIaCツール
  • Azure Resource Managerテンプレートをより簡潔に記述可能
  • Azureリソースのデプロイに最適化

メリット

  • Azure固有の機能との高い互換性
  • ARM JSONテンプレートとの相互変換が可能

デメリット

  • Azure以外のクラウドプロバイダーには使用できない
  • コミュニティとエコシステムがTerraformほど成熟していない
  • State管理ができない(Azure Resource Manager (ARM) が状態を管理)

Terraform

特徴

  • マルチクラウド対応のIaCツール
  • HCL(HashiCorp Configuration Language)を使用
  • 幅広いプロバイダーとリソースタイプをサポート

メリット

  • クラウドプロバイダー間での移植性が高い
  • 大規模で成熟したコミュニティとエコシステム
  • 多様なユースケースと豊富な機能

デメリット

  • Azure固有の最新機能のサポートが遅れる場合がある
  • 状態管理の複雑さ

選択基準

  • Azure専用の場合はBicepが適している(最新のリソースも対応する可能性が高い)
  • マルチクラウド環境ではTerraformが優位
  • チームの既存のスキルセットとプロジェクトの要件を考慮

おわりに

今回ははじめて2つを比較しながら触ってみましたが、どちらもメリット/デメリットがあるため絶対にこちらのほうがおすすめできるといった感触は得られませんでした。
上記のメリット/デメリットを比較しながら、その時の要件やどちらが会社やチームに合うかを考慮しながら採用を決めたほうが良さそうです。

個人的にはTerraformの構文の方が可読性高く分かりやすい印象があったのと、ネット上での事例が豊富なため完全にゼロベースであればTerraformの方が手が出しやすい印象でした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?