AzureにUbuntuのポート転送サーバ構築

AzureにLINUX(Ubuntu)のポート転送サーバを構築します。
Azure Automation(Runbook)でUbuntuの仮想マシンを作成し、ポート転送設定までを自動化します。
必要な時だけ仮想マシンを生成し、使い終わったら削除する形態とすることで、使用しない時は利用料のかからないようにするということです。
作成する仮想マシンは、インスタンスタイプ「B1s」(1core 1GiB)、ディスク「32GiB」のHDDとします。
ミニマム構成としましたので、課金は数円/時間程度だと思います。

構築用のRunbook

例として、ポート80番で受けたHTTP通信を別のWEBサーバへ転送します。
管理者のパスワードはランダムな英大小文字、数字としていますが、あくまでも必要な時だけ稼働する踏み台ということでサーバにログインできなくても問題ありません。
設定内容は再起動すると消えてしまいますが、インスタンスの新規構築、削除という運用としています。

# ポート転送用VM作成
#
try
{
    Write-Output "Logging in to Azure..."
    $null = Connect-AzAccount -Identity
}
catch {
    Write-Error -Message $_.Exception
    throw $_.Exception
}

# 管理者ユーザ、パスワード(自動生成)
$AdminUsername = "LocalAdminUser"
$AdminPassword = -join((65..90 | Get-Random -Count 4) + `
    (97..122 | Get-Random -Count 4) + `
    (48..57 | Get-Random -Count 4) `
    | Get-Random -Count 12 | ForEach-Object {[char]$_})

# リソース配置
$ResourceGroupName = "(リソースグループ名)"
$Location = "Japan East"

# 仮想マシン名、サイズ
$VMName = "(サーバ名)"
$VMSize = "Standard_B1s"

# 仮想ネットワーク、サブネット名
$VNetName = "(VNet名)"
$SubnetName = "(サブネット名)"

Write-Output "仮想マシン($VMName)の作成"
# NetworkInterface作成
$Vnet = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName
$subnet = Get-AzVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $Vnet
$NIC = New-AzNetworkInterface -Name "${VMName}-nic" `
    -ResourceGroupName $ResourceGroupName `
    -Location $Location `
    -SubnetId $subnet.Id

# Credential作成
$pass = ConvertTo-SecureString -String $AdminPassword -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($AdminUsername, $pass);

# VirtualMachine準備
$vmConfig = New-AzVMConfig -VMName $VMName `
    -VMSize $VMSize
$vmConfig = Set-AzVMOSDisk -VM $vmConfig `
    -Name "${VMName}-OsDisk" `
    -StorageAccountType "Standard_LRS" `
    -CreateOption FromImage `
    -DiskSizeInGB 32
$vmConfig = Set-AzVMSourceImage -VM $vmConfig `
    -PublisherName "Canonical" `
    -Offer "0001-com-ubuntu-server-jammy" `
    -Skus "22_04-lts-gen2" `
    -Version latest
$vmConfig = Add-AzVMNetworkInterface -VM $vmConfig `
    -Id $NIC.Id
$vmConfig = Set-AzVMOperatingSystem -VM $vmConfig `
    -Linux `
    -ComputerName $VMName `
    -Credential $Credential
$vmConfig.DiagnosticsProfile = New-Object Microsoft.Azure.Management.Compute.Models.DiagnosticsProfile
$vmConfig.DiagnosticsProfile.BootDiagnostics = New-Object Microsoft.Azure.Management.Compute.Models.BootDiagnostics
$vmConfig.DiagnosticsProfile.BootDiagnostics.Enabled = $true

# VirtualMachine作成
Write-Output "Create Virtual Machine"
New-AzVM -VM $vmConfig  `
    -ResourceGroupName $ResourceGroupName `
    -Location $Location `
    -WarningAction Ignore

# ポート転送
$script = @'
#!/bin/bash
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination (転送先IPアドレス):80
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
'@

# スクリプトをVMに送信して実行
Invoke-AzVMRunCommand -ResourceGroupName $ResourceGroupName `
    -VMName $VMName `
    -CommandId 'RunShellScript' `
    -ScriptString $script

# 終了
Write-Output "Generated Password: $AdminPassword"

削除用のRunbook

使用が終わったら速やかにリソースを削除します。
仮想マシン、ディスク、NICを削除します。
順番に削除していくだけです。

try
{
    "Logging in to Azure..."
    Connect-AzAccount -Identity
}
catch {
    Write-Error -Message $_.Exception
    throw $_.Exception
}

$ResourceGroupName = "(リソースグループ名)"
$VMName = "(サーバ名)"
$vm = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
If ($vm) {
    Write-Output "Remove Virtual machine, Disk, NIC"
    Remove-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
    Remove-AzDisk -ResourceGroupName $ResourceGroupName -DiskName $vm.StorageProfile.OsDisk.Name -Force
    Remove-AzNetworkInterface -ResourceGroupName $ResourceGroupName -Name $vm.NetworkProfile.NetworkInterfaces[0].Id.Split('/')[-1] -Force
}

コメント